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

http
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=de

Die 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.

ts
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.