Karten und Aushänge
Speisekarten, Wochenkarten, Specials, Getränkekarten, Preislisten und Aushänge: aus Einträgen zusammengestellt, als A4-PDF gedruckt, auf der Website ausgespielt – eine Datenbasis, drei Ausgaben.
Stand: 27.10.2026
Auf dieser Seite
Eine Karte (intern: Publikation) ist eine zusammengestellte Druckseite: Kopf mit Logo, Titel, Gültigkeit und Badge, darunter Abschnitte mit Positionen, unten die Legende. Die Positionen verweisen auf Einträge – Gerichte, Getränke, Leistungen –, sodass Preis und Allergene an einer Stelle gepflegt werden. Aus derselben Karte entstehen die Druckansicht im Editor, das PDF und der Website-Block.
*English summary: A publication composes content entries (dishes, drinks, services) into sections on an A4 page with validity dates, badge, legend and print template. The same data renders the editor canvas, the stored PDF (Chromium) and the website block menu, which automatically shows the publication valid today. The delivery API exposes GET delivery/publications, …/current?kind= and …/:id; the SDK has publications(), currentPublication() and publication().*
Arten und Vorlagen
| Art | Typischer Einsatz | Standardvorlage |
|---|---|---|
| Wochenkarte | wechselt wöchentlich, „Gültig ab/bis“ | Markthaus (zwei Spalten) |
| Speisekarte | die Dauerkarte | Markthaus |
| Special | Aktionswochen, Festtage | Markthaus |
| Getränkekarte | Getränke mit Füllmenge | Klassisch (zentriert) |
| Preisliste | Leistungen mit Dauer und Preis | Preisliste (Tabelle) |
| Aushang | ein Gericht groß, Hinweise | Aushang (große Schrift) |
Die Vorlage bestimmt Schrift, Spalten und Abstände; sie lässt sich jederzeit unter Gestaltung wechseln. Jede Vorlage ist eine Funktion in publication-model.util.ts (Backend) bzw. publicationModel.ts (Admin) – beide Dateien sind identisch, ein Test prüft das.
Positionen und Einträge
Beim ersten Anlegen entsteht der Inhaltstyp Gericht (Speisekarte) aus der Startvorlage, falls er fehlt. Er hat Name, Kategorie, Preis, Menge („170 g“), Allergene und Zusatzstoffe als Codes, vegetarisch/vegan und Beschreibung. Bestehende Inhaltstypen bekommen das Feld „Menge“ nicht automatisch – es lässt sich in den Inhaltstypen nachtragen.
Eine Position in der Karte ist entweder
- ein Verweis auf einen Eintrag – Werte kommen aus dem Eintrag, einzelne Felder (Preis, Beschreibung, Menge, Kennzeichen) lassen sich für diese Karte überschreiben; leere Felder übernehmen den Eintrag;
- oder eine freie Position ohne Eintrag (einmalige Tagesgerichte, Toppings „+5 €“).
„Neu anlegen“ im Abschnitt erstellt den Eintrag im Inhaltstyp, ordnet ihn der Website zu und setzt ihn in den Abschnitt. Er ist danach auch in Inhalten und in Listen-Blöcken verfügbar. Ohne das Recht content.publish bleibt der Eintrag Entwurf; auf der Karte erscheint er trotzdem, denn die Karte ist hier die Veröffentlichung.
Zuordnung der Felder
Welche Felder des Inhaltstyps Titel, Preis, Beschreibung, Menge, Kennzeichen, vegetarisch und vegan liefern, steht in der Zuordnung (Gestaltung → Quelle). Sie wird beim Anlegen aus den Feldnamen erraten (gericht/name/title, preis/price, menge/dauer …) und lässt sich umstellen. Damit funktioniert dasselbe Modul mit jedem Inhaltstyp, der einen Titel und ein Preisfeld hat – etwa „Leistung“ für die Preisliste eines Friseurs.
Abschnitte, Spalten, Darstellung
Jeder Abschnitt hat eine Überschrift, optional eine kursive Hinweiszeile, eine Spalte (links, rechts, volle Breite) und eine Darstellung:
- Liste: Titel fett, Preis rechts, Beschreibung darunter – Hauptgerichte.
- Kompakt: eine Zeile mit Punktlinie zum Preis – Beilagen, Toppings, Getränke.
- Hervorhebung: Rahmen über die volle Breite, zentriert – der Klassiker, das Tagesgericht.
„Unterüberschrift“ macht aus einem Abschnitt eine farbige Zwischenüberschrift ohne Linie (z. B. „Fisch & Meeresfrüchte“ unter „Fischwochen“). Vorlagen mit einer Spalte (Preisliste, Aushang) legen rechte Abschnitte in die einzige Spalte.
Kennzeichen und Legende
Allergene und Zusatzstoffe stehen als Codes am Gericht (1 Gluten, 7 Milch/Laktose, a Farbstoff …) und erscheinen hochgestellt hinter dem Namen. Die Legende unten auf der Karte entsteht automatisch aus den verwendeten Codes; vegetarisch/vegan werden mit einem Blatt-Symbol gekennzeichnet. Die Standard-Legende folgt der LMIV (Allergene 1–14) plus den üblichen Zusatzstoff-Buchstaben (a–k); unter Gestaltung → Legende lässt sie sich ersetzen, etwa durch eigene Kürzel wie „2L“.
Gültigkeit und Automatik
Gültig ab/bis steuert zwei Dinge: die Zeile unter dem Titel („28.10.–30.10.2026 · KW 44“, mit Kalenderwoche, wenn der Zeitraum in einer Woche liegt) und die Auswahl auf der Website. Der Block „Speisekarte“ im Modus *aktuelle Karte* zeigt die veröffentlichte Karte, die heute gilt; bei mehreren gewinnt die mit dem engsten Zeitraum (die Wochenkarte vor der Dauerkarte ohne Datum), danach die zuletzt veröffentlichte. So reicht es, die nächste Wochenkarte vorab zu veröffentlichen – am Montag erscheint sie von selbst.
Drucken und PDF
Drucken öffnet den Druckdialog des Browsers nur für die Karte (A4, ohne Ränder). PDF erzeugen rendert dieselbe Seite auf dem Server mit Chromium (Playwright), legt die Datei in der Mediathek ab und verlinkt sie an der Karte; der Website-Block bietet sie zum Download an. Fehlt Playwright auf dem Server, bleibt der PDF-Knopf deaktiviert – Drucken funktioniert immer.
Das Logo kommt aus dem Theme der Website (logoAssetId) oder wird je Karte gewählt; im PDF wird es eingebettet.
Website-Block „Speisekarte“
Der Block menu steht in beiden Themes zur Verfügung. Einstellungen:
| Feld | Bedeutung |
|---|---|
| Auswahl | *aktuelle Karte* (heute gültig), *feste Karte* (eine bestimmte) oder *alle* (jede veröffentlichte, als Reiter oder untereinander) |
| Art | nur Karten dieser Art (Wochenkarte, Speisekarte …) |
| Darstellung | zwei Spalten, eine Spalte oder Reiter je Abschnitt |
| Gültigkeit, Legende, PDF | Zeilen ein-/ausblenden, Download-Link |
Der Block rendert semantisches HTML (Überschriften, Listen, <dl> für Preise) und strukturierte Daten nach schema.org (Menu, MenuSection, MenuItem mit Offer), damit Suchmaschinen Gerichte und Preise verstehen.
Mehrsprachigkeit
Eine Karte hat eine Sprache. „In andere Sprache kopieren“ legt eine Kopie an; Positionen, die auf Einträge verweisen, zeigen dann die Übersetzung des Eintrags, Überschriften und freie Positionen passt man danach an. Die Website wählt die Karte in der Sprache der Seite; fehlt sie, die in der Standardsprache der Website.
Delivery-API und SDK
GET /api/v1/delivery/publications?kind=weekly&locale=de
GET /api/v1/delivery/publications/current?kind=weekly&locale=de
GET /api/v1/delivery/publications/{id}?locale=deDie Antwort von current und {id} ist die aufgelöste Karte: title, validityLabel, sections[].items[] mit title, description, priceText, portion, marks, vegetarian, vegan, dazu legend, logoUrl und pdfUrl. Mandantenweite Karten (ohne Website) erscheinen auf allen Websites des Mandanten.
const client = createClient({ baseUrl, apiKey })
const menu = await client.currentPublication({ kind: 'weekly', locale: 'de' })
const all = await client.publications({ kind: 'menu' })Rechte
publications.read (ansehen, Vorschau) und publications.manage (anlegen, bearbeiten, veröffentlichen, PDF, löschen). Redakteure und Freigeber haben beide Rechte, Betrachter nur das Lesen.