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