Tipps und Kniffe aus der Praxis
Die Handgriffe, die ein Theme robust machen: Standardwerte, sicheres Verketten, leere Listen, Bilder, Adressen und Beträge.
Für EntwicklerVoraussetzungen
- Recht: website:write
Ein Theme wird nicht an der Startseite gemessen, die der Entwickler mit gepflegten Daten sieht, sondern an dem Betrieb, der drei Felder leer gelassen hat. Die folgenden Handgriffe kosten je eine Zeile und verhindern genau das.
STANDARDWERTE: `{{ wert | default: "Vorgabe" }}` greift, wenn der Wert fehlt, leer oder falsch ist. ACHTUNG: Auch die Zahl `0` gilt als falsch — für eine Zahl, bei der `0` ein gültiger Wert ist (ein Innenabstand von null etwa), ist `default` das falsche Werkzeug. Prüfen Sie dort auf `== nil`.
SICHER VERKETTEN: Eine Kette über eine fehlende Ebene hinweg bricht NICHT ab, sie ergibt nichts. `{{ opening_hours_sets_by_id[kennung].days[0].label }}` ist also gefahrlos, auch wenn es die Kennung nicht gibt. Das ist bequem — und es heisst zugleich, dass ein Tippfehler im Namen genauso aussieht wie ein leeres Feld.
LEERE LISTEN: Drei Wege, derselbe Zweck — `{% for … %}{% else %}`, `{% if liste == empty %}` und `{% if liste.size > 0 %}`. Der erste ist der kürzeste und fängt zusätzlich den Fall ab, dass es die Liste gar nicht gibt.
BILDER: Bauen Sie ein Teilstück, das die Adresse durch `safe_url` schickt, auf `blank` prüft und `loading="lazy"` setzt. Ein Bild in einem Theme kommt fast immer aus einer Einstellung, also aus Kundendaten.
ADRESSEN: Jede Adresse aus einer Einstellung gehört durch `safe_url` — besonders in einem `style`-Attribut mit `url(…)`. Ein Wert mit einem Anführungszeichen verlässt sonst das Attribut, ein Wert mit `);` die CSS-Regel.
BETRÄGE: Produkte bringen mit `price` bereits einen fertigen Text mit; nehmen Sie den. Rechnen Sie ausnahmsweise selbst, dann mit `price_cents | divided_by: 100.0 | money`. Diese Engine teilt übrigens auch bei `divided_by: 100` mit Nachkommastellen — das Liquid anderer Anbieter täte hier eine Ganzzahldivision und gäbe 48 statt 48,50 aus.
ATTRIBUTE ZUSAMMENSETZEN: `{% capture %}` ist der saubere Weg, ein `style`-Attribut aus mehreren Bedingungen zu bauen, ohne dass Zeilenumbrüche im Attribut landen.
FEHLERSUCHE: `{{ irgendwas | json }}` in einem `<pre>` zeigt in einem Zug, was tatsächlich ankommt — schneller als jedes Ausprobieren einzelner Feldnamen.
Codebeispiele
{%- assign abstand = 0 -%}fehlender Wert: [{{ settings.gibt_es_nicht | default: 1280 }}]Null mit default: [{{ abstand | default: 1280 }}]Null mit Prüfung: {% if abstand == nil %}{% assign abstand = 1280 %}{% endif %}[{{ abstand }}][{{ opening_hours_sets_by_id['gibt-es-nicht'].days[0].label }}][{{ products[99].title }}][{{ navigation_menus_by_handle['tippfehler'].items[0].url }}]{% for satz in opening_hours_sets %}{{ satz.title }} {% else %}keine Sets{% endfor %}
{% if menus == empty %}keine Menüs{% else %}{{ menus.size }} Menüs{% endif %}
{% if products.size > 0 %}{{ products.size }} Gerichte{% endif %}{%- assign quelle = url | safe_url -%}{%- if quelle != blank -%}<img src="{{ quelle }}" alt="{{ alt | escape }}" loading="lazy"{% if breite %} width="{{ breite }}"{% endif %}>{%- else -%}<!-- bild: keine verwendbare Adresse -->{%- endif -%}{% render 'bild', url: products[0].image_url, alt: products[0].title, breite: 800 %}
{% render 'bild', url: 'javascript:alert(1)', alt: 'böse' %}{%- assign hintergrund = section.settings.hintergrund_url | default: products[0].image_url | safe_url -%}{% if hintergrund != blank %}<div class="buehne" style="background-image:url('{{ hintergrund }}')"></div>{% else %}<div class="buehne buehne--leer"></div>{% endif %}fertig formatiert: {{ products[0].price }}selbst gerechnet: {{ products[0].price_cents | divided_by: 100.0 | money }}mit Aufschlag: {{ products[0].price_cents | times: 1.1 | divided_by: 100.0 | round: 2 | money }}Summe der Karte: {{ products | map: 'price_cents' | sum | divided_by: 100.0 | money }}{%- capture stil -%}--abstand-oben: {{ section.settings.abstand_oben | default: 72 }}px;{%- if section.settings.hintergrund != blank %}--farbe-flaeche: {{ section.settings.hintergrund }};{% endif -%}{%- endcapture -%}<section style="{{ stil }}">…</section><pre>{{ section.settings | json }}</pre>
<pre>{{ products[0] | json }}</pre>
<pre>{{ navigation_menus | json }}</pre>Siehe auch
- Die eigenen Liquid-FilterSieben Filter kommen von TacticTable dazu — alle übrigen sind die von LiquidJS.
- Liquid von vorn: Ausgabe, Bedingungen, Schleifen, ZuweisungenDie vier Bausteine, aus denen jede Vorlage besteht — und die Stellen, an denen diese Engine sich anders verhält als das Liquid anderer Anbieter.
- 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.
- Teilstücke: render und includeWiederverwendbares Markup aus snippets/ — und der eine Unterschied zwischen render und include, an dem die meisten Übersetzungen scheitern.