Die eigenen Liquid-Filter

Sieben Filter kommen von TacticTable dazu — alle übrigen sind die von LiquidJS.

Für Entwickler

Voraussetzungen

  • Recht: website:write

`asset_url` — macht aus einem Dateinamen die Auslieferungsadresse einer Theme-Datei. `{{ "theme.css" | asset_url }}` ergibt den Pfad, unter dem `assets/theme.css` ausgeliefert wird.

`t` — schlägt einen Text in der aktiven Sprachdatei nach, über einen Pfad mit Punkten: `{{ "header.open_menu" | t }}`. Gibt es den Eintrag nicht, wird der Schlüssel selbst ausgegeben — fehlende Übersetzungen fallen also sofort auf.

`safe_url` — reinigt eine Adresse. Durchgelassen wird nur, was mit `/` beginnt oder ein vollständiges `http`- beziehungsweise `https`-Ziel ist; `javascript:`, `data:` und `vbscript:` werden verworfen, ebenso Anführungszeichen, Klammern, Leerraum und Steuerzeichen. Länger als 2048 Zeichen geht nicht durch. Kommt etwas Unerlaubtes an, ist das Ergebnis eine leere Zeichenkette. Benutzen Sie ihn für JEDE Adresse, die aus einer Einstellung stammt.

`money` — formatiert eine Zahl als Betrag in deutscher Schreibweise, voreingestellt in Euro. Der Wert ist in GANZEN Einheiten anzugeben, nicht in Cent: `14.9` wird zu „14,90 €". Ist der Wert keine Zahl, bleibt er unverändert.

`font_url_family` — bereitet einen Schriftnamen für die Adresse einer Web-Schrift auf (Leerzeichen werden zu `+`).

`url_encode` — kodiert einen Wert für die Verwendung in einer Adresse.

`img_url` — nimmt ein zweites Argument für die Grösse entgegen, IGNORIERT es aber und gibt die Adresse unverändert zurück. Erwarten Sie davon keine Skalierung.

Darüber hinaus stehen alle mitgelieferten Filter von LiquidJS zur Verfügung, unter anderem `default`, `escape`, `date`, `divided_by`, `capitalize` und `truncate`.

Codebeispiele

asset_url — eine Theme-Datei einbinden
Liquid
<link rel="stylesheet" href="{{ 'theme.css' | asset_url }}">
<script src="{{ 'theme.js' | asset_url }}" defer></script>
Ergibt `/api/themes/<Theme-Kennung>/assets/theme.css`. Der Filter nimmt den Dateinamen innerhalb von `assets/`, kein `assets/`-Präfix voranstellen. Eine Datei `theme.css.liquid` sprechen Sie mit ihrem vollen Namen an.
img_url — gibt die Adresse unverändert zurück
Liquid
<img src="{{ products[0].image_url | img_url: '800x' }}" alt="{{ products[0].title | escape }}">
ACHTUNG: Der Grössenparameter wird angenommen und IGNORIERT. Es findet keine Skalierung statt — das Bild kommt in der Grösse, in der es in der Mediathek liegt. Wer aus einem Shopify-Theme portiert, hält hier vergeblich nach kleineren Varianten Ausschau.
font_url_family — ein Schriftname für die Google-Fonts-Adresse
Liquid
<link rel="stylesheet"
      href="https://fonts.googleapis.com/css2?family={{ settings.font_headline | font_url_family }}:wght@400;600&display=swap">
Macht aus „Cormorant Garamond" ein `Cormorant+Garamond`. Der Filter kodiert und ersetzt danach `%20` durch `+` — mehr tut er nicht, insbesondere prüft er nicht, ob es die Schrift gibt.
url_encode — ein Wert als Teil einer Adresse
Liquid
<a href="https://www.google.com/maps/search/?api=1&query={{ restaurant.address_full | url_encode }}">Anfahrt</a>
<a href="tel:{{ restaurant.phone | url_encode }}">Anrufen</a>
Kodiert vollständig, also auch `:` und `/`. Für eine ganze Adresse ist er deshalb das falsche Werkzeug — dafür ist `safe_url` da. Hier passt er, weil der Wert nur ein Parameter innerhalb einer Adresse ist.
safe_url — die Sicherung für jede Adresse aus einer Einstellung
Liquid
Vollständige Adresse: [{{ 'https://bilder.example.com/saal.jpg' | safe_url }}]Wurzelrelativ: [{{ '/assets/hintergrund.jpg' | safe_url }}]Abgewiesen: [{{ 'javascript:alert(1)' | safe_url }}]Abgewiesen: [{{ 'bild.jpg" onerror=boese()' | safe_url }}]
Durchgelassen wird nur, was mit `/` beginnt, mit `//` beginnt oder ein vollständiges http- beziehungsweise https-Ziel ist. Alles mit Anführungszeichen, Klammern, Leerraum, Semikolon oder Steuerzeichen wird zur LEEREN Zeichenkette — prüfen Sie das Ergebnis deshalb mit `!= blank`, bevor Sie ein Attribut daraus bauen.
money — Beträge in deutscher Schreibweise
Liquid
Aus ganzen Euro: {{ 14.9 | money }}Aus Cent: {{ products[0].price_cents | divided_by: 100.0 | money }}Andere Währung: {{ 14.9 | money: 'CHF' }}Schon fertig formatiert: {{ products[0].price }}
Der Filter erwartet GANZE Einheiten, nicht Cent: `14.9` wird zu „14,90 €". Produkte bringen mit `price` bereits einen fertigen Text mit — nehmen Sie den, dann brauchen Sie den Filter gar nicht. Ist der Wert keine Zahl, bleibt er unverändert; eine LEERE Zeichenkette wird allerdings zu „0,00 €".
t — einen Text aus der Sprachdatei holen
Liquid
<a class="knopf" href="{{ restaurant.booking_url | safe_url }}">{{ 'kopf.reservieren' | t }}</a>
Fehlt der Eintrag, erscheint der Schlüssel: [{{ 'kopf.gibt_es_nicht' | t }}]
Der Schlüssel ist ein Punktpfad in die aktive Sprachdatei. Eine fehlende Übersetzung sieht man also im Ergebnis. ACHTUNG: Innerhalb eines mit `{% render %}` eingebundenen Teilstücks findet der Filter die Sprachdatei NICHT — siehe den Artikel über Teilstücke.
Und alles Übrige kommt von liquidjs
Liquid
{{ restaurant.description | truncate: 24 }}{{ restaurant.name | slugify }}{{ products | map: 'title' | join: ', ' }}{{ products | where: 'is_vegan', true | size }} vegane Gerichte{{ now | date: '%d.%m.%Y' }}{{ settings.container_max | minus: 80 }}px
Mit dabei sind unter anderem `default`, `escape`, `date`, `truncate`, `slugify`, `map`, `where`, `reject`, `sort`, `join`, `size`, `plus`, `minus`, `divided_by`, `round` und `json`. ACHTUNG bei `truncate`: die drei Punkte zählen zur Länge. Und `slugify` behält Umlaute und Akzente — es ist nicht `handleize`.
Was es NICHT gibt — und wie still es scheitert
Liquid
[{{ 4800 | money_with_currency }}][{{ 'Crème Brûlée' | handleize }}][{{ 'theme.css' | stylesheet_tag }}][{{ products[0].image_url | image_url: '400x' }}]
Kein Fehler, keine Warnung: ein unbekannter Filter gibt den Wert unverändert zurück. Aus `{{ preis | money_with_currency }}` wird also die nackte Zahl, aus `{{ datei | stylesheet_tag }}` der nackte Dateiname. Das ist die häufigste Ursache für „die Seite sieht kaputt aus, aber es steht nichts im Log".

Wo im Dashboard

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

Im Dashboard öffnen