RF-004 — Bloques comerciales para el armado de páginas
Requisito
Permitir al editor componer una página combinando piezas comerciales —un banner, un carrusel y
una cuadrícula de productos— sin intervención técnica; y describir la cuadrícula como una consulta
de catálogo parametrizable (tipo de filtro, valor, cantidad por página y orden) que resuelve el
storefront, sin que el CMS consulte productos.
Solución adoptada
Declarar tres bloques propios disponibles en el layout de las páginas, definidos como esquema y
tipos, sin componente React en este repositorio: el render corresponde al storefront. Los dos
primeros no definen contenido propio, sino que referencian entidades reutilizables.
flowchart TB
PG[Página · layout] --> H[hero]
PG --> HS[heroSlider]
PG --> P[productGrid]
H -->|relación requerida| B[(banners)]
HS -->|relación requerida| S[(sliders)]
P --> D[Descriptor de consulta<br/>filterType · filterValue · itemsPerPage · sortBy]
D -.resuelto por el storefront.-> ALG[(Algolia)]
PG -.esquema + tipos.-> SF([Storefront · render])
Bloques
| Bloque |
Nombre en el panel |
Contenido |
Tipo exportado |
hero |
Banner |
Relación requerida a banners; cuatro campos heredados ocultos |
HeroBlock |
heroSlider |
Slider |
Relación requerida a sliders |
sin interfaceName |
productGrid |
Cuadrícula de Productos |
Descriptor de consulta de catálogo |
ProductGridBlock |
Descriptor de la cuadrícula
| Campo |
Regla |
titulo |
Productos Destacados por defecto |
filterType |
tag por defecto; admite categoría, etiqueta, colección o personalizado (index) |
filterValue |
Valor buscado; admite varios separados por coma |
itemsPerPage |
12 por defecto, entre 1 y 100 |
sortBy |
relevance por defecto; precio ascendente o descendente, fecha de alta descendente, nombre ascendente o descendente |
tagDeBusqueda |
[OBSOLETO] — visible solo si la fila ya tenía valor |
filterQuery |
[Obsoleto] — oculto |
Reglas de negocio
- Separar contenido de presentación: el CMS define qué mostrar; el storefront decide cómo.
- Referenciar entidades en lugar de duplicar contenido, de modo que la pieza se edite en un solo
lugar.
- No consultar el catálogo desde el CMS: la cuadrícula persiste un descriptor, nunca un resultado.
- Exigir la relación en los bloques
hero y heroSlider: una página no puede quedar con un
bloque vacío.
- Conservar ocultos los campos superados del bloque
hero, por compatibilidad con las páginas
cargadas antes de que pasara a referenciar la colección.
Criterios de aceptación
| # |
Criterio |
| 1 |
Componer una página con los tres bloques y recuperarla por API con sus relaciones resueltas |
| 2 |
Rechazar la publicación de un bloque hero o heroSlider sin entidad referenciada |
| 3 |
Modificar el banner referenciado y ver el cambio en la página sin editarla |
| 4 |
Configurar una cuadrícula por etiqueta, con orden y cantidad por página, y recibir el descriptor íntegro en la respuesta |
Limitaciones conocidas
heroSlider no declara interfaceName: su tipo queda embebido en Page['layout'] dentro de
payload-types.ts y el storefront no puede importarlo por nombre. Es una línea de
configuración.
- Los cuatro campos heredados de
hero están ocultos sin la etiqueta [Obsoleto] que sí llevan
los demás campos superados del repositorio.
- El valor del filtro personalizado difiere del usado en el menú de navegación — ver
RF-005.