Sections y Blocks

Las sections son las unidades de composición de una página y los blocks son sus componentes internos reutilizables. Ambos siguen la misma estructura: markup Twig en la parte superior y un bloque {% schema %} al final que declara sus settings, bloques aceptados y presets para el editor.

Sections

Leer settings

Los settings declarados en el schema se acceden desde section.settings.*:

{% set has_blocks = section.blocks | length > 0 %}
{% set columns    = section.settings.columns %}
{% set format     = section.settings.format %}

Iterar blocks

Los blocks disponibles en la section se recorren desde section.blocks:

{% for block in section.blocks %}
  {% if block.type == 'banner' %}
    <div class="banner-item">
      {% include 'blocks/banner.tpl' with { block: block } %}
    </div>
  {% endif %}
{% endfor %}

Schema de una section

El schema se declara entre {% schema %} y {% endschema %} al final del archivo:

{% schema %}
{
  "name": "t:names.banners",
  "class": "section section-banners",
  "blocks": [
    { "type": "banner" }
  ],
  "settings": [
    { "type": "header", "content": "t:names.disposition" },
    {
      "type": "setting",
      "setting_type": "radio",
      "id": "format",
      "label": "t:settings.format",
      "options": [
        { "value": "grid",   "label": "t:options.grid" },
        { "value": "slider", "label": "t:options.slider" }
      ],
      "default": "grid"
    }
  ],
  "enabled_on": {
    "page_templates": "all",
    "layout_templates": ["footer"]
  },
  "presets": [
    {
      "name": "t:names.banners",
      "category": "t:categories.media",
      "settings": { "format": "grid" }
    }
  ]
}
{% endschema %}

Claves de schema para sections:

Clave Qué hace
name Nombre de la section en el editor (clave t:).
wrapper Elemento HTML usado como wrapper de la section. Por defecto es section. Usar header o footer para sections en layout templates.
class Clase CSS agregada al wrapper.
icon Ícono mostrado junto al nombre en el editor.
static Si es true, el usuario no puede eliminar la section.
limit Cantidad máxima de veces que esta section puede aparecer en una página.
max_blocks Cantidad máxima de blocks que el usuario puede agregar a esta section. Omitir para no limitar.
enabled_on Restringe dónde puede usarse la section. Acepta page_templates ("all" o un array como ["home", "product"]) y/o layout_templates (["header", "footer"]).
blocks Tipos de block que acepta la section. Usar { "tags": ["general"] } para aceptar cualquier block con ese tag, o listar tipos específicos como [{ "type": "banner" }]. Cada entrada puede declarar "limit": N.
settings Definiciones de settings, más separadores header que agrupan visualmente los settings en el editor.
presets Configuraciones por defecto aplicadas cuando el usuario agrega la section. Pueden pre-poblar settings y blocks iniciales.
default Alternativa a presets para sections que siempre se renderizan con un conjunto fijo de blocks (ej. footer).

Blocks

Leer settings y aplicar block_attributes

Los blocks leen sus settings desde block.settings.* y deben aplicar el filtro block_attributes para que el editor pueda identificarlos y seleccionarlos:

{% set heading_settings = block.settings %}

{% if heading_settings.text %}
  <div class="heading-block {{ heading_settings.size }}" {{ block | block_attributes }} data-store="heading-block-{{ block.id }}">
    {{ heading_settings.text | raw }}
  </div>
{% endif %}

Schema de un block

{% schema %}
{
  "name": "t:names.heading",
  "tags": ["general"],
  "icon": "TextSizeIcon",
  "settings": [
    {
      "type": "setting",
      "setting_type": "richtext",
      "id": "text",
      "label": "t:options.text",
      "default": "t:defaults.heading"
    },
    {
      "type": "setting",
      "setting_type": "select",
      "id": "size",
      "label": "t:settings.size",
      "options": [
        { "value": "h1", "label": "t:options.heading_1" },
        { "value": "h2", "label": "t:options.heading_2" }
      ],
      "default": "h4"
    }
  ],
  "presets": [
    {
      "name": "t:names.heading",
      "category": "t:categories.basic",
      "settings": { "text": "t:defaults.heading" }
    }
  ]
}
{% endschema %}

El campo tags determina qué sections aceptarán este block: una section que declare { "tags": ["general"] } en su clave blocks incluirá automáticamente todos los blocks con el tag "general".

Blocks anidados

Un block puede contener otros blocks. El schema declara los tipos hijo en "blocks": [...] y el markup itera block.blocks:

{% for child_block in block.blocks %}
  {% include 'blocks/' ~ child_block.type ~ '.tpl' with { block: child_block } %}
{% endfor %}

Limitar la cantidad de blocks

La clave max_blocks en el schema de una section limita cuántos blocks puede agregar el usuario. Se usa cuando el layout se rompe visualmente con demasiados blocks:

{% schema %}
{
  "name": "t:names.featured_brands",
  "max_blocks": 12,
  "blocks": [
    { "type": "brand-logo" }
  ],
  "settings": [ ... ],
  "presets": [ ... ]
}
{% endschema %}

Si max_blocks se omite, la section acepta cualquier cantidad de blocks.