Gruppe.Schlüssel der toten Sektionen */ public const UNUSED = [ 'about.leadership_team', 'home.brand_worlds', 'home.ecosystem_core', 'home.hero_slider', 'home.integriertes_modell_b2in', 'home.synergie_section', 'immobilien.bruecke', 'immobilien.hero', 'immobilien.hero_v2', 'immobilien.image_break', 'immobilien.kaufprozess', 'immobilien.mindset', 'immobilien.moebel_vorteil', 'immobilien.portfolio', 'immobilien.projects_meta', 'immobilien.trust', 'immobilien.warum_dubai', 'global.cta_section_portfolio', 'netzwerk.broker_section', 'netzwerk.cabinet_partner', 'netzwerk.commitment_section', 'netzwerk.cta', 'netzwerk.dark_stats_section', 'netzwerk.digital_core', 'netzwerk.ecosystem_hero', 'netzwerk.ecosystem_hub', 'netzwerk.ecosystem_result', 'netzwerk.ecosystem_start', 'netzwerk.ecosystem_stats', 'netzwerk.end_customer_section', 'netzwerk.final_commitment', 'netzwerk.hero', 'netzwerk.image_break', 'netzwerk.immobilien_hint', 'netzwerk.interior_brands', 'netzwerk.interior_concept', 'netzwerk.interior_hero', 'netzwerk.interior_process', 'netzwerk.interior_trust', 'netzwerk.interior_zielgruppen', 'netzwerk.partner_benefits', 'netzwerk.partner_benefits_broker', 'netzwerk.partner_benefits_developer', 'netzwerk.partner_benefits_retailer', 'netzwerk.partner_benefits_supplier', 'netzwerk.partner_card_section', 'netzwerk.partner_hero', 'netzwerk.partner_process', 'netzwerk.supplier_section', 'netzwerk.supply_chain_intro', 'netzwerk.teasers', ]; /** @var array> Gruppe.Schlüssel → Felder, die keine Vorlage ausgibt */ public const UNUSED_FIELDS = [ 'about.partner_cta' => ['stats'], 'contact.contact_form' => ['social_media'], 'magazin.list' => ['load_more'], 'immobilien.magazin_list' => ['load_more'], 'magazin.detail' => ['share_article'], // Kacheln kommen aus der Markenverwaltung; die Liste war im CMS ohne Wirkung (07.10.2026). 'home.core_brands' => ['brands'], ]; public function run(): void { $moved = $this->movePartnerCta(); $stripped = $this->stripUnusedFields(); if ($stripped > 0) { $this->command?->info("CMS-Aufräumen: ungenutzte Felder aus {$stripped} Sektion(en) entfernt."); } $rows = $this->unusedRows(); if ($rows === []) { $this->command?->info('CMS-Aufräumen: keine toten Sektionen (mehr) vorhanden'.($moved ? ', partner_cta verschoben.' : '.')); return; } $path = 'cms-archiv/cms-content-geloescht-'.now()->format('Y-m-d_His').'.json'; Storage::disk('local')->put($path, json_encode( array_map(fn (CmsContent $row) => [ 'group' => $row->group, 'key' => $row->key, 'type' => $row->type, 'order' => $row->order, 'value' => $row->getTranslations('value'), ], $rows), JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES, )); $groups = []; foreach ($rows as $row) { $groups[$row->group] = true; $row->delete(); } foreach (array_keys($groups) as $group) { app(CmsContentService::class)->clearCache($group); } $this->command?->info(sprintf( 'CMS-Aufräumen: %d tote Sektionen gelöscht, Sicherung unter %s%s', count($rows), Storage::disk('local')->path($path), $moved ? ', partner_cta nach „about“ verschoben.' : '.', )); } /** * @return list */ private function unusedRows(): array { return CmsContent::query()->get() ->filter(fn (CmsContent $row) => in_array($row->group.'.'.$row->key, self::UNUSED, true)) ->values() ->all(); } /** * Zieht den Abschluss der Über-uns-Seite in die Gruppe „about“. */ private function movePartnerCta(): bool { $old = CmsContent::query()->where('group', 'netzwerk')->where('key', 'partner_cta')->first(); $current = CmsContent::query()->where('group', 'about')->where('key', 'partner_cta')->first(); $changed = false; if ($old && ! $current) { $old->group = 'about'; $old->save(); $current = $old; $changed = true; } elseif ($old) { $old->delete(); $changed = true; } if ($changed) { app(CmsContentService::class)->clearCache('netzwerk'); app(CmsContentService::class)->clearCache('about'); } return $changed; } /** * Entfernt die Felder aus {@see self::UNUSED_FIELDS} in allen Sprachen. */ private function stripUnusedFields(): int { $count = 0; foreach (self::UNUSED_FIELDS as $section => $fields) { [$group, $key] = explode('.', $section, 2); $row = CmsContent::query()->where('group', $group)->where('key', $key)->first(); if (! $row) { continue; } $value = $row->getTranslations('value'); $stripped = array_map( fn ($content) => is_array($content) ? array_diff_key($content, array_flip($fields)) : $content, $value, ); if ($stripped === $value) { continue; } $row->value = $stripped; $row->save(); app(CmsContentService::class)->clearCache($group); $count++; } return $count; } }