PHP Template Engines: Must-Have oder Crap?
Wieder mal muss ich in alten Diskussionen wuehlen und meinen Senf dazu abgeben. Template Engines… Braucht man sie zu Zeiten von PHP5 noch? Muessen Logik und Praesentation getrennt sein? Wieso sollte ich meine Architektur so waehlen, nur weil es Andere machen? Zu Zeiten vor PHP5 war die Hochzeit der Template Engines. Die meisten professionellen Produkte nutzten Template Engines, vor allem weil mehrere Personen an der Softwareentwicklung beteiligt waren. So konnten Designer unabhaengig von den Entwicklern arbeiten. Mittlerweile kann doch aber jeder Designer PHP, oder nicht? Also ist eine Trennung von Logik und Praesentation nicht mehr noetig, oder?
Nein, auch heute kann der grosse Teil der Designer kein PHP. Es gibt zwar eine Menge, die hier und da ein wenig Code verstehen, aber solche Leute sollte man nicht an die Entwicklung von Software lassen. Jeder kann mit ein bisschen Uebung PHP Code schreiben. Aber das ist noch sehr weit entfernt von professioneller Softwareentwicklung.
Viele der neueren Template Engines (Smarty & Co.) bieten die Moeglichkeit Makros zu verwenden, um Bedingungen, Schleifen und andere Konstrukte anzuwenden. Diese Konstrukte werden spaeter durch ein PHP Script ausgewertet und ausgefuehrt. Meines Erachtens loesen solche Makros jedoch die strikte Trennung der Architekturbausteine auf.
In einem Artikel den ich auf phpguru.org mit dem Namen “Simple PHP templating class” und auf hotscripts.com mit dem Namen “Templating – the correct way” gefunden habe, argumentiert der Autor unsachlich gegen die Verwendung von Template Engines mit Saetzen, im folgenden Stil:
Any HTML monkey that can’t handle the above should kill themselves right now, and allow the collective IQ of the world rise a few points.
Mittlerweile bin ich fuer mich persoenlich zu dem Schluss gekommen, dass Logik und Praesentation strikt getrennt sein sollten. Gruende dafuer sind zum Beispiel:
- PHP Code ist wartbarer und Debugging ist einfacher. Die Komplexitaet einer Codedatei ist niedriger.
- Aenderungen am Aussehen lassen sich schneller durchfuehren, da der Aufwand die (X)HTML-Bloecke im Code zu finden entfaellt.
- “Designers don’t do code”.
Gegen die Argumente, dass eine hochkomplexe, dynamische Webseite nicht ohne Logik im Layout auskommt, kann ich nur meine Herangehensweise bei Template Engines anfuehren:
- Templates sind hierarchisch angeordnet.
- Ein Template enthaelt Platzhalter.
- Platzhalter koennen durch ein Template, durch mehrere Templates oder durch Text ersetzt werden.
Dadurch ergibt sich, dass ich auch Schleifen mit Templates verwenden kann, ohne Schleifen in den Templates zu haben. Ich habe in der letzten Zeit alle meine alten Template Engines wiedergefunden und dabei festgestellt, dass ich jede Stufe der Komplexitaet einmal ausprobiert habe. Meine erste Template Engine aehnelt der, die ich im Moment verwende. Im Laufe der Zeit erhoehte sich die Komplexitaet. Ich machte Schleifen und Bedingungen moeglich, fuegte Filterfunktionalitaeten und einen Cache hinzu. Es folgten Kleinigkeiten, wie z.B. ein Rotierer fuer Zeichenketten in Schleifen, den ich vor allem fuer abwechselnd gefaerbte Zeilen verwendet habe.? Ich musste mit der Zeit feststellen, dass die groesseren Moeglichkeiten sich proportional zur Komplexitaetssteigerung verhielten, die ich mit Template Engines eigentlich zu vermeiden versuchte. So wurden die Features meiner Template Engine immer geringer.
Hier mal ein Beispiel fuer die Anwendung meiner Template Engine:
$index = new Template("index"); $table_row = new Template("table_row"); while ($row = mysql_fetch_object($result)) { $table_row->set("KEY", $row->key); $table_row->set("VALUE", $row->value); $index->addChild("ROWS", $table_row); }
Eine Auszug aus der Beispiel index.tpl:
<table>
<tr>
<th>Key</th>
<th>Value</th>
</tr>
{ROWS}
</table>Und die table_row.tpl:
<tr>
<td>{KEY}</td>
<td>{VALUE}</td>
</tr>Ich bitte all diejenigen, die Interesse an meiner Template Klasse haben, sich noch etwas zu gedulden. Ich baue mir gerade ein kleines PHP Framework aus Funktionen und Methoden zusammen, die mir das Leben immer sehr vereinfacht haben. Dazu gehoert auch dei Template Klasse.
Achja, bevor ich es vergesse: Es gibt natuerlich auch Template Engines, die so maechtig sind, dass man ihnen nur noch Datenquellen angeben muss, woraus sie automatisiert Tabellen o.ae. generieren. Das sind aber eine ganz andere Klasse von Template Engines, die ich aus dieser Diskussion erstmal ausklammern moechte.






