Einen eigenen Abschnitt bauen

Zwei Dateien genügen: die Vorlage und ihr Schema — danach steht der Abschnitt im Theme-Editor zur Auswahl.

Für Entwickler

Voraussetzungen

  • Recht: website:write

Ein Abschnitt besteht aus `sections/<typ>.liquid` und optional `sections/<typ>.schema.json`. Der Dateiname ohne Endung ist der Typ, unter dem eine Vorlage ihn anspricht.

Ohne Schema ist der Abschnitt zwar renderbar, aber im Theme-Editor nicht einstellbar — er zeigt dann „Für diese Section sind keine Einstellungen verfügbar."

In der Vorlage greifen Sie über `section.settings.<id>` auf die Werte zu. Alles Weitere — Restaurant, Marke, Speisekarte — steht über die allgemeinen Objekte bereit.

Denken Sie an die fehlende Maskierung: Text aus einer Einstellung gehört durch `escape`, eine Adresse durch `safe_url`.

Schritt für Schritt

  1. Vorlage anlegen

    Im Code-Editor die Datei `sections/mein-abschnitt.liquid` erzeugen und das Markup hineinschreiben, etwa `<section><h2>{{ section.settings.headline | escape }}</h2></section>`.

  2. Schema danebenlegen

    Die Datei `sections/mein-abschnitt.schema.json` erzeugen mit `name` und der Liste `settings`. Jedes Feld braucht mindestens `type`, `id` und `label`.

  3. Speichern

    Beide Dateien speichern. Der Vermerk „ungespeichert" muss verschwinden.

  4. Im Editor prüfen

    Den Theme-Editor öffnen und auf „Section hinzufügen". Ihr Abschnitt muss unter dem Namen aus dem Schema in der Liste stehen; nach dem Einfügen erscheinen rechts Ihre Felder.

Codebeispiele

sections/tageskarte.liquid
Liquid
<section id="{{ section.settings.anker | default: 'karte' }}" class="tageskarte">  {% if section.settings.ueberschrift != blank %}    <h2>{{ section.settings.ueberschrift | escape }}</h2>  {% endif %}   {% if section.blocks == empty %}    <p class="leer">{{ 'karte.leer' | t }}</p>  {% else %}    <ul>      {%- for block in section.blocks %}        {%- if block.type == 'gericht' %}      <li data-block="{{ block.id }}">        <span class="name">{{ block.settings.name | escape }}</span>        {%- if block.settings.beschreibung != blank %}        <span class="text">{{ block.settings.beschreibung | escape }}</span>        {%- endif %}        <span class="preis">{{ block.settings.preis | money }}</span>      </li>        {%- endif %}      {%- endfor %}    </ul>  {% endif %}</section>
Ein vollständiger Abschnitt. Drei Dinge, die hier bewusst so stehen: der Anker bekommt einen `default`, weil eine leere Einstellung sonst `id=""` erzeugt; die leere Blockliste wird abgefangen, statt eine leere `<ul>` zu hinterlassen; und jeder Redakteurstext geht durch `escape`.
sections/tageskarte.schema.json
AusschnittJSON
{  "name": "Tageskarte",  "settings": [    { "type": "text", "id": "ueberschrift", "label": "Überschrift", "default": "Unsere Tageskarte" },    { "type": "text", "id": "anker", "label": "Anker-ID für Sprungmarken", "default": "karte" }  ],  "max_blocks": 8,  "blocks": [    {      "type": "gericht",      "name": "Gericht",      "settings": [        { "type": "text", "id": "name", "label": "Name" },        { "type": "textarea", "id": "beschreibung", "label": "Beschreibung" },        { "type": "number", "id": "preis", "label": "Preis in Euro" }      ]    }  ],  "default": {    "settings": { "ueberschrift": "Unsere Tageskarte", "anker": "karte" }  }}
Ausschnitt: läuft nicht für sich allein — er gehört an die passende Stelle einer bestehenden Vorlage.Der Dateiname vor `.schema.json` ist der TYP des Abschnitts — genau der Name, unter dem eine Vorlage ihn anspricht und unter dem `{% section %}` ihn findet. `name` ist nur die Beschriftung im Theme-Editor.
Der fertige Abschnitt, so wie das Layout ihn holt
Liquid
{% section 'tageskarte' %}
Hier greift die ganze Mechanik auf einmal: die Vorgaben aus dem Schema, die Werte aus `templates/index.json`, die dort eingetragenen Blöcke — und das `{{ restaurant.name }}`, das in der Vorlage als Einstellungswert steht und VOR dem Rendern aufgelöst wird.

Wo im Dashboard

/restaurant/[slug]/website/themes/[id]/code

Im Dashboard öffnen