Startseite und Heroes - Hero-Slideshow (11 Motive inkl. Febrü) mit Infokarte, Laufzeit-Linie, größeren Klickflächen, Goldrahmen und mobiler Karte unter dem Bild; Zeile über der Überschrift, neue Vertrauenspunkte - Hero-Stil auf Marken, Über uns und Kontakt übertragen, Breadcrumb entfernt - Gründer-Leiste, Vision-Box auf Ocker, Showroom-Display in Box mit „Größer ansehen“/Vollbild - Akzentfarbe #a8741f, größere Serif-Überschriften in der Interior-Welt - Marken: Bildpause mit Zitat; Vereine aktualisiert und verlinkt Inhalte - Lektorat aller angezeigten Texte, /about-Korrekturen, Rechtstexte (DDG, TDDDG, Hosting Hetzner) - Ablauf Maßanfertigung überall einheitlich, Magazin-Beitrag neu, alte Beiträge offline, deutsches Datum/Lesezeit, FAQ Projektausstattung, Otterpohl - Referenzen-Seite per CMS-Schalter ausblendbar CMS und Technik - Tote Sektionen, Felder, Seiten und Komponenten entfernt und archiviert (dev/2026-08-28/archiv-*) - Entwurf /entwurf, Farb-Schalter und /welcome entfernt; Test-Routen nur noch lokal - Seitenbaum-Beschreibungen geprüft, fehlende CMS-Felder ergänzt, Markenliste aus „Kernmarken“ - Admin-Bildvorschauen repariert, verwendete Bilder in die Mediathek übernommen - Seeder für das Deployment siehe dev/2026-08-28/entwicklungsplan.md Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
298 lines
19 KiB
PHP
298 lines
19 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
/**
|
||
* Seitenbaum für den Inhalte-Editor im Portal (Nachtrag 12).
|
||
*
|
||
* Der Editor zeigt die CMS-Sektionen nicht mehr nach Datenbank-Gruppe, sondern so, wie sie auf
|
||
* der Website stehen: je Seite in der Reihenfolge von oben nach unten, mit Klartext-Titel und
|
||
* einem Satz, der sagt, was die Sektion ist. `anchor` ist die Sprungmarke in der Vorschau
|
||
* (das `id` des Abschnitts im Frontend).
|
||
*
|
||
* Eine Sektion, die auf mehreren Seiten steht, ist einmal eingetragen – dort, wo sie zuerst
|
||
* auftaucht – und nennt die anderen Seiten in der Beschreibung.
|
||
*
|
||
* `group`/`key` sind Gruppe und Schlüssel in flux_cms_contents (siehe cms_section_map.php).
|
||
* Sektionen, die in der Datenbank liegen, aber hier nicht eingetragen sind, sammelt der Editor
|
||
* unter „Nicht mehr verwendet“ – sie gehen also nicht verloren, stehen aber auch nicht im Weg.
|
||
*
|
||
* `fields` überschreibt Feldbeschriftungen je Sektion; alles andere kommt aus `field_labels`.
|
||
*/
|
||
return [
|
||
|
||
/*
|
||
|--------------------------------------------------------------------------
|
||
| Feldbeschriftungen
|
||
|--------------------------------------------------------------------------
|
||
| Gilt für Felder auf Sektionsebene und für Felder in Listeneinträgen.
|
||
| Unbekannte Schlüssel werden lesbar gemacht (button_text → „Button text“).
|
||
*/
|
||
'field_labels' => [
|
||
'title' => 'Überschrift',
|
||
'subtitle' => 'Untertitel',
|
||
'headline' => 'Überschrift',
|
||
'tagline' => 'Claim',
|
||
'text' => 'Text',
|
||
'intro' => 'Einleitung',
|
||
'description' => 'Beschreibung',
|
||
'content' => 'Inhalt',
|
||
'lead' => 'Vorspann',
|
||
'note' => 'Hinweis',
|
||
'label' => 'Beschriftung',
|
||
'badge' => 'Kennzeichen',
|
||
'eyebrow' => 'Überzeile',
|
||
'quote' => 'Zitat',
|
||
'author' => 'Zitatgeber',
|
||
'name' => 'Name',
|
||
'role' => 'Rolle / Funktion',
|
||
'city' => 'Ort',
|
||
'value' => 'Wert',
|
||
'number' => 'Zahl',
|
||
'suffix' => 'Zusatz',
|
||
'icon' => 'Icon',
|
||
'image' => 'Bild',
|
||
'image_alt' => 'Bildbeschreibung',
|
||
'alt' => 'Bildbeschreibung',
|
||
'logo' => 'Logo',
|
||
'link' => 'Link',
|
||
'url' => 'Adresse (URL)',
|
||
'href' => 'Link',
|
||
'link_text' => 'Linktext',
|
||
'button_text' => 'Button-Beschriftung',
|
||
'button_link' => 'Button-Link',
|
||
'primary_button' => 'Erster Button',
|
||
'secondary_button' => 'Zweiter Button',
|
||
'cta_title' => 'Überschrift Abschluss',
|
||
'cta_text' => 'Text Abschluss',
|
||
'cta_link' => 'Link Abschluss',
|
||
'items' => 'Einträge',
|
||
'steps' => 'Schritte',
|
||
'cards' => 'Karten',
|
||
'stats' => 'Kennzahlen',
|
||
'features' => 'Merkmale',
|
||
'benefits' => 'Vorteile',
|
||
'values' => 'Werte',
|
||
'links' => 'Links',
|
||
'columns' => 'Spalten',
|
||
'menu' => 'Menüpunkte',
|
||
'navigation' => 'Navigation',
|
||
'topics' => 'Themen',
|
||
'options' => 'Auswahlmöglichkeiten',
|
||
'placeholder' => 'Platzhaltertext',
|
||
'meta_title' => 'Seitentitel (Browser, Google)',
|
||
'meta_description' => 'Beschreibung für Google',
|
||
'email' => 'E-Mail',
|
||
'phone' => 'Telefon',
|
||
'whatsapp' => 'WhatsApp-Nummer',
|
||
'address' => 'Adresse',
|
||
'opening_hours' => 'Öffnungszeiten',
|
||
'copyright' => 'Copyright-Zeile',
|
||
'map_alt' => 'Beschreibung der Karte',
|
||
'region_label' => 'Beschriftung der Region',
|
||
'distance_suffix' => 'Zusatz hinter der Entfernung',
|
||
'hub' => 'Drehscheibe (Bielefeld)',
|
||
'steps_title' => 'Überschrift Ablauf-Block',
|
||
'steps_text' => 'Einleitung Ablauf-Block',
|
||
'x' => 'Position waagerecht (Entwickler)',
|
||
'y' => 'Position senkrecht (Entwickler)',
|
||
'id' => 'Sprungmarke (Entwickler)',
|
||
'slug' => 'Adresskürzel (Entwickler)',
|
||
'teaser' => 'Kurztext',
|
||
'summary' => 'Zusammenfassung',
|
||
'brands' => 'Marken',
|
||
'projects' => 'Projekte',
|
||
'partners' => 'Partner',
|
||
'questions' => 'Fragen',
|
||
'question' => 'Frage',
|
||
'answer' => 'Antwort',
|
||
'read_more' => 'Weiterlesen-Text',
|
||
'empty_text' => 'Text, wenn nichts vorhanden ist',
|
||
'success_text' => 'Text nach dem Absenden',
|
||
'submit_text' => 'Beschriftung Absenden-Button',
|
||
'privacy_text' => 'Datenschutz-Hinweis',
|
||
'subjects' => 'Betreffe',
|
||
'subject' => 'Betreff',
|
||
],
|
||
|
||
/*
|
||
|--------------------------------------------------------------------------
|
||
| Seiten in der Reihenfolge des Menüs
|
||
|--------------------------------------------------------------------------
|
||
*/
|
||
'pages' => [
|
||
|
||
'home' => [
|
||
'title' => 'Startseite',
|
||
'path' => '/',
|
||
'sections' => [
|
||
['group' => 'home', 'key' => 'hero', 'anchor' => 'hero', 'title' => 'Hero',
|
||
'description' => 'Der große Einstieg ganz oben: Zeile über der Überschrift (eyebrow), Überschrift, Text, Button, Häkchen-Punkte (stats) und die Slideshow. Unter „slides“ je Bild: image, label (Marke) und caption (Motiv) – beides erscheint in der Karte über dem Bild und wechselt mit –, alt (Bildbeschreibung für Screenreader) und active (aus = ausgeblendet); die Reihenfolge der Liste ist die Reihenfolge der Slideshow. „interval“ = Sekunden pro Bild (3–30). card_title/card_text stehen in der Karte, wenn eine Slide weder label noch caption hat; image/image_alt sind das Ersatzbild, wenn keine Slide aktiv ist.'],
|
||
['group' => 'home', 'key' => 'founder_bar', 'anchor' => 'gruender', 'title' => 'Gründer-Leiste',
|
||
'description' => 'Schmale Zeile mit Marcel Scheibe und Zitat. Steht auch auf /marken, „Über uns“ und in der Immobilien-Welt.'],
|
||
['group' => 'home', 'key' => 'audience_switch', 'anchor' => 'wege', 'title' => 'Zielgruppen-Wahl',
|
||
'description' => 'Zwei Wege: Privat einrichten oder Projekt ausstatten.'],
|
||
['group' => 'home', 'key' => 'core_brands', 'anchor' => 'marken', 'title' => 'Kernmarken',
|
||
'description' => 'Überschrift und Untertitel des Marken-Rasters. Die Kacheln selbst kommen aus der Markenverwaltung.'],
|
||
['group' => 'home', 'key' => 'origin_section', 'anchor' => 'herkunft', 'title' => 'Aus der Region gefertigt',
|
||
'description' => 'Karte mit Bielefeld als Drehscheibe und der Ablauf-Block am Beispiel CABINET. Die Standorte pflegst du bei den Marken. Steht auch auf /marken.'],
|
||
['group' => 'home', 'key' => 'vision_section', 'anchor' => 'vision', 'title' => 'Gebaut auf Expertise',
|
||
'description' => 'Weiße Box auf Ocker: Überschrift, Absätze (paragraphs) und Porträt mit Bildunterschrift (image_caption).'],
|
||
['group' => 'home', 'key' => 'sponsoring', 'anchor' => 'engagement', 'title' => 'Regional verbunden',
|
||
'description' => 'Vereine, die B2in unterstützt: je Verein name, image (Logo), text und optional url – mit url öffnet die Kachel die Vereinsseite in einem neuen Tab.'],
|
||
['group' => 'referenzen', 'key' => 'display_feed', 'anchor' => 'displays', 'title' => 'Aktuelles aus dem Showroom',
|
||
'description' => '„Aktuelles aus unserem Showroom“: Überschrift, Text, Hinweis (note) und Link in der weißen Box. Das Display rechts kommt aus den Store Displays (display_id leer = das erste veröffentlichte), Besucher können es über „Größer ansehen“ vergrößern. Steht auch auf /referenzen.'],
|
||
['group' => 'home', 'key' => 'immobilien_teaser', 'anchor' => 'immobilien', 'title' => 'Immobilien-Teaser',
|
||
'description' => 'Der Übergang in die Immobilien-Welt am Ende der Startseite.'],
|
||
['group' => 'global', 'key' => 'cta_section', 'anchor' => 'cta', 'title' => 'Abschluss: Termin anfragen',
|
||
'description' => 'Der letzte Block vor dem Fuß auf der Startseite und auf /referenzen. Marken und „Über uns“ haben eigene Abschlüsse.'],
|
||
],
|
||
],
|
||
|
||
'marken' => [
|
||
'title' => 'Marken',
|
||
'path' => '/marken',
|
||
'sections' => [
|
||
['group' => 'marken', 'key' => 'hero', 'anchor' => 'seitenkopf', 'title' => 'Seitenkopf',
|
||
'description' => 'Zeile über der Überschrift (eyebrow), Überschrift, Einleitung (text), Bild und die Häkchen-Punkte (stats) oben auf /marken. Die Markenblöcke darunter kommen aus der Markenverwaltung.'],
|
||
['group' => 'marken', 'key' => 'image_break', 'anchor' => 'bild', 'title' => 'Bildpause',
|
||
'description' => 'Großes Bild zwischen den Markenblöcken und „Aus der Region gefertigt“, damit sich die beiden hellen Sektionen absetzen. Mit Zitat (quote) und Autor (author); ohne Zitat steht nur das Bild.'],
|
||
['group' => 'marken', 'key' => 'network', 'anchor' => 'netzwerk', 'title' => 'Mehr als Marken: unser Netzwerk',
|
||
'description' => 'Partner und Zulieferer jenseits der Kernmarken.'],
|
||
['group' => 'marken', 'key' => 'growth', 'anchor' => 'wachstum', 'title' => 'Die Markenwelt wächst',
|
||
'description' => 'Hinweis, dass weitere Marken folgen.'],
|
||
['group' => 'marken', 'key' => 'cta', 'anchor' => 'marken-cta', 'title' => 'Abschluss auf /marken',
|
||
'description' => 'Der Abschlussblock „Lernen Sie unsere Marken kennen“ mit Terminanfrage und WhatsApp.'],
|
||
['group' => 'marken', 'key' => 'craft', 'anchor' => 'handwerk', 'title' => 'Handwerk-Abschluss auf jeder Markenseite',
|
||
'description' => 'Der letzte Abschnitt auf den Seiten von CABINET, Rotpunkt und Febrü: „Planung plus Handwerk“ mit Link zu Otterpohl. Einmal gepflegt, überall gleich.', 'path' => '/marken/cabinet'],
|
||
],
|
||
],
|
||
|
||
'referenzen' => [
|
||
'title' => 'Referenzen',
|
||
'path' => '/referenzen',
|
||
'sections' => [
|
||
['group' => 'referenzen', 'key' => 'hero', 'anchor' => 'seitenkopf', 'title' => 'Seitenkopf',
|
||
'description' => 'Überschrift, Einleitung und Bild der Referenzen-Seite. Ob die Seite (samt Menüpunkt) erscheint, schaltest du unter „Referenzen“.'],
|
||
['group' => 'referenzen', 'key' => 'projects', 'anchor' => 'projekte', 'title' => 'Realisierte Projekte',
|
||
'description' => 'Überschrift, Text und Leerzustand über den Projekten. Die Projekte selbst pflegst du unter „Referenzen“.'],
|
||
],
|
||
],
|
||
|
||
'magazin' => [
|
||
'title' => 'Magazin',
|
||
'path' => '/magazin',
|
||
'sections' => [
|
||
['group' => 'magazin', 'key' => 'list', 'anchor' => 'magazin', 'title' => 'Magazin-Übersicht',
|
||
'description' => 'Überschrift und Einleitung der Übersicht. Die Beiträge pflegst du unter „Magazin“.'],
|
||
['group' => 'magazin', 'key' => 'detail', 'anchor' => null, 'title' => 'Beitragsseite',
|
||
'description' => 'Feste Texte auf jeder Beitragsseite, etwa „Zurück zur Übersicht“ und „Weitere Beiträge“.'],
|
||
],
|
||
],
|
||
|
||
'about' => [
|
||
'title' => 'Über uns',
|
||
'path' => '/about',
|
||
'sections' => [
|
||
['group' => 'about', 'key' => 'hero', 'anchor' => 'seitenkopf', 'title' => 'Seitenkopf',
|
||
'description' => 'Zeile über der Überschrift (eyebrow), Überschrift, Zitat, Name und Funktion sowie Bild mit Infokarte (card_title, card_text).'],
|
||
['group' => 'about', 'key' => 'our_story', 'anchor' => 'geschichte', 'title' => 'Unsere Geschichte',
|
||
'description' => 'Überschrift, Text (summary) und die Zeitleiste (timeline) zur Entstehung von B2in.'],
|
||
['group' => 'about', 'key' => 'image_break', 'anchor' => 'bild', 'title' => 'Bildpause',
|
||
'description' => 'Großes Bild zwischen Geschichte und Werten, mit Zitat (quote) und Autor (author).'],
|
||
['group' => 'about', 'key' => 'our_values', 'anchor' => 'werte', 'title' => 'Unsere Werte',
|
||
'description' => 'Die Werte-Kacheln.'],
|
||
['group' => 'about', 'key' => 'partner_cta', 'anchor' => 'cta', 'title' => 'Abschluss auf „Über uns“',
|
||
'description' => 'Der Abschlussblock am Ende von „Über uns“.'],
|
||
],
|
||
],
|
||
|
||
'contact' => [
|
||
'title' => 'Kontakt',
|
||
'path' => '/contact',
|
||
'sections' => [
|
||
['group' => 'contact', 'key' => 'contact_form', 'anchor' => 'kontakt', 'title' => 'Kontaktformular',
|
||
'description' => 'Kopf des Formulars (hero: eyebrow, title, subtitle), Betreffe, Feldbeschriftungen und Datenschutz-Hinweis.'],
|
||
['group' => 'global', 'key' => 'contact', 'anchor' => 'kontakt', 'title' => 'Kontaktdaten',
|
||
'description' => 'Telefon, E-Mail, Adresse und die WhatsApp-Nummer. Ohne WhatsApp-Nummer erscheint kein WhatsApp-Button.'],
|
||
],
|
||
],
|
||
|
||
'faq' => [
|
||
'title' => 'FAQ',
|
||
'path' => '/faq',
|
||
'sections' => [
|
||
['group' => 'faq', 'key' => 'faq', 'anchor' => 'faq', 'title' => 'Fragen und Antworten',
|
||
'description' => 'Überschrift und die Liste der Fragen der Interior-Welt.'],
|
||
],
|
||
],
|
||
|
||
'global' => [
|
||
'title' => 'Auf jeder Seite',
|
||
'path' => '/',
|
||
'sections' => [
|
||
['group' => 'global', 'key' => 'announcement_bar', 'anchor' => 'header', 'title' => 'Hinweisleiste',
|
||
'description' => 'Schmale Zeile ganz oben über dem Menü (text, badge, Link). „enabled“ schaltet sie ein. Zurzeit ist die Leiste für die ganze Website über B2IN_ANNOUNCEMENT_BAR in der .env aus – Änderungen hier erscheinen erst, wenn sie dort eingeschaltet ist.'],
|
||
['group' => 'global', 'key' => 'header', 'anchor' => 'header', 'title' => 'Hauptmenü',
|
||
'description' => 'Menüpunkte und Buttons im Kopf der Interior-Welt. Der Punkt „Referenzen“ erscheint nur, solange die Referenzen-Seite eingeschaltet ist.'],
|
||
['group' => 'global', 'key' => 'appointment_widget', 'anchor' => null, 'title' => 'Terminanfrage-Widget',
|
||
'description' => 'Das schwebende Widget rechts unten: Texte, Themen und Zeitfenster.'],
|
||
['group' => 'global', 'key' => 'footer', 'anchor' => 'footer', 'title' => 'Fußbereich',
|
||
'description' => 'Claim, Zeile unter dem Claim (byline) und die Linkliste (links) im Fuß.'],
|
||
],
|
||
],
|
||
|
||
'immobilien' => [
|
||
'title' => 'Immobilien-Welt',
|
||
'path' => '/immobilien',
|
||
'sections' => [
|
||
['group' => 'global', 'key' => 'announcement_bar_immobilien', 'anchor' => 'header', 'title' => 'Hinweisleiste (Immobilien)',
|
||
'description' => 'Hinweisleiste über dem Menü der Immobilien-Welt. Wie die Interior-Leiste zurzeit über B2IN_ANNOUNCEMENT_BAR ausgeschaltet.'],
|
||
['group' => 'global', 'key' => 'header_immobilien', 'anchor' => 'header', 'title' => 'Hauptmenü (Immobilien)',
|
||
'description' => 'Menüpunkte und Buttons im Kopf der Immobilien-Welt.'],
|
||
['group' => 'global', 'key' => 'cta_section_immobilien', 'anchor' => 'cta', 'title' => 'Abschluss (Immobilien)',
|
||
'description' => 'Der letzte Block vor dem Fuß auf allen Immobilien-Seiten.'],
|
||
['group' => 'immobilien', 'key' => 'magazin_list', 'anchor' => 'magazin', 'title' => 'Magazin-Übersicht (Immobilien)',
|
||
'description' => 'Überschrift und Einleitung unter /immobilien/magazin.', 'path' => '/immobilien/magazin'],
|
||
['group' => 'immobilien', 'key' => 'about_hero', 'anchor' => 'seitenkopf', 'title' => 'Über B2in: Seitenkopf',
|
||
'description' => 'Überschrift, Zitat, Name und Funktion sowie Bild mit Infokarte unter /immobilien/ueber-b2in.', 'path' => '/immobilien/ueber-b2in'],
|
||
['group' => 'immobilien', 'key' => 'our_story', 'anchor' => 'geschichte', 'title' => 'Über B2in: Geschichte',
|
||
'description' => 'Der Geschichte-Block der Immobilien-Welt.', 'path' => '/immobilien/ueber-b2in'],
|
||
['group' => 'immobilien', 'key' => 'about_image_break', 'anchor' => 'bild', 'title' => 'Über B2in: Bildpause',
|
||
'description' => 'Bild zwischen Geschichte und Werten.', 'path' => '/immobilien/ueber-b2in'],
|
||
['group' => 'immobilien', 'key' => 'our_values', 'anchor' => 'werte', 'title' => 'Über B2in: Werte',
|
||
'description' => 'Die Werte-Kacheln der Immobilien-Welt.', 'path' => '/immobilien/ueber-b2in'],
|
||
['group' => 'faq', 'key' => 'faq_immobilien', 'anchor' => 'faq', 'title' => 'FAQ (Immobilien)',
|
||
'description' => 'Fragen und Antworten unter /immobilien/faq.', 'path' => '/immobilien/faq'],
|
||
['group' => 'contact', 'key' => 'contact_form_immobilien', 'anchor' => 'kontakt', 'title' => 'Kontaktformular (Immobilien)',
|
||
'description' => 'Abweichende Texte und Betreffe unter /immobilien/kontakt. Leere Felder übernehmen den Interior-Wert.', 'path' => '/immobilien/kontakt'],
|
||
],
|
||
],
|
||
|
||
'legal' => [
|
||
'title' => 'Rechtliches',
|
||
'path' => '/impressum',
|
||
'sections' => [
|
||
['group' => 'legal', 'key' => 'impressum', 'anchor' => null, 'title' => 'Impressum',
|
||
'description' => 'Pflichtangaben. Der Inhalt ist HTML.', 'path' => '/impressum'],
|
||
['group' => 'legal', 'key' => 'privacy', 'anchor' => null, 'title' => 'Datenschutz',
|
||
'description' => 'Datenschutzerklärung. Der Inhalt ist HTML.', 'path' => '/privacy'],
|
||
['group' => 'legal', 'key' => 'terms', 'anchor' => null, 'title' => 'Nutzungsbedingungen',
|
||
'description' => 'Nutzungsbedingungen der Website. Der Inhalt ist HTML.', 'path' => '/terms'],
|
||
['group' => 'legal', 'key' => 'cookie_policy', 'anchor' => null, 'title' => 'Cookie-Hinweise',
|
||
'description' => 'Cookie-Richtlinie. Der Inhalt ist HTML.', 'path' => '/cookie-policy'],
|
||
],
|
||
],
|
||
|
||
],
|
||
|
||
/*
|
||
|--------------------------------------------------------------------------
|
||
| Sammelpunkt für alles, was in der Datenbank liegt, aber oben nicht steht
|
||
|--------------------------------------------------------------------------
|
||
*/
|
||
'unlisted' => [
|
||
'title' => 'Nicht mehr verwendet',
|
||
'description' => 'Einträge in der Datenbank, die keine Seite anzeigt. Normalerweise leer – der UnusedCmsContentCleanupSeeder räumt solche Einträge ab.',
|
||
],
|
||
];
|