Stadionzeitung: Ausgabe 19.09., Gegnerseiten ohne Fest, Gegner-Kurzname

Gegnerseiten lassen sich jetzt ueber `gegner_teams` auch ohne Veranstaltung
fuer weitere Mannschaften anlegen (Fenster zwei Tage vor bis drei Tage nach
dem Ausgabedatum, auch auswaerts), und `opponent_short` liefert den
gedruckten Anzeigenamen, waehrend `opponent` die BFV-Schreibweise fuer den
Namensvergleich behaelt.

Dazu die Ausgabe zum Heimspiel gegen Wirsberg/Kupferberg als Entwurf samt
Seitenbildern. Die gemeinsamen QR-Codes sind neu erzeugt (die vendorte
Bibliothek arbeitet nicht reproduzierbar, das Maskenmuster wechselt).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hv9SGDu3m3diiPrW9Fmj3v
This commit is contained in:
2026-09-19 10:53:56 +02:00
parent fef80bf669
commit 8f864368f0
25 changed files with 636 additions and 22 deletions

View File

@@ -202,6 +202,11 @@ $oldAufruf = $oldIssue['aufruf'] ?? null;
// Turnierpläne, Gegnerseiten je Heimspiel) und Cover-Kennung — chat-gepflegt.
$oldVeranstaltung = $oldIssue['veranstaltung'] ?? null;
$oldCover = $oldIssue['cover'] ?? null;
// Anzeigename des Gegners fürs Cover und die Liste ("Wirsberg/Kupferberg" statt
// der BFV-Zeile) und die Liste der Mannschaften, die zusätzlich eine
// Gegnerseite bekommen — beides Chat-Pflege, überlebt erneute Läufe wie vorwort.
$oldOpponentShort = $oldIssue['opponent_short'] ?? null;
$oldGegnerTeams = is_array($oldIssue['gegner_teams'] ?? null) ? array_values($oldIssue['gegner_teams']) : null;
$veranstaltung = null;
if (is_string($oldVeranstaltung) && $oldVeranstaltung !== '') {
$veranstaltung = veranstaltung_find($oldVeranstaltung);
@@ -376,13 +381,22 @@ try {
// dieselbe Funktion, aus der stadionzeitung_build_snapshot() die Daten baut,
// damit nie eine Seite ohne Daten oder Daten ohne Seite entstehen.
$gegnerSeiten = [];
foreach (stadionzeitung_gegner_fixtures([
$gegnerFixtures = stadionzeitung_gegner_fixtures([
'date' => $date, 'team_key' => $teamKey, 'opponent' => $opponent,
'veranstaltung' => $oldVeranstaltung,
]) as $gegnerTeam => $fixture) {
'veranstaltung' => $oldVeranstaltung, 'gegner_teams' => $oldGegnerTeams ?? [],
]);
foreach ($gegnerFixtures as $gegnerTeam => $fixture) {
$gegnerSeiten[] = $live('gegner', ['team' => (string) $gegnerTeam]);
$log("Gegnerseite {$gegnerTeam}: {$fixture['opponent']} ({$fixture['date']}).");
}
// Eine benannte Mannschaft ohne Spiel im Fenster bekommt keine Seite. Das ist
// richtig so, darf aber nicht stillschweigend passieren: ein Tippfehler im
// Team-Key sähe genauso aus wie ein spielfreies Wochenende.
foreach ($oldGegnerTeams ?? [] as $gewuenscht) {
if (!isset($gegnerFixtures[(string) $gewuenscht])) {
$log("gegner_teams: '{$gewuenscht}' hat kein Spiel im Fenster um {$date} (oder der Team-Key ist falsch) — keine Gegnerseite.", 'WARN');
}
}
if ($gegnerSeiten === []) {
// Ohne Treffer (Gegner leer) bleibt die Seite der tragenden Mannschaft —
// sie meldet dann selbst, dass keine Vergleichsdaten vorliegen.
@@ -425,7 +439,7 @@ try {
if ($rueckseite !== null) {
$bloecke[] = [
'name' => 'rueckseite',
'seiten' => [$bild($rueckseite, 'rueckseite', "Rückseite der Stadionzeitung gegen {$opponent}")],
'seiten' => [$bild($rueckseite, 'rueckseite', "Rückseite der Stadionzeitung gegen " . stadionzeitung_opponent_display(['opponent' => $opponent, 'opponent_short' => $oldOpponentShort]))],
'anzeigen_danach' => false,
];
}
@@ -734,6 +748,8 @@ if ($oldIssue !== null && ($oldIssue['status'] ?? '') === 'veroeffentlicht') {
$issues[] = [
'slug' => $slug,
'opponent' => $opponent,
'opponent_short' => $oldOpponentShort,
'gegner_teams' => $oldGegnerTeams,
'date' => $date,
'team_key' => $teamKey,
'status' => 'entwurf',