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>
121 lines
4.7 KiB
PHP
121 lines
4.7 KiB
PHP
<?php
|
||
|
||
namespace Database\Seeders;
|
||
|
||
use FluxCms\Core\Models\CmsContent;
|
||
use FluxCms\Core\Services\CmsContentService;
|
||
use Illuminate\Database\Seeder;
|
||
|
||
/**
|
||
* Hero der Startseite (Abstimmung 01.10.2026, Briefing Marcel 24.09.2026 Punkte 3 und 5).
|
||
*
|
||
* Setzt im CMS-Eintrag home/hero die neue Überschrift „Räume aus einer Hand. Mit starken Marken
|
||
* und persönlichen Lösungen.“ und entfernt den zweiten Button „Termin anfragen“ (der feste
|
||
* Termin-Button unten rechts bleibt). Die Überschrift wird nur ersetzt, solange noch die alte
|
||
* „B2in Interior – Premium-Einrichtung …“ drinsteht – eine eigene Formulierung im CMS bleibt.
|
||
*
|
||
* Abstimmung 07.10.2026: Zeile „B2in Interior“ über der Überschrift (`eyebrow`, nur wenn noch
|
||
* keine gepflegt ist), Untertitel „Wir vereinen …“ (ersetzt nur den bisherigen) und das erste
|
||
* Slideshow-Bild trägt in der Karte „B2in Interior“ statt „Rotpunkt Küchen“.
|
||
* Mehrfaches Ausführen ist unbedenklich.
|
||
*
|
||
* php artisan db:seed --class=HomeHeroTextSeeder
|
||
*/
|
||
class HomeHeroTextSeeder extends Seeder
|
||
{
|
||
/** @var array<string, array{old: string, new: string}> */
|
||
public const TITLES = [
|
||
'de' => [
|
||
'old' => 'Premium-Einrichtung von starken Marken',
|
||
'new' => '<span class="text-secondary">Räume aus einer Hand.</span><br>Mit starken Marken und persönlichen Lösungen.',
|
||
],
|
||
'en' => [
|
||
'old' => 'Premium furnishing from strong brands',
|
||
'new' => '<span class="text-secondary">Spaces from a single source.</span><br>With strong brands and personal solutions.',
|
||
],
|
||
];
|
||
|
||
/** @var array<string, array{old: string, new: string}> */
|
||
public const SUBTITLES = [
|
||
'de' => [
|
||
'old' => 'Von der einzelnen Maßanfertigung bis zur vollständigen Ausstattung',
|
||
'new' => 'Wir vereinen CABINET, Rotpunkt Küchen, Febrü und ein Netzwerk regionaler Experten, um individuelle Interior-Lösungen für Ihr Zuhause oder Ihr Projekt zu realisieren.',
|
||
],
|
||
'en' => [
|
||
'old' => 'From a single bespoke piece to a complete fit-out',
|
||
'new' => 'We bring together CABINET, Rotpunkt Küchen, Febrü and a network of regional experts to create individual interior solutions for your home or your project.',
|
||
],
|
||
];
|
||
|
||
public const EYEBROW = 'B2in Interior';
|
||
|
||
public const FIRST_SLIDE_IMAGE = 'b2in/slideshow/rotpunkt-fenix-house.webp';
|
||
|
||
public const FIRST_SLIDE_LABEL = ['old' => 'Rotpunkt Küchen', 'new' => 'B2in Interior'];
|
||
|
||
public function run(): void
|
||
{
|
||
$row = CmsContent::query()->where('group', 'home')->where('key', 'hero')->first();
|
||
|
||
if (! $row) {
|
||
$this->command?->info('Hero: Sektion home/hero nicht im CMS – die Lang-Datei gilt.');
|
||
|
||
return;
|
||
}
|
||
|
||
$value = $row->getTranslations('value');
|
||
$changed = false;
|
||
|
||
foreach ($value as $locale => $content) {
|
||
if (! is_array($content)) {
|
||
continue;
|
||
}
|
||
|
||
$title = self::TITLES[$locale] ?? null;
|
||
|
||
if ($title && str_contains((string) ($content['title'] ?? ''), $title['old'])) {
|
||
$content['title'] = $title['new'];
|
||
$changed = true;
|
||
}
|
||
|
||
$subtitle = self::SUBTITLES[$locale] ?? null;
|
||
|
||
if ($subtitle && str_contains((string) ($content['subtitle'] ?? ''), $subtitle['old'])) {
|
||
$content['subtitle'] = $subtitle['new'];
|
||
$changed = true;
|
||
}
|
||
|
||
if (! filled($content['eyebrow'] ?? null)) {
|
||
$content['eyebrow'] = self::EYEBROW;
|
||
$changed = true;
|
||
}
|
||
|
||
foreach ((array) ($content['slides'] ?? []) as $index => $slide) {
|
||
if (is_array($slide) && ($slide['image'] ?? null) === self::FIRST_SLIDE_IMAGE
|
||
&& ($slide['label'] ?? null) === self::FIRST_SLIDE_LABEL['old']) {
|
||
$content['slides'][$index]['label'] = self::FIRST_SLIDE_LABEL['new'];
|
||
$changed = true;
|
||
}
|
||
}
|
||
|
||
if (array_key_exists('cta2_text', $content) || array_key_exists('cta2_link', $content)) {
|
||
unset($content['cta2_text'], $content['cta2_link']);
|
||
$changed = true;
|
||
}
|
||
|
||
$value[$locale] = $content;
|
||
}
|
||
|
||
if (! $changed) {
|
||
$this->command?->info('Hero: bereits aktuell, nichts geändert.');
|
||
|
||
return;
|
||
}
|
||
|
||
$row->value = $value;
|
||
$row->save();
|
||
app(CmsContentService::class)->clearCache('home');
|
||
|
||
$this->command?->info('Hero: Texte aktualisiert (Überschrift, Zeile darüber, Untertitel, erste Slide).');
|
||
}
|
||
}
|