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>
84 lines
2.6 KiB
PHP
84 lines
2.6 KiB
PHP
<?php
|
||
|
||
namespace App\Livewire\Web\Components\Sections;
|
||
|
||
use App\Models\Display;
|
||
use App\Models\DisplayPlaylist;
|
||
use Livewire\Component;
|
||
|
||
/**
|
||
* Spiegelt ein Showroom-Display im Hochformat (9:16) auf der Website.
|
||
*
|
||
* Quelle ist dasselbe veröffentlichte Playlist wie beim physischen Display – Marcel pflegt
|
||
* weiterhin nur im Display-CMS, hier entsteht keine zweite Pflegestelle.
|
||
*/
|
||
class DisplayFeed extends Component
|
||
{
|
||
/** @var array<string, mixed> */
|
||
public array $content = [];
|
||
|
||
public ?int $displayId = null;
|
||
|
||
public string $bg = '';
|
||
|
||
public bool $showLink = true;
|
||
|
||
public function mount(string $bg = '', bool $showLink = true): void
|
||
{
|
||
$section = cms_theme_section('display_feed');
|
||
$content = is_array($section) ? $section : [];
|
||
|
||
$this->bg = $bg;
|
||
$this->showLink = $showLink && $this->linkTargetVisible($content);
|
||
$this->displayId = $this->resolveDisplayId($content);
|
||
|
||
// Ohne Display bleiben auch die Texte leer – sie hätten sonst nichts zu beschriften und
|
||
// stünden trotzdem im Livewire-Snapshot der Seite.
|
||
$this->content = $this->displayId === null ? [] : $content;
|
||
}
|
||
|
||
/**
|
||
* Im CMS hinterlegtes Display, sonst das erste aktive mit veröffentlichter Playlist.
|
||
*
|
||
* Ohne passendes Display rendert die Sektion nichts – lieber keine Sektion als ein
|
||
* Rahmen, in dem sich ewig ein Ladebalken dreht.
|
||
*
|
||
* @param array<string, mixed> $content
|
||
*/
|
||
private function resolveDisplayId(array $content): ?int
|
||
{
|
||
$configured = $content['display_id'] ?? null;
|
||
|
||
$query = Display::query()
|
||
->where('is_active', true)
|
||
->whereHas('playlists', fn ($q) => $q->where('status', DisplayPlaylist::STATUS_PUBLISHED)
|
||
->whereHas('modules'));
|
||
|
||
if (is_numeric($configured) && (int) $configured > 0) {
|
||
$display = (clone $query)->whereKey((int) $configured)->first();
|
||
|
||
if ($display !== null) {
|
||
return $display->id;
|
||
}
|
||
}
|
||
|
||
return $query->orderBy('id')->value('id');
|
||
}
|
||
|
||
public function render()
|
||
{
|
||
return view('livewire.web.components.sections.display-feed');
|
||
}
|
||
|
||
/**
|
||
* Der Button führt standardmäßig auf /referenzen – ist die Seite im CMS ausgeblendet, entfällt er.
|
||
*
|
||
* @param array<string, mixed> $content
|
||
*/
|
||
private function linkTargetVisible(array $content): bool
|
||
{
|
||
$path = rtrim(parse_url((string) ($content['link_url'] ?? '/referenzen'), PHP_URL_PATH) ?? '', '/');
|
||
|
||
return $path !== '/referenzen' || references_page_enabled();
|
||
}
|
||
}
|