Hallo,
ich versuche gerade, mir ein eigenes Templatesystem zu stricken. Nichts Aufregendes, es ist für eine Website, die aus maximal fünf Seiten besteht. Ich möchte auf kein bestehendes System zurückgreifen, weil ich es als eine Herausforderung begreife, es selbst zu programmieren. Das Ziel des Templatesystems ist die Trennung von Programmcode und Ausgabe und zentrale Speicherung immer gleicher Ausgaben.
Ich habe bisher folgendes realisiert: ein zentrales Template, das HTML-Gerippe und allgemeines Layout beinhaltet. Ich nenne es mal im Beispiel allgemein.tpl. Das Template sieht, hier vereinfacht, so aus:
<html>
<head>
<title>##titel##</title>
</head>
<body>
[eine Linkleiste, fest eingebaut]
<h1>##titel##</h1>
##content##
</body>
</html>
Ich habe im Beispiel das Layout weggelassen, damit es nicht zu unübersichtlich wird. ##...## sind die Bereiche, die ersetzt werden. Das geschieht, indem per URL ein PHP-Skript aufgerufen wird, das sich die allgemein.tpl schnappt, die zu ersetzenden Bereiche austauscht und anschließend die fertige Seite ausgibt. Für die zu ersetzenden Bereiche habe ich weitere Templates angefertigt. Wird beispielsweise eine Datei links.php aufgerufen, gibt es noch ein Template links.tpl. Das könnte so aussehen:
Link 1<br />
Link 2<br />
Dieser Inhalt wird an der Stelle ##content## eingefügt.
Soweit funktioniert das ganz gut. Nun gibt es aber einige Situationen, für die ich nicht weiß, ob meine Herangehensweise sinnvoll ist.
1. Resourcen, die unterschiedliche Ausgaben, basierend auf verschiedenen Templates, erzeugen. Als fiktives Beispiel ein Gästebuch, das einmal eine Eingabemaske ausgibt, im zweiten Fall die Einträge, letztens vielleicht den Adminbereich. Ich habe das bisher so gelöst, drei Templates zu erstellen (gb_0, gb_1, gb_2) und anhand des Querys das richtige Template einzubinden. Ein Aufruf gb.php?seite=1 würde dann die Einträge zeigen.
Dazu ist meine Frage, ob ich auf dem richtigen Weg mit dieser Lösung (drei Templates) bin.
2. Das Gästebuchbeispiel eignet sich auch gut zur Veranschaulichung eines weiteren Problems. Angenommen, auf der Gästebuchseite soll außer der in allgemein.tpl fixierten Linkleiste eine weitere zum Aufruf der drei "Unterseiten" ausgegeben werden, und zwar zwischen [eine Linkleiste, fest eingebaut] und <h1>##titel##</h1>. Das führt zunächst zu einem nicht zu umgehenden Problem, weil das in allgemein.tpl nicht vorgesehen ist. Sicherlich könnte man für diesen Spezialfall per PHP nach [eine Linkleiste, fest eingebaut] die weitere Linkleiste einsetzen, indem man [eine Linkleiste, fest eingebaut] abfragt und dahinter den zusätzlichen Inhalt einsetzt. Das ist aber kein sinnvoller Weg, weil sich [eine Linkleiste, fest eingebaut] ändern kann und das Skript dann angepaßt werden müßte.
Meine Idee, das zu umgehen, ist, den Bereich zwischen <body> und <h1>##titel##</h1> schon selbst als austauschbaren Bereich anzugeben und an dieser Stelle ein weiteres Template einzufügen, etwa so
<body>
##menueleisten##
<h1>##titel##</h1>
Programmiertechnisch ist das kein Problem, aber ich weiß nicht, ob das so sinnvoll ist. In Artikeln zu Templates wird als ein Grund für deren Einsatz die Trennung von Programmierung und Ausgabe genannt, damit unterschiedlich ausgebildete Personen, also Programmierer und Designer, sich nur mit ihrem Gebiet befassen können. Das klingt plausibel, nur kann der Designer bei der Zerstückelung einer Seite in hundert Templates die Seite nicht mehr am Stück bearbeiten, sondern nur noch die einzelnen Templates, die für sich genommen keinen Eindruck vom Gesamtergebnis geben.
3. Noch einmal das Gästebuchbeispiel für das Problem "dynamischer" Templates. Das Template für die Unterseite mit den Gästebuchausgaben könnte so aussehen
##name## schrieb am ##datum##:<br />
##eintrag##
Das Skript gb.php schreibt in einer Schleife die Einträge mit dem Format von diesem Template in die Endfassung der auszugebenden Seite. Das sieht hier noch einfach aus, aber wenn fallweise Unterscheidungen hinzukommen
##name## mit der E-Mail ##mail## schrieb am ##datum##:<br />
##eintrag##
wird es schon komplizierter. Wenn "mit der E-Mail ##mail##" nur bei Vorhandensein einer E-Mail ausgegeben werden soll, muß dieser Bereich auch wieder variabel gehalten werden. Am einfachsten ginge das, wenn das Template so aussieht
##name## ##mail## schrieb am ##datum##:<br />
##eintrag##
und das Skript ##mail## ersetzt mit "mit der E-Mail" und der Adresse. Damit ist aber wieder eine Ausgabe innerhalb der Programmlogik, und der Designer hat beim Bearbeiten das Endergebnis nicht vor Augen. Es ginge sicherlich auch sowas
##name## ##??mail??=mit der E-Mail## ##mail## schrieb am ##datum##:<br />
##eintrag##
was bei Vorhandensein einer E-Mail-Adresse ##??mail??=mit der E-Mail## zu "mit der E-Mail" ersetzt, ansonsten löscht, aber damit hat der Designer bei der Bearbeitung des Templates eine Ansicht des Templates, die sich gehörig vom Endergebnis unterscheidet.
4. Auch ein Problem: Wenn das Template so aussieht
##name## ##??mail??=mit der E-Mail## ##mail## schrieb am ##datum##:<br />
##eintrag##
würde man nur einen Eintrag ausgeben können. Also muß eine Schleife innerhalb eines Skripts Ausgaben übernehmen. Eine Idee wäre in dem Template nur
##gaestebucheintraege##
zu vermerken und für die Schleife ein weiteres Template der Form
##name## ##??mail??=mit der E-Mail## ##mail## schrieb am ##datum##:<br />
##eintrag##
mit dem die Ausgaben zusammengesetzt und am Ende an die Stelle ##gaestebucheintraege## geschrieben werden. Wie auch immer man löst, das Problem ist das gleiche wie oben, die endgültige Seite zerstückelt sich in tausend Fragmente, eine klare Trennung von Logik und Ausgabe ist selbst im Template nicht gegeben - z. B. die bedingte Ausgabe ##??mail??=mit der E-Mail##.
Deshalb weiß ich nicht, ob mein Ansatz zu einem Templatesystem im Kern richtig ist oder ob ich damit in einer Sackgasse lande. Gibt es vielleicht irgendwo im Netz gute Tutorials, die den Aufbau eines Templatesystems von der Pike auf erklären?