Templates mittels PHPLib

<div align="justify">
Templates werden hauptsächlich benutzt, um Inhalt und Design einer Website voneinander zu trennen. Dies ist eine ideale Basis für dynamische Webseiten wie sie etwa in einem Content-Management-System genutzt werden. Die Pflege und Aktualisierung der Inhalte wird extrem erleichtert, da ausschließlich reiner Text ohne kryptischen HTML-Quellcode an einer zentralen Stelle steht. Das Design kann ebenso jederzeit ganz einfach verändert werden, ohne, dass dabei Inhalte zerstört werden. Es ist sogar denkbar, dem Besucher einer Internet-Seite verschiedene Outfits der Homepage zur Wahl zu stellen. Das Design wird wie üblich erstellt, doch kommen an Stelle des Textes oder zum Beispiel auch der Bilderpfade Platzhalter, die einen eindeutigen Namen tragen. Anhand dieser Bezeichnung kann ein PHP-Skript den Inhalt der Seite, der zum Beispiel in einer MySQL-Datenbank gespeichert ist, eindeutig den Platzhaltern zuordnen. Ein Template ist also wie eine Schablone. Da diese Schablone in einem Webprojekt beliebig oft benutzt werden kann, erleichtert dies ein konsistentes Design. In diesem Artikel wird die Template-Engine aus der beliebten Bibliothek PHPLIB verwendet, einer kostenlosen Sammlung nützlicher Funktionen für PHP. Falls Ihr Server oder Webspace nicht über PHPLIB verfügt, laden Sie sich die Funktionssammlung unter http://sourceforge.net/projects/phplib herunter. Es genügt, wenn Sie aus dem Archiv die Datei template.inc z.B. in Ihr Projektverzeichnis oder ins Include-Verzeichnis entpacken, und mittels include in Ihr Skript einbinden.1. Template erstellenEin Template ist eine ganz normale HTML-Datei, die Sie in Ihrem bevorzugtem HTML-Editor wie üblich erstellen. An der Stelle eines Textes schreiben Sie jedoch in geschweiften Klammern den frei wählbaren Namen des Platzhalters. Beispiel : {HEADLINE}Später wird mittels PHP bei diesem Beispiel der Platzhalter {HEADLINE} durch einen Text wie etwa der Überschrift ersetzt, der dann in der Schriftart Arial mit der Größe 2 zu sehen ist. Selbstverständlich können Sie auch mehrere Platzhalter nutzen. Speichern Sie die Template-Dateien am besten in einem separaten Verzeichnis ab. Als Dateiendung, zur Unterscheidung zu herkömmlichen HTML-Seiten, nimmt man gern .tpl.2. Template parsenJetzt kommt PHP und PHPLIB zum Einsatz. Das Skript sorgt dafür, dass das angelegte Template geparsed wird. Parsen – so nennt man das Ersetzen der Platzhalter durch Inhalt. Oder anders formuliert: Wenn man es von der Leine lässt, schnüffelt sich das PHP-Skript wie ein Spürhund durchs Template, verspeist die gesuchten Platzhalter genüsslich und hinterlässt stattdessen – nun ja, einen Haufen Inhalt. Ein Beispiel ist vielleicht doch aussagekräftiger:Rufen Sie jetzt das PHP-Skript auf – und statt {HEADLINE} steht jetzt &quot;Überschrift&quot; auf dem Bildschirm. Und das sind die Gründe dafür:Nachdem mit include die Verbindung zur Template-Eninge von PHPLIB hergestellt wurde, wird der Variablen $t mit dem Befehl new eine neue Instanz der Template-Klasse zugewiesen. Als Parameter wird der Speicherort der Template-Dateien angegeben und anschließend festgelegt, was passieren soll, wenn ein Platzhalter durch das Skript nicht ersetzt werden kann. Dies passiert zum Beispiel, wenn im Skript ein Platzhalter des Templates nicht behandelt wird. Im vorliegenden Fall wird der Platzhalter dank &quot;remove&quot; einfach entfernt, &quot;keep&quot; behält ihn bei. Es empfiehlt sich, während der Entwicklungsphase &quot;keep&quot; zu nutzen, um so einfach Schwachstellen des Skripts beim Ersetzen ausfindig zu machen.Als nächstes wird mit der Funktion set_file der Templatedatei &quot;home.tpl&quot; den Alias &quot;home&quot; zugewiesen. Mit diesem Alias erfolgen ab nun an sämtliche Operationen bezüglich der Datei &quot;home.tpl&quot;. Mehrere Dateien mit jeweils eigenem Alias werden mit einem Array angegeben.Mit set_var erfolgt die Zuweisung des Textes &quot;Überschrift&quot; zum Platzhalter &quot;HEADLINE&quot;. Kommen weitere Platzhalter im Template vor, wird das Array einfach um die entsprechende Anzahl an Einträgen nach dem gleichen Muster ergänzt. Dabei gilt, dass bei jedem Array-Eintrag als Index der Name des jeweiligen Platzhalters, als dazugehöriger Wert der passende Inhalt zu setzen ist. Natürlich machen Templates mehr Sinn, wenn an dieser Stelle die Informationen etwa aus einer Datenbank oder einer Textdatei stammen.Der Befehl &quot;pparse&quot; setzt diese Zuweisung zu den Platzhaltern in &quot;home&quot;, also damit zur Datei &quot;home.tpl&quot;, um. Mit dem Parameter &quot;out&quot; erfolgt die Ausgabe des Templates mit sämtlichen Ersetzungen. Achten Sie auf das doppelte p am Anfang dieses Befehls. Vergessen Sie eins, erfolgt nur eine Ersetzung, jedoch keine Bildschirmausgabe.Zur Verdeutlichung nun noch ein umfangreicheres Beispiel:Datei main.tpl: {TITLE} {HEADLINE} {SUBHEADLINE}Datei parse.php4:Manchmal kommt es vor, dass man eine Zeile im Template mit unterschiedlichen Daten in unbestimmter Menge mehrfach ausgeben möchte. Am konkreten Beispiel eines kleinen Gästebuchs für eine Homepage werden Sie sehen, wie dieses Problem mit Templates gelöst wird.Dazu wird der Teil, der später mehrmals mit unterschiedlichem Inhalt gefüllt werden soll, nur einmal mit den gewünschten Platzhaltern ins Template integriert. Anschließend wird dieser Teil als sogenannter Block mit Hilfe von HTML-Kommentarungen definiert. Im Quellcode des Templates sieht das so aus:1. Template erstellen…{HEADLINE} {NAME} {DATETIME} {EINTRAG}…Der Block wird in HTML-Kommentaren mit BEGIN, gefolgt von einer frei wählbaren Bezeichnung, eröffnet und in gleicher Weise mit END wieder geschlossen. Blockanfang und -ende sind zwingend notwendig. Innerhalb der beiden Markierungen befinden sich im vorliegenden Fall zwei abgeschlossene Tabellenzeilen. Beim Bilden eines Blocks sollte darauf geachtet werden, dass man dessen Inhalt theoretisch mehrfach untereinander schreiben könnte, ohne dabei gegen HTML-Konventionen zu verstoßen. Dies ist besonders bei Tabellen wichtig, da sonst die ganze Seitenarchitektur aus den Fugen geraten könnte, wenn man beispielsweise eine Tabellenzeile nicht abgeschlossen hat.2. Template parsenDer Block im Beispiel enthält einen Platzhalter für einen bisherigen Texteintrag im Gästebuch, weiterhin einen für Datum und Zeit, sowie für den Verfasser des Eintrages. Ausgehend davon, dass das Gästebuch mehr als einen Eintrag bereits in sich trägt, zeigt sich nun Sinn und Zweck von Blöcken in Templates. Das passende und parsende Skript:Mit dem ersten &quot;set_var&quot; wird zunächst nur dem einzigen Platzhalter außerhalb des Blocks ein Text zugewiesen. Die Platzhalter im Block werden erst bei jedem Durchlauf der foreach-Schleife behandelt.Im vorliegenden Fall stammen die Daten aus einer Datenbank, die in einem externen Skript mit der Funktion getGbookData abgefragt wird. Auf die gehen wird jetzt nicht genauer eingegangen, doch lohnt ein Blick auf die Struktur der Daten. Es handelt sich bei $gbookdata um ein Array, dessen Werte jeweils einen Gästebucheintrag repräsentieren, welcher wiederum aus einem Array besteht. Letzterer beinhaltet in der aus Teil 1 bekannten Form wieder den Platzhalternamen im Index und den dazugehörigen Inhalt als Wert. Würde man $gbookdata an dieser Stelle den entsprechenden Inhalt &quot;per Hand&quot; zuweisen, könnte das also beispielsweise so aussehen:$gbookdata = array(array(&quot;DATETIME&quot;=&gt;&quot;02.04.2003 15:23 Uhr&quot;,&quot;NAME&quot;=&gt;&quot;Peter&quot;,&quot;EINTRAG&quot;=&gt;&quot;Mein Text.&quot;), array(&quot;DATETIME&quot;=&gt;&quot;15.04.2003 00:23 Uhr&quot;,&quot;NAME&quot;=&gt;&quot;Beate&quot;,&quot;EINTRAG&quot;=&gt;&quot;Liebe Grüße.&quot;));Der Befehl set_block nimmt den Block gb_block aus dem Template gbook heraus und speichert ihn in der Variable blockersatz. Die foreach-Schleife wird so oft durchla
ufen, wie Gästebucheinträge vorhanden sind. Jeder einzelne Eintrag wird dabei durch $gbookentry – logischerweise ein Array mit den Indizes DATETIME, EINTRAG, NAME – dargestellt. $gbookentry passt also prima zu dem Befehl set_var. Mit parse erfolgt die eigentliche Ersetzung der Platzhalter im Block, bei jedem Durchgang aufs Neue. Verzichtet man darauf, würden bei jedem Durchlauf bisher gesetzte Werte überschrieben werden, ohne dass sie für die Ersetzung genutzt worden sind. Im gleichen Schritt wird die Kopie des Blocks wieder ins Template eingefügt oder an bereits vorher verarbeitete Blöcke im Template angefügt. Anschließend wird der nächste Eintrag in den in blockersatz noch immer mit Platzhaltern gespeicherten Block eingesetzt und wieder angefügt. Das Aneinanderfügen geschieht übrigens nur, wenn der dritte Parameter des parse-Befehls im Block auf &quot;true&quot; gesetzt wird.Es entsteht also Schritt für Schritt eine immer wieder gleich aussehende Auflistung bisheriger Einträge. Und es ist vollkommen egal, um wie viele Einträge es sich dabei handelt.Mit der Bildschirmausgabe des Ganzen erfolgt zum Schluss noch ein letztes Parsen. Denn trotzdem eventuell dutzende Male der Block gb_block geparsed wurde, hat das den Platzhalter {HEADLINE} außerhalb des Blocks wenig interessiert, doch jetzt ist auch seine Zeit gekommen – Deadline für Headline! </div>