Liquid von vorn: Ausgabe, Bedingungen, Schleifen, Zuweisungen
Die vier Bausteine, aus denen jede Vorlage besteht — und die Stellen, an denen diese Engine sich anders verhält als das Liquid anderer Anbieter.
Für EntwicklerVoraussetzungen
- Recht: website:write
Liquid kennt zwei Klammerformen. `{{ … }}` gibt etwas aus, `{% … %}` tut etwas, ohne selbst etwas auszugeben. Mehr Grammatik gibt es nicht.
AUSGABE: `{{ restaurant.name }}`. Fehlt die Variable, bleibt die Stelle leer — auch dann, wenn Sie über eine fehlende Variable hinweg noch weiter in die Tiefe greifen. Das ist bequem und gefährlich zugleich: ein Tippfehler im Namen sieht genauso aus wie ein leeres Feld.
BEDINGUNGEN: `{% if %}`, `{% elsif %}`, `{% else %}`, `{% unless %}` und `{% case %}` mit `{% when %}`. Verglichen wird mit `==`, `!=`, `<`, `>`, `<=`, `>=`, `contains`, `and` und `or`. Zwei Sonderwerte helfen: `blank` ist wahr für leere Zeichenketten und leere Listen, `empty` für leere Listen und Objekte.
ACHTUNG bei der Wahrheit: Diese Engine rechnet nach den Regeln von JavaScript. Eine leere Zeichenkette ist FALSCH, die Zahl `0` ist FALSCH. In anderen Liquid-Welten wären beide wahr. Wer eine Zahl prüft, bei der `0` ein gültiger Wert ist, muss deshalb auf `== nil` prüfen statt auf die Wahrheit.
SCHLEIFEN: `{% for eintrag in liste %}`. Innerhalb steht `forloop` mit `index`, `index0`, `first`, `last`, `length` und `rindex`. Als Zusätze gehen `limit`, `offset` und `reversed`. Ein `{% else %}`-Zweig springt an, wenn die Liste leer ist — oder wenn es sie gar nicht gibt. Eine Schleife über nichts dreht null Runden und bricht NICHT ab.
ZUWEISUNGEN: `{% assign name = wert %}` legt eine Variable an, `{% capture name %}…{% endcapture %}` fängt gerendertes Markup in einer Variable ein. Beide überleben die Schleife, in der sie stehen. Mit `{% liquid %}` schreiben Sie mehrere Anweisungen ohne die Klammern, eine je Zeile.
LEERRAUM: Ein Bindestrich an der Klammer frisst den angrenzenden Leerraum — `{%- assign … -%}`. Ohne ihn hinterlässt jede Steueranweisung eine Leerzeile im Ergebnis. Das ist kosmetisch, bis eine leere Zeile in einem `<pre>` oder in einem `style`-Attribut landet.
Was es NICHT gibt, obwohl es in anderen Liquid-Welten dazugehört: `{% schema %}`, `{% style %}`, `{% stylesheet %}`, `{% javascript %}`, `{% form %}` und `{% paginate %}`. Jedes davon bricht die Seite ab — siehe den Artikel über die Tags.
Codebeispiele
{{ restaurant.name }} — {{ restaurant.address_full }}Telefon: {{ restaurant.phone }}Was es nicht gibt, bleibt leer: [{{ restaurant.gibt_es_nicht }}]Auch eine Kette darüber hinweg: [{{ restaurant.gibt_es_nicht.und.tiefer }}]{% if restaurant.phone %} <a href="tel:{{ restaurant.phone | url_encode }}">Anrufen</a>{% elsif restaurant.email %} <a href="mailto:{{ restaurant.email }}">Schreiben</a>{% else %} <p>Bitte über die Buchungsstrecke reservieren.</p>{% endif %} {% unless analytics.enabled %}<p>Die Reichweitenmessung ist abgeschaltet.</p>{% endunless %}{% if products.size > 2 and menus.size > 0 %}<p>Karte und Menü sind gepflegt.</p>{% endif %}{% if section.settings.anker != blank %}Anker gesetzt: {{ section.settings.anker }}{% endif %}
{% if section.settings.gibt_es_nicht == blank %}Diese Einstellung ist leer oder fehlt.{% endif %}
{% if section.blocks == empty %}keine Blöcke{% else %}{{ section.blocks.size }} Blöcke{% endif %}{% for block in section.blocks %} {%- case block.type -%} {%- when 'gericht' -%} <li>{{ block.settings.name | escape }}</li> {%- when 'hinweis' -%} <p>{{ block.settings.text | escape }}</p> {%- else -%} <!-- unbekannte Blockart: {{ block.type }} --> {%- endcase -%}{% endfor %}<ul>{%- for gericht in products limit: 2 %} <li>{{ forloop.index }} von {{ forloop.length }}: {{ gericht.title }}{% unless forloop.last %},{% endunless %}</li>{%- endfor %}</ul>{% for eintrag in gibt_es_gar_nicht %} <li>{{ eintrag }}</li>{% else %} <p>Nichts zu zeigen.</p>{% endfor %}{%- assign titel = restaurant.name | upcase -%}{%- capture anschrift -%}{{ restaurant.address_full }} · {{ restaurant.phone }}{%- endcapture -%}{% liquid assign offene_tage = restaurant.opening_hours | where: 'closed', false | size assign vegan = products | where: 'is_vegan', true | size%}<h1>{{ titel }}</h1><p>{{ anschrift }}</p><p>An {{ offene_tage }} Tagen geöffnet. Vegane Gerichte: {{ vegan }}.</p><p> {%- assign gruss = 'Guten Abend' -%} {{ gruss }}</p>{%- assign kennung = 'menu-abend' -%}Nachschlagen mit fester Kennung: {{ navigation_menus_by_handle['hauptmenue'].title }}Nachschlagen mit einer Variablen: {{ menus_by_id[kennung].name }}Erster Eintrag einer Liste: {{ products[0].title }} / {{ products.first.title }}Anzahl: {{ products.size }}Siehe auch
- Die Liquid-Umgebung: wie streng sie istUnbekannte Variablen und Filter sind still, unbekannte Tags brechen ab — und ausgegeben wird ohne Maskierung.
- Welche Liquid-Tags es gibt — und welche abbrechenGenau ein eigenes Tag, dazu die von LiquidJS. Fünf Tags aus anderen Liquid-Welten brechen hier die Seite ab.
- Die eigenen Liquid-FilterSieben Filter kommen von TacticTable dazu — alle übrigen sind die von LiquidJS.
- Häufige Fehler und woran man sie erkenntWas passiert bei einem unbekannten Abschnitt, bei einer fehlenden Einstellung, bei einer Schleife über nichts — und welche Fehler die Seite wirklich abbrechen.