Rolf B: smarty templates

Beitrag lesen

Hallo djr, hallo Tassilo,

nein, das macht ihr nicht richtig. Das JSON Format kennt keine Key-Value Arrays, wie PHP. Man muss das als Objekt notieren. Die JSON-Datei muss (für die unten genannte Möglichkeit 2) so aussehen:

{
    "headline": "<span>MÜLLKunsthalleMünster,</span><span>ASI-Speicher II, Münster</span>",
    "subheadline": "BLUPPBLUPP, 2012",
    "title": "Perfor&shy;mance",
    "subtext": "<span>MÜLLKunsthalleMünster,</span><span>ASI-Speicher II, Münster</span>",
    "text": "Lorem ipsum"
}

Man kann darüber diskutieren, ob die userdata.json tatsächlich HTML Fragmente enthalten sollte oder ob man noch eine Abstraktionsschicht einziehen sollte. Das ist aber nicht ganz so trivial und hat einige Konsequenzen, darum lasse ich das lieber beiseite.

Die json Datei verarbeitet man mit

$userDataFile = file_get_contents('userdata.json');
$userData = json_decode($userDataFile, true);

Das true als 2. Parameter von json_decode ist wichtig, damit kein PHP-Objekt, sondern eine assoziatives Array entsteht. Der Unterschied im Ergebnis besteht darin, dass man auf die Einträge eines Objekts mit $userdata->headline zugreift, auf ein Array aber mit $userdata["headline"]. Des weiteren kann man die Eigenschaften eines Objekts nicht direkt mit array_map ablaufen, man muss es vorher in ein Array casten. Das kannst Du Dir sparen, wenn Du den JSON-String direkt als Array produzieren lässt.

Ob man das oben stehende JSON Fragment verwendet, oder die von Tassilo verwendete Folgeidee mit Seite1, Seite2, etc als zusätzliche Schlüsselebene einsetzt, das hängt davon ab, wo die userdata.json steht.

Möglichkeit 1: die userdata.json steht im Mediaordner. Die arbeit01, arbeit02, ... Ordner sind „Geschwister“ dieser Datei. In diesem Fall sollten die Ordnernamen als zusätzliche Schlüsselebene verwendet werden, und das PHP Script, das die Medien zu ArbeitXX anzeigt, könnte - wie von djr erwähnt - seinen eigenen Namen als Schlüssel verwenden. Das geht aber eigentlich besser, dazu unten mehr. Das JSON schreibt man dann aber nicht so, wie Tassilo es am 20.06.2019 um 00:36 gezeigt hat, sondern so:

{
   "arbeit01": {
      "headline": "<span>Arbeit 01</span><span>Foo-Location, Dingenskirchen<span>",
      "subheadline": "...",
      "title": "...",
      "subtext": "...",
      "text": "Lorem ipsum"
   },
   "arbeit02": {
      "headline": "<span>Arbeit 01</span><span>Foo-Location, Dingenskirchen<span>",
      "subheadline": "...",
      "title": "...",
      "subtext": "...",
      "text": "Lorem ipsum"
   }
}

Möglichkeit 2: die userdata.json steht im ArbeitXX Ordner. In diesem Fall würde die zusätzliche Schlüsselebene entfallen und die JSON-Datei so aussehen wie in dem Beispiel zu Beginn dieses Threads. Das arbeitxx.php Script liest die userdata.json dann aus dem gleichen Ordner wie auch die Bilder.

Welche von beiden Möglichkeiten du wählst, ist deine Entscheidung. Hast Du lieber alle Beschreibungen beieinander in einer Datei (Nachteil: der Ordnername steckt als magischer String im JSON Dokument), oder möchtest Du die Beschreibungen bei den Medien haben (Vorteil: die Zuordnung Medien zu Beschreibung ergibt sich automatisch über den Platz an dem die JSON Datei steht; Nachteil: mehrere JSON Dateien). Ich persönlich würde Möglichkeit 2 für sauberer halten.

Die eigentliche Galerieanzeige sollte sich dann mit Hilfe des Mediareaders und der userdata.json vollautomatisiert durch eine einzige galerie.php Datei erledigen lassen; die geplanten arbeit01.php, arbeit02.php würden nämlich alle den gleichen Inhalt haben. An galerie.php übergibst Du den Namen der Galerie als Parameter, rufst also bspw. galerie.php?id=1 auf. In dieser PHP Datei setzt du die ID so in den Ordnernamen um:

if (!isset($_GET['id'])) {
   // keine ID übergeben, Fehler. Beispielhafte Lösung: zurück zur Startpage
   header("Location: /");
   exit;
}
$galleryFolder = sprintf("arbeit%02d/", intval($_GET['id']));

Mit diesem Ordner kannst Du den MediaReader initialisieren (new MediaReader("./mediaordner/".$galleryFolder)) und auch die userdata.json einlesen - von wo genau, hängt davon ab, ob Du Möglichkeit 1 oder 2 umsetzt. Für Möglichkeit 1 kannst Du den Wert in $galleryFolder als Schlüssel für die erste Schlüsselstufe verwenden.

Du bist auf mein Posting von letzter Woche nicht eingegangen: Du hast "smarty templates" als Thread-Titel gewählt. Verwendest Du Smarty? In dem Fall brauchst Du Dir die Mühe mit der händischen Aufbereitung nicht machen, Smarty ist dafür viel besser geeignet.

Rolf


sumpsi - posui - clusi