Files
tsv08kulmbach-website/bin/qr.php
fs 2f8619e78d Gedruckte Adressen aus club.website statt base_url
QR-Codes und Adresszeilen trugen `http://localhost:8000` ins Druckmaterial, weil
sie über abs_url() liefen. Nach dem Produktivgang hätten alle zehn Codes neu
erzeugt werden müssen — und ein gedruckter Code mit localhost darin ist Altpapier.

Die öffentliche Domain ist Vereinsidentität, keine Umgebungseinstellung: neues
Feld `club.website` in data/club.json plus club_url()/club_domain(). base_url
bleibt umgebungsabhängig, weil Canonical, OG, Sitemap und JSON-LD zur
ausliefernden Adresse passen müssen.

Umgestellt: Cover-QR und die acht geteilten CTA-QRs, die Internet-Zeile im
Heft-Impressum, die Cover-Zeile neben dem QR, die acht Linkzeilen unter den
CTA-QRs der Live-Seiten (die hatte ich beim ersten Durchgang übersehen), das
Web-Feld im Website-Impressum und bin/qr.php.

Nebenbei: club_domain() ohne Pfad hängte einen Wurzel-Slash an
(„tsv08kulmbach.de/"), und der Kopf-Kommentar von stadionzeitung-add.php
beschrieb noch die alten vier Anzeigen-Gruppen.

Nicht verifizierbar und deshalb dokumentiert: die vendorte QR-Bibliothek
arbeitet nicht reproduzierbar (gleiche URL, andere Pixel — anderes Maskenmuster,
beides gültig). Ein PNG-Vergleich beweist nichts, nachweisbar ist nur der
Code-Pfad. Jeden Druck-QR einmal scannen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NzeVVgMCrzCDJAKeLEdKr7
2026-07-31 15:40:59 +02:00

79 lines
3.0 KiB
PHP

<?php
declare(strict_types=1);
/**
* QR-Code für DRUCKSACHEN erzeugen (nur CLI).
*
* php bin/qr.php <pfad|url> [ziel.png] [--scale=24]
*
* Beispiele:
* php bin/qr.php stadionzeitung/aktuell
* php bin/qr.php stadionzeitung/aktuell ~/Desktop/qr-plakat.png --scale=30
* php bin/qr.php https://tsv08kulmbach.de/stadionzeitung/aktuell
*
* Abgrenzung zu den QR-Codes der Stadionzeitung: die erzeugt
* bin/stadionzeitung-add.php selbst, klein und für die A5-Seiten
* (generate_qr_png() Default-Skalierung, gut 200px). Dieses Skript ist für
* Plakate und Aushänge, die in Canva zusammengebaut werden — dort braucht es
* ein Vielfaches an Pixeln, sonst franst der Code im Druck aus.
*
* Ein QR-Code hat die URL fest eingebacken — gegen die Entwicklungs-Config erzeugt
* stünde `http://localhost:8000/…` darin und das gedruckte Plakat wäre Altpapier.
* Deshalb läuft ein interner Pfad durch club_url(): die öffentliche Vereinsadresse
* aus data/club.json, unabhängig von der Umgebung. Der Code stimmt damit schon vor
* dem Produktivgang und muss danach nicht neu erzeugt werden.
*/
if (PHP_SAPI !== 'cli') {
exit(1);
}
require dirname(__DIR__) . '/app/bootstrap.php';
$args = array_values(array_filter(array_slice($argv, 1), static fn (string $a): bool => !str_starts_with($a, '--')));
$scale = 24;
foreach ($argv as $arg) {
if (str_starts_with($arg, '--scale=')) {
$scale = max(1, (int) substr($arg, 8));
}
}
if ($args === []) {
fwrite(STDERR, "Nutzung: php bin/qr.php <pfad|url> [ziel.png] [--scale=24]\n");
exit(1);
}
$target = $args[0];
$isAbsolute = str_starts_with($target, 'http://') || str_starts_with($target, 'https://');
$url = $isAbsolute ? $target : club_url(trim($target, '/'));
// Zielpfad: ohne Angabe neben das Skript-Verzeichnis in storage/qr/ ablegen —
// Druckmaterial ist kein Website-Asset und hat unter public/ nichts zu suchen.
$dest = $args[1] ?? null;
if ($dest === null) {
$dir = STORAGE_PATH . '/qr';
if (!is_dir($dir)) {
mkdir($dir, 0755, true);
}
$name = preg_replace('/[^a-z0-9]+/', '-', strtolower($isAbsolute ? (string) parse_url($url, PHP_URL_PATH) : $target)) ?? 'qr';
$dest = $dir . '/qr-' . trim($name, '-') . '.png';
}
// Der Riegel bleibt, nur zeigt er jetzt auf das richtige Feld: ohne saubere
// club.website wäre der gedruckte Code wieder unbrauchbar.
if (!$isAbsolute && !str_starts_with($url, 'https://')) {
fwrite(STDERR, "WARNUNG club.website in data/club.json ist nicht https ('{$url}') — dieser QR-Code\n");
fwrite(STDERR, " führt nicht auf die echte Seite und ist als Druckvorlage unbrauchbar.\n\n");
}
if (!generate_qr_png($url, $dest, $scale)) {
fwrite(STDERR, "FEHLER QR-Code konnte nicht erzeugt werden (vendor-manual/phpqrcode vorhanden?)\n");
exit(1);
}
[$w, $h] = getimagesize($dest) ?: [0, 0];
echo "QR-Code erzeugt\n";
echo " Ziel-URL : {$url}\n";
echo " Datei : {$dest}\n";
echo " Größe : {$w}x{$h} px (bei 300 dpi etwa " . round($w / 300 * 2.54, 1) . " cm)\n";