API-Referenz

Templates – Kurzreferenz

Seiten-HTML, Head und Snippets sind pongo2-Templates (Django-/Twig-ähnlich). Ausgaben mit {{ … }} werden automatisch HTML-escaped.

Variable / Funktion Beschreibung
page.id, .title, .meta_title, .slug, .path, .description, .parent_id Aktuelle Seite (meta_title und description bereits ausgewertet)
page.noindex, page.nofollow Robots-Einstellungen der Seite (bool)
page.lang Wirksame Sprache der Seite (eigene, geerbte oder de)
site.id, .title, .domain, .domains, .favicon Aktuelle Website (ihre Root-Seite); domain = erste eingetragene Domain, favicon = URL des Website-Icons oder leer
route.path Angefragter Pfad
route.slug / route.rest Unterpfad bei Catch-All-Seiten als String bzw. Liste von Segmenten
route.query.x Query-Parameter ?x=…
today Heutiges Datum (JJJJ-MM-TT, Serverzeit) – für Datumsvergleiche in data()
now Aktueller Zeitpunkt (für |date)
preview true in der Admin-Vorschau
data("slug", "k1", v1, "k2", v2, …) Collection oder REST-Quelle, Parameter als Schlüssel/Wert-Paare (wie bei /data)
item("slug", "feld", wert, …) Erster Eintrag mit feld == wert oder nil
translations() / translations(eintrag) Veröffentlichte Sprachfassungen der Seite bzw. eines Eintrags für Sprachumschalter: Liste { lang, title, url, current }, sortiert nach Sprachcode; url relativ (eigene Website) oder absolut (andere Website mit Domain). Ohne Gruppe nur die aktuelle Seite. In der Vorschau mit Entwürfen
language_name(code) Eigenname einer Sprache: de → „Deutsch“, fr → „Français“, de-at → „Deutsch (AT)“; unbekannte Codes unverändert
nav() Veröffentlichte Unterseiten der Startseite der aktuellen Website
children() / children(id) Veröffentlichte Unterseiten der aktuellen / einer bestimmten Seite
lang_root() / lang_root(id) Startseite des Sprachbaums der aktuellen / einer bestimmten Seite: die Seite selbst oder die nächste Vorfahrin mit eigenem lang, sonst die Website-Startseite; Felder wie bei nav() (id, title, path, lang …). Menü je Sprache: children(lang_root().id)
image(id, sizes?, class?) Responsives <img> mit srcset, Alt-Text und Maßen
file(id) { url, srcset, name, mime, size, width, height, alt }
{% include "snippet-name" %} Snippet einbinden, optional with key=value
{% component "name" key=wert %}…{% endcomponent %} Snippet als Komponente mit Inhalt; {% fill "slot" %}…{% endfill %} füllt benannte Slots, der Rest den Standard-Slot. Im Snippet: {% slot %}/{% slot "name" %}Fallback{% endslot %}, slots.name
{% extends "layout" %} + {% block x %}…{% endblock %} Seite auf Basis eines Layout-Snippets (muss am Anfang stehen)
{% verbatim %}…{% endverbatim %} Inhalt wird unverändert ausgegeben, {{ … }} darin nicht ausgewertet (z. B. für Vue/Handlebars). Funktioniert auch in Snippets
not_found() Bricht das Rendern ab und liefert die 404-Seite mit Status 404 – die 404-Seite der Website (notfound_page_id, sonst Seite mit Slug 404 unter der Startseite, sonst eine Standardseite)
asset_url(id) Versionierte URL einer CSS/JS-Datei, z. B. <script src="{{ asset_url(7) }}"> – wenn eine Datei an einer bestimmten Stelle statt über die Seitenzuordnung geladen werden soll
|json Wert als JSON ausgeben
|markdown Markdown zu HTML (GitHub-Flavored: Tabellen, Aufgabenlisten, Durchstreichen, Autolinks; Überschriften bekommen ids, Umlaute umgeschrieben: „Über uns“ → ueber-uns). Roh-HTML im Markdown wird aus Sicherheitsgründen nicht ausgegeben – |markdown:"html" lässt es durch (nur für eigene Texte). Als Block: {% filter markdown %}…{% endfilter %}

Whitespace wird exakt so ausgegeben, wie er im Template steht (wie bei Twig) – Tags entfernen weder Zeilenumbrüche noch Leerzeichen.

Beispiel einer Blog-Seite mit Catch-All (/blog und /blog/<slug>), SEO-Titel {% if route.slug %}{{ item("blog", "slug", route.slug).titel }} – {% endif %}Blog:

{% include "header" %}
{% if route.slug %}
  {% with post=item("blog", "slug", route.slug) %}
    {% if not post %}{{ not_found() }}{% endif %}
    <article>
      <h1>{{ post.titel }}</h1>
      {{ image(post.bild, "(min-width: 900px) 60vw, 100vw") }}
      {{ post.text|markdown }}
    </article>
  {% endwith %}
{% else %}
  {% for post in data("blog", "sort", "-datum", "limit", 10) %}
    <a href="/blog/{{ post.slug }}">{{ post.titel }}</a>
  {% endfor %}
{% endif %}

Der vollständige Spickzettel ist im HTML-Editor unter Template-Hilfe zu finden, ausführliche Erklärungen und Rezepte stehen im Handbuch.