Saltar al contenido
merge.uydevelopers

Secciones y settings

Las secciones son las piezas que el comerciante agrega, ordena y configura en el editor de temas. Cada una es un archivo de sections/.

Una sección

Una sección tiene su HTML en Liquid y, al final, un {% schema %} con JSON que declara su nombre, sus settings y sus bloques. Este es sections/faq.liquid:

<div class="faq page-width">
  {%- if section.settings.heading != blank -%}
    <h2>{{ section.settings.heading }}</h2>
  {%- endif -%}
  {%- for block in section.blocks -%}
    <details {{ block.shopify_attributes }}>
      <summary>{{ block.settings.question }}</summary>
      <div class="rte">{{ block.settings.answer }}</div>
    </details>
  {%- endfor -%}
</div>

{% stylesheet %}
  .faq details { border-bottom: 1px solid currentColor; padding: 1rem 0; }
{% endstylesheet %}

{% schema %}
{
  "name": "Preguntas frecuentes",
  "class": "section-faq",
  "settings": [
    { "type": "text", "id": "heading", "label": "Título", "default": "Preguntas frecuentes" }
  ],
  "blocks": [
    {
      "type": "question",
      "name": "Pregunta",
      "settings": [
        { "type": "text", "id": "question", "label": "Pregunta", "default": "¿Hacen envíos?" },
        { "type": "richtext", "id": "answer", "label": "Respuesta", "default": "<p>Sí, a todo el país.</p>" }
      ]
    }
  ],
  "max_blocks": 20,
  "presets": [
    { "name": "Preguntas frecuentes", "blocks": [{ "type": "question" }, { "type": "question" }] }
  ]
}
{% endschema %}

Adentro de la sección, section.settings tiene los valores elegidos ysection.blocks los bloques en orden. El motor envuelve cada sección en un elemento con su id y su tipo:

<section id="section-faq" class="section section--faq section-faq" data-section-type="faq">
  …
</section>

El {% schema %}

Una sola vez por sección, con JSON válido. Atributos:

AtributoQué hace
nameNombre en el editor (obligatorio).
tagElemento que envuelve la sección: section (por defecto), div,header, footer o aside.
classClases extra para ese elemento.
settingsLista de settings de la sección.
blocksTipos de bloque que acepta.
max_blocksCuántos bloques se pueden agregar.
presetsSi tiene, la sección aparece en "Agregar sección" del editor.
limitCuántas veces puede estar en un template.

Si el JSON no es válido o un setting está mal declarado, la vista previa muestra el error con el nombre del archivo.

Bloques

Cada tipo de bloque tiene type (único en la sección, con minúsculas, números,- o _), name, settings y, opcional,limit. En Liquid se recorren con for block in section.blocks y se distinguen con block.type. Poné {{ block.shopify_attributes }} en el elemento raíz de cada bloque: el editor lo usa para resaltarlo al seleccionarlo.

Presets

Un preset es una configuración inicial con nombre. Las secciones con presets se pueden agregar desde el editor; las que no tienen (por ejemplo main-product) solo aparecen en los templates que las incluyen.

Settings

Todos los settings comparten estos atributos:

  • type: uno de los tipos de abajo.
  • id: obligatorio salvo en header y paragraph. Empieza con una letra minúscula y sigue con minúsculas, números o _. Único dentro de la sección o del bloque.
  • label, info (ayuda debajo del campo) y default.
  • required: el editor no deja guardar el campo vacío.
{
  "type": "range",
  "id": "products_to_show",
  "label": "Cantidad de productos",
  "info": "Se muestran en una grilla.",
  "min": 2,
  "max": 12,
  "step": 1,
  "unit": "u.",
  "default": 8
}

Tipos de setting

TipoEn el editorEn LiquidAtributos propios
textCampo de una línea.textoplaceholder
textareaCampo de varias líneas.textoplaceholder
richtextEditor con formato (párrafos, negrita, links, listas).HTML sanitizado (se imprime sin escapar)—
inline_richtextTexto con formato en una línea (negrita, cursiva, links).HTML sanitizado—
image_pickerElegir una imagen de la biblioteca de archivos.image o nil—
videoElegir un video MP4 o WebM de la biblioteca de archivos.video o nil (usalo con video_tag)—
colorSelector de color.texto hexadecimal (#1d4ed8)—
selectLista desplegable.el value elegidooptions (obligatorio): [{ "value", "label" }]
checkboxCasilla.booleano—
rangeDeslizador.númeromin y max (obligatorios), step, unit
numberCampo numérico.númeromin, max, step
urlLink (a una página de la tienda o externo).texto (vacío si el link no es seguro)—
link_listElegir un menú.handle del menú: usalo con linklists[section.settings.menu]—
productElegir un producto.product o nil—
product_listElegir varios productos.array de productlimit
collectionElegir una colección.collection o nil—
collection_listElegir varias colecciones.array de collectionlimit
blogElegir un blog.blog o nil—
articleElegir un artículo.article o nil—
headerTítulo que agrupa settings (no guarda valor, no lleva id).—content
paragraphTexto de ayuda (no guarda valor, no lleva id).—content

Los textos tienen un largo máximo razonable para un theme. Las listas de productos y colecciones aceptan limit para acotar cuántos se eligen.

Cómo se resuelven los valores

  • Si el valor guardado es válido para su tipo, se usa ese.
  • Si no, el default del schema; si tampoco hay, el vacío del tipo.
  • Los range y number se acotan a min ymax; un select solo acepta uno de sus options; uncolor tiene que ser hexadecimal.
  • Un producto, colección, blog o artículo que ya no existe o no está publicado llega comonil: preguntá antes de usarlo ({% if section.settings.collection %}).
  • Los ids que el schema no declara se descartan.