Christian Seiler: Sinn und Unsinn von PHP-basierten Template-Engines

Beitrag lesen

Hallo,

http://www.phpguru.org/static/templating.html
http://www.massassi.com/php/articles/template_engines/

Mit beiden Ansätzen habe ich genau 2 Probleme:

* Beide setzen short_open_tag = On voraus, denn <?=$foo?> geht eben nur bei
   aktiviertem short_open_tag. Wenn short_open_tag deaktiviert ist, muss ich
   <?php echo $foo; ?> machen - was dann bei vielen Variablen schnell sehr
   umständlich wird. short_open_tag kann man aber nicht voraussetzen, wenn
   man portable Software schreiben will.
 * Für einfache Variablen, die man nur ausgeben will, ist das sicherlich
   ganz brauchbar zu nutzen. Allerdings sind Template-Engines wie z.B.
   Smarty explizit als Template-Engines und eben *nicht* als Programmier-
   sprache konzipiert worden. Ok, man kann auch Smarty-Templates schreiben,
   in denen nur noch programmiert wird, die komplett unübersichtlich sind,
   aber blödsinnigen Code kann man so ziemlich überall fabrizieren. Smarty
   dagegen bietet eine Syntax an, die gerade auf Templates optimiert ist -
   bei PHP ist das nicht so direkt der Fall. Mal ein paar Beispiele:
       - Wenn ich in PHP eine Variable nochmal durch eine Funktion jagen
         will, z.B. htmlspecialchars(), dann muss man sowas schreiben:
         <?php echo htmlspecialchars ($variable); ?>
         oder, bei short tags: <?=htmlspecialchars ($variable)?>
         Das ist zwar prinzipiell kein Problem, aber macht den Code IMHO
         schnell sehr übersichtlich, wenn dann auch noch andere Funktionen
         dazukommen, z.B. nl2br:
         <?php echo nl2br (htmlspecialchars ($variable)); ?>
         (oder <?=nl2br (htmlspecialchars ($variable)); ?>)
         In Smarty kann man dagegen schreiben:
         {$variable|escape|nl2br}
         Das ist für eine Template-Sprache (!) eine viel sinnvollere
         Syntax - IMHO zumindest.
       - Template-Engines nehmen einem auch eine ganze Menge Arbeit ab
         und ermöglichen es, einem das Leben leichter zu machen. Bei
         Smarty gibt's z.B. {html_options options=$Options selected=$sel}
         erzeugt lauter <option value="KEY">VALUE</option> aus dem $Options
         Array und selektiert automatisch KEY = $sel. Ferner gibt's so
         nette Dinge wie {cycle}: Du willst z.B. jede zweite Tabellenzelle
         andersfarbig ausgeben, weist ihnen also verschiedene Klassen zu.
         Das kannst Du so machen, indem Du in die Schleife selbst einfach
         <tr class="{cycle values="odd,even"}"> schreibst - Smarty
         übernimmt dann den Rest für Dich. Ferner stehen Dir in Schleifen
         eine ganze Menge Informationen über die Schleife selbst zur
         Verfügung über spezielle Tags (ist dies das erste oder letzte
         Element etc) - die Dir in PHP ohne Nacharbeit nicht zur Verfügung
         stehen. Nur, um mal ein paar einfache Beispiele zu nennen.

Natürlich kannst Du _alles, was Du in Smarty kannst, auch in PHP
         machen - allerdings nur dadurch, dass der Code *im Template*
         wächst und bei komplexeren Dingen unübersichtlich wird. Ich
         bezweifle gar nicht, dass einfaches PHP für *EINFACHE* Anwendungen
         durchaus die bessere Alternative ist, da schlanker. Sobald das
         ganze jedoch komplizierter wird, dann nehmen einem Template-
         Engines eine *ganze* Menge Arbeit ab, entschlanken den Code und
         führen dazu, dass man sich beim Schreiben der Templates auf das
         wesentliche konzentrieren kann - und sich nicht mit Neben-
         sächlichkeiten auseinandersetzen muss.

Zudem: Zumindest Smarty wandelt alle Templates in PHP um, und
         bindet diese "kompilierten" Templates dann per include() ein -
         damit ist der Geschwindigkeitsvorteil von reinem PHP praktisch
         gleich Null, sobald die Templates mal kompiliert sind, denn
         der Overhead durch Smarty selbst ist relativ gering.

Viele Grüße,
Christian