Snippets
Snippets sind wiederverwendbare HTML-/Template-Bausteine. Sie können im Editor als Kopie eingefügt oder per {% include "name" %} referenziert werden (dann wirken Änderungen sofort überall).
Snippet-Objekt
{
"id": 1,
"name": "header",
"description": "Hauptnavigation",
"content": "<header>{% for p in nav() %}<a href=\"{{ p.path }}\">{{ p.title }}</a>{% endfor %}</header>",
"created_at": 1791191665,
"updated_at": 1791191665,
"assets": [{ "asset_id": 3, "name": "header", "kind": "css" }],
"schema": null,
"page_layout": null
}
schema: Baustein-Schema für den Seitenbaukasten (null = kein Baustein). PUT ohne schema lässt es unverändert; Hinweise zu Slots kommen als warnings in der Antwort.
page_layout: { "label": "Inhaltsseite", "description": "…", "default": true } bietet das Snippet beim Anlegen neuer Seiten als Seitenlayout an (null = nicht). label leer = Snippet-Name; Bezeichnung höchstens 200, Beschreibung 2000 Zeichen (400 snippet.layoutTooLong). PUT ohne page_layout lässt es unverändert, "page_layout": null entfernt es.
assets: CSS/JS-Dateien des Snippets in Ladereihenfolge (beim Schreiben genügt asset_id; nicht vorhandene IDs werden übergangen). Sie werden nur auf Seiten geladen, die das Snippet beim Rendern ausführen (include, Komponente, extends; Makro-Snippets beim import) – im Seiteninhalt oder Head-Feld, nicht im SEO-Titel/der Beschreibung. CSS kommt in den <head>, JS vor </body>, jeweils hinter die Dateien der Seite und ohne Doppelte. JS-Dateien mit ES-Modul-Syntax (import/export auf oberster Ebene, import.meta) werden – wie bei Seiten – als <script type="module"> eingebunden.
name ist eindeutig und darf Buchstaben, Ziffern, ., _, - und / enthalten (z. B. cards/teaser). Er muss mit Buchstabe oder Ziffer beginnen.
GET /snippets 🔑 · GET /snippets/{id} 🔑
Liste (inkl. content) bzw. einzelnes Snippet.
POST /snippets ✏️
{ "name": "footer", "description": "", "content": "<footer>© {{ page.title }}</footer>", "assets": [{ "asset_id": 3 }] }
201, 409 wenn der Name vergeben ist. Optional folder (Ordner in der Admin-Liste); ohne Angabe ergibt er sich aus einem Präfix im Namen (teile/footer → teile).
PUT /snippets/{id} ✏️ · DELETE /snippets/{id} ✏️
Merge-Update bzw. Löschen; ohne assets im Body bleibt die Zuordnung unverändert, "assets": [] entfernt alle. Achtung: Seiten, die ein gelöschtes Snippet per include einbinden, erzeugen danach einen Render-Fehler.
GET /page-layouts 🔑
Die Seitenlayouts – Snippets mit page_layout, sortiert nach Bezeichnung. Der Admin-Dialog Neue Seite und Integrationen (IllusionPublish) bieten sie zur Auswahl an:
[
{ "id": 12, "name": "layouts/inhaltsseite", "label": "Inhaltsseite", "description": "Kopf, Titel, Blöcke, Fuß",
"default": true, "has_blocks": true, "html": "{% extends \"layouts/inhaltsseite\" %}\n" },
{ "id": 14, "name": "layouts/kontakt", "label": "Kontakt", "description": "Anschrift und Formular",
"default": false, "has_blocks": false, "html": "{% extends \"layouts/kontakt\" %}\n" }
]
has_blocks: Gibt das Layout einen Blockbereich für die Seite aus ({% blocks page.blocks %}) – auch überextends,includeund Komponenten? Ausgewertet wird der Template-Code (Kommentare undverbatimzählen nicht, überschriebeneblocks beimextendssamtblock.superschon; Snippet-Namen aus Variablen lassen sich nicht verfolgen).falseheißt statischer Inhalt – ein gewollter Fall für Seiten mit festem Inhalt; IllusionCMS fügt nie selbst Blöcke ein.default: im Dialog vorausgewählt (gibt es mehrere, gilt das erste).html: das HTML, das eine neue Seite mit diesem Layout bekommt (POST /pagesmitlayout_id).
Die Liste steht auch in GET /schema (page_layouts); ändert sie sich – auch has_blocks durch Änderungen an eingebundenen Snippets –, meldet der Webhook schema.changed mit kind: page_layout.