Sportfest-Ausgabe der Stadionzeitung zum Heimspiel gegen ATS Wartenfels
Neue Live-Seiten, geschaltet vom chat-gepflegten Feld `veranstaltung` (Slug aus data/veranstaltungen.json) — Programm und Turnierpläne kommen damit aus derselben Quelle wie die Website, nicht als Kopie ins Heft: - Programm-Seite (programm[], rendert zugleich auf /veranstaltungen/sportfest-2026) - vier Turnierplan-Seiten (turniere[]) mit leerer Ergebnisspalte und leerer Abschlusstabelle zum Eintragen am Platz - Gegnerseite je Mannschaft mit Heimspiel am Fest statt nur der tragenden: stadionzeitung_gegner_fixtures() ist die einzige Stelle, die das entscheidet, Seitenplanung und Snapshot lesen beide dort. `gegner` ist deshalb eine Map je Team-Key; die Vorschau überspringt jedes Spiel mit eigener Gegnerseite - Danke-Seite mit Partner-Logo-Wand aus data/partners.json und QR auf /partner-werden, dazu das Anzeigen-Feld `platzierung` für Motive mit festem Platz auf einer Live-Seite (Emons über der Logo-Wand). Vorher klebte der Dank als leere Fläche unten an einem Anzeigen-Bild - Cover einer Sonderausgabe: das Fest als Titelgeschichte statt einer der drei Begegnungen, dazu das Hauptplakat schräg gelegt an Stelle des Spielerfotos Ausgabe 2026-09-04-ats-wartenfels als ENTWURF angelegt, 48 Seiten (12 Bögen), Tabellen auf gerader Seite, längster Anzeigenblock zwei. Veröffentlicht wird auf dem Server, dort liegt der frische Matchcenter-Stand. Nebenbei behoben: bin/anzeige-add.php räumte beim Anlegen alle Motive weg, deren Slug mit demselben Text beginnt (`emons` löschte `emons-partnerdank` und `emons-stuebinger`). Muster jetzt auf die Breiten-Endung eingeschränkt. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KubsajzuV6N6QsSd3xKNjC
This commit is contained in:
@@ -326,6 +326,41 @@ if (is_file($szFile)) {
|
||||
}
|
||||
}
|
||||
|
||||
// --- Stadionzeitung ↔ Veranstaltung (Sportfest-Ausgabe) ---
|
||||
// Eine Ausgabe mit `veranstaltung`-Feld zieht Programm, Turnierpläne und die
|
||||
// Gegnerseiten je Heimspiel aus data/veranstaltungen.json. Ein Tippfehler im Slug
|
||||
// oder im Turnier-Key rendert dort eine LEERE A5-Seite — ohne Fehlermeldung, weil
|
||||
// die Komponenten bewusst still zurückkehren. Deshalb hier laut.
|
||||
if (is_file($szFile)) {
|
||||
$szData = $szData ?? (json_decode((string) file_get_contents($szFile), true) ?: []);
|
||||
$vBySlug = array_column($veranstaltungRows, null, 'slug');
|
||||
foreach ($szData['issues'] ?? [] as $ausgabe) {
|
||||
$vSlug = (string) ($ausgabe['veranstaltung'] ?? '');
|
||||
if ($vSlug === '') {
|
||||
continue;
|
||||
}
|
||||
if (!isset($vBySlug[$vSlug])) {
|
||||
$errors[] = "Stadionzeitung '{$ausgabe['slug']}': veranstaltung '{$vSlug}' fehlt in data/veranstaltungen.json.";
|
||||
continue;
|
||||
}
|
||||
$turniere = $vBySlug[$vSlug]['turniere'] ?? [];
|
||||
foreach ($turniere as $i => $turnier) {
|
||||
foreach (['key', 'title', 'date', 'teams', 'spiele'] as $feld) {
|
||||
if (empty($turnier[$feld])) {
|
||||
$warnings[] = "data/veranstaltungen.json, '{$vSlug}' → turniere[{$i}]: Feld '{$feld}' fehlt oder ist leer.";
|
||||
}
|
||||
}
|
||||
}
|
||||
$keys = array_column($turniere, 'key');
|
||||
foreach ($ausgabe['images'] ?? [] as $seite) {
|
||||
if (($seite['type'] ?? '') === 'live' && ($seite['page'] ?? '') === 'turnier'
|
||||
&& !in_array((string) ($seite['turnier'] ?? ''), $keys, true)) {
|
||||
$errors[] = "Stadionzeitung '{$ausgabe['slug']}': Turnierseite '" . ($seite['turnier'] ?? '') . "' hat keinen Eintrag in turniere[] von '{$vSlug}'.";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --- Inline-Styles (die CSP verwirft sie stillschweigend) ---
|
||||
// Diese Prüfung existiert wegen eines echten Ausfalls am 31.07.2026: der
|
||||
// Banner-Slider setzte sein Hintergrundbild per style="--banner-bg: url(…)". Auf
|
||||
|
||||
Reference in New Issue
Block a user