my little homepage

Über den Sinn von PHP-Template-Engines

Auch ich habe bei meinen Projekten gerne Smarty als Template-Engine verwendet. Smarty schien mir ein elegantes und mächtiges Werkzeug zu sein. Doch ist für die Trennung von Programm und Design wirklich immer ein so umfangreiches Paket notwendig? Smarty kann immerhin locker mal größer sein, als das eigentliche Hauptprogramm.

Die Szene ist sich nicht gerade einig

Beispielhaft zwei recht gegensätzliche Aussagen:

In general, template engines are a "good thing". (Template Engines)

... why template engines are a bad idea. (PHP and Templates)

Also was nun?

Auf jeden Fall ist es gut, Programm-Logik von Design-Logik zu trennen. Eine vollständige Trennung von Programmierung und Design kommt jedoch schnell an seine Grenzen: mit bloßem Einsetzen von Werten in Platzhalter kommt man nicht weit - das Design ist in der Regel immer irgendwie abhängig von den Daten und so werden Kontrollstrukturen wie Schleifen und if/else-Abfragen in den Templates notwendig. So hat sich Smarty beispielsweise bereits zu einer Art Sub-Skritsprache unter PHP entwickelt.

Aber worin soll der Vorteil dieser Schreibweise liegen...

{foreach from=$users item=user}
<tr>
<td>{$user.name}</td>
<td><a href="{$user.homepage}">{$user.homepage}</a></td>
</tr>

{/foreach}

...gegenüber normalem PHP?

<?php foreach($content['users'] as $user): ?>
<tr>
<td><?php echo $user['name'?></td>
<td><a href="<?php echo $user['homepage'?>"><?php echo $user['homepage'?></a></td>
</tr>
<?php endforeach ?>

PHP ist bereits ein Template-System!

Warum das Rad neu erfinden? Bevor der Designer Smarty lernen soll, kann er doch auch gleich die für ihn relevanten PHP-Ausdrücke lernen. Und tatsächlich ist PHP bereits ein Template-System! Es wurde speziell dafür entwickelt, um es in HTML einbinden zu können (siehe PHP Manual - Einleitung: Was ist PHP?).

In speziellen Fällen kann eine eigene Template-Skriptsprache natürlich Sinn machen, etwa wenn Templates aus nicht vertrauenswürdigen Quellen kommen, z.B. wenn User eigene Templates erstellen können. In vielen Fällen kann man sich die Trennung von Programm-Logik und Design-Logik aber auch einfacher machen: mit PHP-Templates (eventuell mit alternativer Syntax für Kontrollstrukturen) und einer absolut simplen, nur wenige Zeilen langen Template-Klasse:

<?php
class Template 
 
{
  private 
$_templateVars false;

  public function 
assign($name,$value)
   {
    
$this->_templateVars[$name] = $value;
   }

  public function 
display($template)
   {    
    if(
$this->_templateVars)
     {
      foreach(
$this->_templateVars as $__key => $__val)
       {
        $
$__key $__val;
       }
     }
    include(
$template);
   }
 }
?>

Diese soll uns eigentlich nur disziplinieren, Programm-Logik und Design-Logik auseinander zu halten. Mit der Methode assign werden Template-Variablen zugewiesen, mit display wird das Template angezeigt:

<?php
require('Template.class.php');
$template = new Template();
$template->assign('foo''Ich bin der Titel');
$template->assign('bar''Ich bin die Überschrift');
$template->display('foobar.tpl.php');
?>

...und so sieht das Template foobar.tpl.php aus:

<html>
<head>
<title><?php echo $foo ?></title>
</head>
<body>
<h1><?php echo $bar ?></h1>
</body>
</html> 

Download

Hier ist die Template-Klasse mit einem weiteren Beispiel zum Herunterladen. Diese hat auch noch eine Methode fetch, um den Template-Code zu bekommen, ohne ihn gleich auszugeben (z.B. um ihn in eine Cache-Datei zu schreiben):

template_class.zip

Kommentare

1. Frank, Freitag, 01. August 2008, 08:49:

Schöne Erklärung und Beispiel. Gefällt mir danke !

2. Mario, Mittwoch, 04. November 2009, 14:07:

Super schick, werde es mal in näherer zukunft ausprobieren.

3. Torsten, Donnerstag, 10. Juni 2010, 19:29:

Ich habe jetzt schon öfters skeptische Meinungen zu Smarty gelesen. Und ich finde auch: wenn es direkt mit PHP geht, warum soll man dann eine so aufgeblähte Template-Engine verwenden?
Also, ich find’s gut, dass Smarty aus phpSQLiteCMS raus geflogen ist.
Und danke für die Erklärungen hier und die Template-Klasse!

4. mike, Freitag, 06. Mai 2011, 08:08:

Eigentlich bin ich ein grosser Freund von Smarty, mag aber auch den minimalistischen Ansatz. Hat jemand Erfahrungen mit der Nutzung von (Smarty)Plugins in einer solchen Trennung von Design und Logik?
Ich selber habe davon einige Prozeduren und würde sie übernehmen muessen können. Ein nicht zu verachtender Vorteil bei einer Unterstützung von Smarty wäre die einfache Anpassung/Übernahme zahlreicher Themes aus diversen CMS-Systemen mit deren Plugins.

5. Peter, Donnerstag, 27. September 2012, 21:38:

Wie beschrieben, ist PHP vollkommen ausreichend. Danke für die Beschreibung und dem Beispiel.

6. ich, Sonntag, 20. Januar 2013, 13:58:

Ist zwar alles nicht verkehrt, aber unbrauchbar. So muss man bei diesem beispiel zig Dateie erstellen, damit die Funktion gegeben ist. Hier wäre es für die Architektur besser, wenn es eine Datei für das Templat, d.h. das Layout der Seite gäbe, und jeweils eine Datei für den Content, d.h. für jede Unterseite. Ist nicht schlecht dein Ansatz, aber für die Praxis unbrauchbar, da zu aufwendig.

7. Miller, Dienstag, 14. Mai 2013, 11:24:

Avira sagt :
http://www.phppatterns.com/...
hat html/Framer DO.229 Virus
dh von http://www.phppatterns.com aus alles

8. Tobias, Montag, 02. Dezember 2013, 09:37:

ich nutze seit Jahren die TemplateKlasse aus der PHPLib. Ist zwar uralt, wacht aber alles was ich brauche. Vor allem kann ich damit 100%!!! php-code vom Layout trennen ohne Kompromisse eingehen zu können!

9. Micha, Freitag, 06. Dezember 2013, 15:48:

TOP Seite, und sehr gut erklärt. Zu Empfehlen!




(optional, E-Mail-Adresse nur für Admin sichtbar)