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
This commit is contained in:
28
CLAUDE.md
28
CLAUDE.md
@@ -43,7 +43,7 @@ selbst gehosteter Stack ohne Abhängigkeiten von Drittanbietern.
|
||||
| Farben, Fonts, Spacing, Radii, Schatten | `public/assets/css/tokens.css` | Hex-Werte/Magic Numbers in anderen CSS-Dateien |
|
||||
| Seiten-Slugs & Routing | `app/routes.php` | URLs woanders hart verdrahten |
|
||||
| Navigation (Labels/Reihenfolge) | `data/navigation.json` | Menüpunkte in Templates |
|
||||
| Vereinsdaten (Name, Adresse, Kontakt, Social, Geo, Slogan) | `data/club.json` | Adresse/E-Mail irgendwo als Text duplizieren |
|
||||
| Vereinsdaten (Name, Adresse, Kontakt, Social, Geo, Slogan, **Web-Adresse**) | `data/club.json` | Adresse/E-Mail irgendwo als Text duplizieren. `club.website` ist die öffentliche Domain für alles Gedruckte (`club_url()`/`club_domain()`) — **nicht** `config('base_url')`, die ist umgebungsabhängig |
|
||||
| Startseiten-Inhalte | `data/home.json` | Texte in `pages/home.php` |
|
||||
| Mannschaften (Kader, Trainer, Hero, FAQ) | `data/teams.json` | Spieler-/Trainernamen in Team-Templates |
|
||||
| Seiteninhalte (Texte, Hero, FAQ) | `data/<slug>.json` (z. B. `fussball`, `jugend`, `turnen`, `verein`, `mitmachen`, `historie`, `partner-werden`, `sportheimbuchung`) | Texte/Hero/FAQ hart in `pages/*.php` |
|
||||
@@ -100,7 +100,10 @@ Funktion, sie ist die einzige Stelle, an der aus JSON HTML entsteht.
|
||||
prüfen ob eine Komponente existiert und erweitert werden kann. Wiederkehrende Inhalte auf neuen
|
||||
Seiten → als Komponente extrahieren.
|
||||
- **Helpers** (`app/helpers.php`): `e()` (Escaping — IMMER für dynamische Ausgaben), `url()` (interne
|
||||
Pfade), `abs_url()` (absolute URLs für Canonical/OG), `asset()` (Versionierung via filemtime;
|
||||
Pfade), `abs_url()` (absolute URLs für Canonical/OG), **`club_url()`/`club_domain()`** (absolute
|
||||
URL bzw. Domain ohne Schema auf der ÖFFENTLICHEN Vereinsadresse `club.website` — für alles, was
|
||||
gedruckt wird oder als Adresse dasteht; **nie `abs_url()` dafür**, siehe „Gedruckte Adressen" unten),
|
||||
`asset()` (Versionierung via filemtime;
|
||||
zweiter Parameter `false` lässt `?v=` weg — nur für Dateien, die auch statisches CSS anfordert,
|
||||
also die Font-Preloads in `meta.php`, deren URL exakt der `@font-face`-URL aus `base.css`
|
||||
entsprechen muss; geänderte Fonts bekommen einen neuen Dateinamen statt einer Version),
|
||||
@@ -611,14 +614,23 @@ unreparierbar auf jedem Gerät, das ihn einmal gesehen hat) · `Cache-Control: n
|
||||
`exit` statt `return` (sonst hängt `layout.php` einen HTML-Body an die Weiterleitung).
|
||||
Nicht in der Sitemap: es ist eine Weiterleitung, keine Seite.
|
||||
|
||||
**Gedruckte Adressen: `club.website` statt `base_url`** (seit 31.07.2026). `base_url` ist bewusst
|
||||
umgebungsabhängig, weil Canonical, OG, Sitemap und JSON-LD zur ausliefernden Adresse passen müssen.
|
||||
**Gedrucktes kennt kein „lokal":** QR-Codes, die Internet-Zeile im Heft-Impressum, die Cover-Zeile
|
||||
neben dem QR und die Linkzeilen unter den CTA-QRs der Live-Seiten laufen deshalb über
|
||||
`club_url()`/`club_domain()` (Quelle: `club.website` in `data/club.json`). Vorher trugen sie
|
||||
`localhost:8000` ins Druckmaterial und hätten nach dem Produktivgang alle neu erzeugt werden müssen.
|
||||
Die Domain ist Vereinsidentität, keine Umgebungseinstellung — deshalb `club.json` und nicht `config`.
|
||||
Fehlt das Feld, fällt `club_url()` auf `abs_url()` zurück (nie ein kaputter Link).
|
||||
|
||||
**QR-Codes für Drucksachen: `php bin/qr.php <pfad|url> [ziel.png] [--scale=24]`** (Default nach
|
||||
`storage/qr/`, gitignored). Getrennt von den Stadionzeitungs-Codes, die
|
||||
`bin/stadionzeitung-add.php` selbst klein für die A5-Seiten erzeugt. **Die Warnung ist der Zweck des
|
||||
Skripts:** ein QR-Code hat die URL fest eingebacken, und gegen die Dev-Config erzeugt steht
|
||||
`http://localhost:8000/…` darin — das gedruckte Plakat ist dann Altpapier. Interne Pfade laufen
|
||||
über `abs_url()` (Single Source `base_url`), und ist die nicht https, sagt das Skript es laut. Solange
|
||||
die Seite nicht live ist, die vollständige Produktions-URL direkt übergeben. **Jeden Druck-QR vor der
|
||||
Freigabe einmal mit dem Handy scannen** — im Repo gibt es keinen Decoder, der das prüfen könnte.
|
||||
`bin/stadionzeitung-add.php` selbst klein für die A5-Seiten erzeugt; interne Pfade laufen über
|
||||
`club_url()`, sind also unabhängig von der Umgebung schon richtig.
|
||||
**Jeden Druck-QR vor der Freigabe einmal mit dem Handy scannen.** Das ist nicht Vorsicht, sondern die
|
||||
einzige Prüfmöglichkeit: die vendorte Bibliothek arbeitet **nicht reproduzierbar** (dieselbe URL
|
||||
ergibt unterschiedliche Pixel — anderes Maskenmuster, beides gültig), ein Vergleich zweier PNGs
|
||||
beweist deshalb nichts. Nachweisbar ist nur der Code-Pfad, nicht der Bildinhalt.
|
||||
|
||||
**Live-Seiten wiederverwendbar:** `termine_build_lists()` und `news_build_feed()` (`app/helpers.php`)
|
||||
sind die einzige Merge-Logik für Termine bzw. News — `/termine`, `/news` UND die
|
||||
|
||||
Reference in New Issue
Block a user