Grade de produtos com blocos de catálogo
Quero que o lojista monte o card do produto no editor (imagem, título, descrição, preço, botão) e que cada produto da grade use a mesma composição. Remover um bloco remove aquele elemento de todos os cards.Referência de implementação: tema de exemplo com seção
main + blocos catalog-product-* + lib/renderCatalogProductBlocks.jsx.
Índice: Cookbooks
Runtime Corvex, não motor interno
Grade com blocos nos cards é um caso de uso suportado de ponta a ponta: o lojista edita blocos na section; cada produto repete o mesmo molde; preview no builder e vitrine publicada batem. No código do tema você usa@corvex/runtime e @corvex/theme-sdk. O editor entrega o molde em blocks e block_order. O tema não importa o motor do editor.
Ferramentas usuais para este cookbook:
Quando usar este padrão
Três camadas (não misture)
Contratos utilizados
- Section —
blocks.json, propsblocks/block_order - Block —
settings; sem fetch de catálogo - Product — campos públicos no card
- Runtime API —
useSectionBlockTemplate,RepeatedBlockCard,useEditorPreviewCanvas,BlockChrome - Theme defaults —
templates/*.jsoncomblocks+block_order
Anatomia recomendada no tema
catalog-product-* em theme.json → blocks[].
1. blocks.json da section
Um tipo por “fatia” do card. max_blocks = quantidade de tipos distintos (não repita o mesmo tipo várias vezes no manifest se cada fatia é única).
blocks/{id}/schema.json → name, não deste arquivo.
O build anexa o manifest no componente da section. Não importe blocks.json no JSX.
2. Block — receber produto sem fetch
- O tipo é o id da pasta (
blocks/catalog-product-title/). Seschema.jsontivertype, use o mesmo id. O validador não exigetype. nameno schema é o rótulo do bloco no editor. Pode mudar. Não mude a pasta depois que a página já existe.
3. Section — loop + render repetido
- Vitrine:
renderCatalogProductBlocks(ou equivalente) em cada produto — mesmablock_order. - Builder: use
RepeatedBlockCardcomeditorHostno primeiro card (ou no lugar vazio, se não houver produtos) erenderMirrornos demais. Não monte os cards à mão a partir deblocksno iframe. - Molde ao vivo:
useSectionBlockTemplate(blocks, block_order)devolveblockseblock_orderatualizados no builder. - Persistência:
blockseblock_ordernos props da section (template e publicação). O editor atualiza esses props ao editar, reordenar e remover itens.
@corvex/runtime.
4. renderCatalogProductBlocks
Mapa explícito type → componente; itere block_order, nunca Object.keys sem ordem.
resolveCatalogBlocks pode definir defaults quando blocks está vazio (primeira instalação).
5. Persistência e templates
Checklist de template: se
order inclui "main", a chave sections.main deve existir com blocks + block_order. Referência: templates/search.json no tema de exemplo.
6. O que fazer / o que não fazer
Faça
- Um block por fatia do card. O tipo é a pasta (
catalog-product-title).schema.type, se existir, repete esse id. - Provider de produto por item da grade (
CatalogProductProvider). block_ordercomo fonte de ordem na vitrine e no editor.useSectionBlockTemplate+RepeatedBlockCard(ou composição equivalente comuseSectionLiveBlocks+SectionBlockCanvasse o layout exigir).- Defaults completos no template para a seção aparecer correta ao adicionar na página.
Não faça
- Usar snippet
product-cardna mesma seção e esperar que blocos do editor alterem o snippet. - Assumir que
product-list(carrossel com snippet) compartilha blocos commain. - Fetch de produtos dentro do block (
storefront.products.getno block). - Montar
{children}duas vezes na grade visível (ghost blocks). - Fallback que renderiza 5 imagens quando o tipo do block não resolve — corrija
typeno molde (useSectionBlockTemplate/ props da section). - Esconder fatia só com toggle
mostrar: falsese a intenção é remover a fatia do card — prefira remover o bloco na árvore (toggle é opcional para o lojista).
7. Sintomas comuns
8. Checklist antes de publicar o tema
-
sections/{id}/blocks.json+ ids emtheme.json→blocks[] - Cada bloco na pasta
blocks/{id}/;namepode mudar, a pasta não - Section com
dataouuseCorvexDatapara produtos -
renderCatalogProductBlocks(ou equivalente) + contexto de produto -
RepeatedBlockCard(ou equivalente documentado) no builder - Templates com
blocks+block_orderpara a section de grade -
corvex validate .ecorvex build . - Teste no editor: adicionar/remover/reordenar blocos e conferir todos os cards da grade