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>
95 lines
3.7 KiB
PHP
95 lines
3.7 KiB
PHP
<?php
|
||
|
||
namespace Database\Seeders;
|
||
|
||
use FluxCms\Core\Models\CmsContent;
|
||
use FluxCms\Core\Services\CmsContentService;
|
||
use Illuminate\Database\Seeder;
|
||
|
||
/**
|
||
* Zeile über der Hero-Überschrift (`eyebrow`) auf Marken, Über uns und Kontakt (Abstimmung
|
||
* 07.10.2026, wie auf der Startseite). Ergänzt sie in den CMS-Einträgen aus der Lang-Datei,
|
||
* nur wenn dort noch keine gepflegt ist – oder noch der erste Vorschlag „Unsere Marken“ drinsteht
|
||
* (seit 07.10. auch auf Marken „B2in Interior“). Auf Über uns fällt das vorangestellte
|
||
* „Über B2in:“ aus der Überschrift, das steht jetzt in der Zeile darüber.
|
||
* Fehlt ein Eintrag im CMS, gilt ohnehin die Lang-Datei. Mehrfaches Ausführen ist unbedenklich.
|
||
*
|
||
* php artisan db:seed --class=PageHeroEyebrowSeeder
|
||
*/
|
||
class PageHeroEyebrowSeeder extends Seeder
|
||
{
|
||
/** @var array<string, array{group: string, key: string, lang: string, path: list<string>}> */
|
||
public const SECTIONS = [
|
||
'marken' => ['group' => 'marken', 'key' => 'hero', 'lang' => 'marken_hero', 'path' => []],
|
||
'about' => ['group' => 'about', 'key' => 'hero', 'lang' => 'about_hero', 'path' => []],
|
||
'contact' => ['group' => 'contact', 'key' => 'contact_form', 'lang' => 'contact_form', 'path' => ['hero']],
|
||
];
|
||
|
||
/** @var list<string> Frühere Vorschläge, die durch den Text der Lang-Datei ersetzt werden */
|
||
public const FORMER_EYEBROWS = ['Unsere Marken', 'Our brands'];
|
||
|
||
/** @var array<string, list<string>> Abschnitt → Präfixe, die aus der Überschrift fallen */
|
||
public const TITLE_PREFIXES = [
|
||
'about' => [
|
||
'<span class="text-secondary">Über B2in:</span> ',
|
||
'<span class="text-secondary">About B2in:</span> ',
|
||
],
|
||
];
|
||
|
||
public function run(): void
|
||
{
|
||
$updated = [];
|
||
|
||
foreach (self::SECTIONS as $name => $section) {
|
||
$row = CmsContent::query()->where('group', $section['group'])->where('key', $section['key'])->first();
|
||
|
||
if (! $row) {
|
||
continue;
|
||
}
|
||
|
||
$value = $row->getTranslations('value');
|
||
$changed = false;
|
||
|
||
foreach ($value as $locale => $content) {
|
||
if (! is_array($content)) {
|
||
continue;
|
||
}
|
||
|
||
$langPath = implode('.', ['b2in.themes.b2in', $section['lang'], ...$section['path'], 'eyebrow']);
|
||
$eyebrow = trans($langPath, [], $locale);
|
||
$fieldPath = implode('.', [...$section['path'], 'eyebrow']);
|
||
|
||
$current = data_get($content, $fieldPath);
|
||
|
||
if ($eyebrow !== $langPath && $current !== $eyebrow
|
||
&& (! filled($current) || in_array($current, self::FORMER_EYEBROWS, true))) {
|
||
data_set($content, $fieldPath, $eyebrow);
|
||
$changed = true;
|
||
}
|
||
|
||
foreach (self::TITLE_PREFIXES[$name] ?? [] as $prefix) {
|
||
$titlePath = implode('.', [...$section['path'], 'title']);
|
||
$title = (string) data_get($content, $titlePath, '');
|
||
|
||
if (str_starts_with($title, $prefix)) {
|
||
data_set($content, $titlePath, substr($title, strlen($prefix)));
|
||
$changed = true;
|
||
}
|
||
}
|
||
|
||
$value[$locale] = $content;
|
||
}
|
||
|
||
if ($changed) {
|
||
$row->value = $value;
|
||
$row->save();
|
||
app(CmsContentService::class)->clearCache($section['group']);
|
||
$updated[] = $name;
|
||
}
|
||
}
|
||
|
||
$this->command?->info($updated === []
|
||
? 'Hero-Zeilen: bereits aktuell, nichts geändert.'
|
||
: 'Hero-Zeilen ergänzt: '.implode(', ', $updated).'.');
|
||
}
|
||
}
|