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>
104 lines
4.6 KiB
PHP
104 lines
4.6 KiB
PHP
<?php
|
||
|
||
namespace Database\Seeders;
|
||
|
||
use FluxCms\Core\Models\CmsContent;
|
||
use FluxCms\Core\Services\CmsContentService;
|
||
use Illuminate\Database\Seeder;
|
||
|
||
/**
|
||
* Textkorrekturen auf /about (Abstimmung 06.10.2026, Nachtrag 21).
|
||
*
|
||
* „… am Ende auch dafür geradesteht“, dazu Flüchtigkeits- und Formulierungsfehler: Komma bei
|
||
* „wenigen ausgewählten“, deutsche Anführungszeichen im Zitat, „Wort halten“, Otterpohl als
|
||
* vierte Kernmarke in der Zeitleiste, „ungenutzt“ statt „liegen lässt“, „B2in-Partner“ und
|
||
* ein Alternativtext für die Bildpause, der das Bild beschreibt (nur Interior-Welt).
|
||
* Der Seeder tauscht nur genau diese Textstellen in den betroffenen CMS-Sektionen; alles andere
|
||
* bleibt. Steht eine Stelle nicht mehr drin, passiert dort nichts. Mehrfaches Ausführen ist unbedenklich.
|
||
*
|
||
* php artisan db:seed --class=AboutPageTextSeeder
|
||
*/
|
||
class AboutPageTextSeeder extends Seeder
|
||
{
|
||
/** @var list<array{0: string, 1: string}> Gruppe und Schlüssel der Sektionen */
|
||
public const SECTIONS = [
|
||
['about', 'hero'],
|
||
['about', 'image_break'],
|
||
['about', 'our_story'],
|
||
['about', 'our_values'],
|
||
['about', 'partner_cta'],
|
||
['netzwerk', 'partner_cta'],
|
||
];
|
||
|
||
/** @var array<string, string> alte Stelle → neue Stelle */
|
||
public const REPLACEMENTS = [
|
||
'aufmisst und am Ende geradesteht.' => 'aufmisst und am Ende auch dafür geradesteht.',
|
||
'mit wenigen, ausgewählten Herstellern' => 'mit wenigen ausgewählten Herstellern',
|
||
'"Gute Einrichtung entsteht' => '„Gute Einrichtung entsteht',
|
||
'bis nach der Montage."' => 'bis nach der Montage.“',
|
||
'verbunden durch dieselbe Grundhaltung, dass Qualität und Wort halten zusammengehören.' => 'verbunden durch dieselbe Grundhaltung: Zu Qualität gehört, Wort zu halten.',
|
||
'2026 rückt das Interior in den Mittelpunkt: Mit CABINET, Rotpunkt Küchen und Febrü stehen starke Kernmarken im Zentrum, ergänzt um ein Netzwerk regionaler Fachexperten. Internationale Immobilien bleiben als ergänzender Bereich bestehen.' => '2026 rückt die Einrichtung in den Mittelpunkt: CABINET, Rotpunkt Küchen, Febrü und Otterpohl Möbelservice bilden die Kernmarken, ergänzt um ein Netzwerk regionaler Fachexperten. Internationale Immobilien bleiben als zweiter Bereich bestehen.',
|
||
'Wir planen den Raum, den ein Standardmöbel liegen lässt.' => 'Wir planen auch den Raum, den ein Standardmöbel ungenutzt lässt.',
|
||
'Werden Sie B2in Partner' => 'Werden Sie B2in-Partner',
|
||
'B2in – Immobilien und Einrichtung verbinden' => 'Wohnraum halb als Planungsskizze, halb fertig eingerichtet',
|
||
'B2in – Connecting Real Estate and Interior' => 'Living space, half planning sketch, half fully furnished',
|
||
'In 2026 interiors move to the centre: CABINET, Rotpunkt Küchen and Febrü form the core, complemented by a network of regional specialists. International real estate remains as a complementary area.' => 'In 2026 interiors move to the centre: CABINET, Rotpunkt Küchen, Febrü and Otterpohl Möbelservice form the core, complemented by a network of regional specialists. International real estate remains as a second area.',
|
||
];
|
||
|
||
public function run(): void
|
||
{
|
||
$total = 0;
|
||
|
||
foreach (self::SECTIONS as [$group, $key]) {
|
||
$row = CmsContent::query()->where('group', $group)->where('key', $key)->first();
|
||
|
||
if (! $row) {
|
||
continue;
|
||
}
|
||
|
||
$count = 0;
|
||
$value = $this->replaceDeep($row->getTranslations('value'), $count);
|
||
|
||
if ($count === 0) {
|
||
continue;
|
||
}
|
||
|
||
$row->value = $value;
|
||
$row->save();
|
||
app(CmsContentService::class)->clearCache($group);
|
||
$total += $count;
|
||
}
|
||
|
||
$this->command?->info($total > 0
|
||
? "About-Texte korrigiert ({$total} Stelle(n))."
|
||
: 'About-Texte: bereits aktuell oder nicht im CMS – nichts geändert.');
|
||
}
|
||
|
||
/**
|
||
* @param array<mixed> $data
|
||
* @return array<mixed>
|
||
*/
|
||
private function replaceDeep(array $data, int &$count): array
|
||
{
|
||
foreach ($data as $key => $item) {
|
||
if (is_array($item)) {
|
||
$data[$key] = $this->replaceDeep($item, $count);
|
||
|
||
continue;
|
||
}
|
||
|
||
if (! is_string($item)) {
|
||
continue;
|
||
}
|
||
|
||
$replaced = strtr($item, self::REPLACEMENTS);
|
||
|
||
if ($replaced !== $item) {
|
||
$data[$key] = $replaced;
|
||
$count++;
|
||
}
|
||
}
|
||
|
||
return $data;
|
||
}
|
||
}
|