Unterabschnitte


Templates

Templates sind Layout/Design-Vorlagen, die meistens aus HTML-Code bestehen. Der Hauptvorteil von Templates besteht in der strikten Trennung von PHP-Code und HTML. Somit wird eine Website nicht nur übersichtlicher (für den Webmaster). Auch die Arbeit an der Homepage kann besser zwischen Scripter und Designer aufgeteilt werden.

Der Designer kann in Ruhe ein HTML-Dokument erstellen. An den Stellen, wo später der dynamische Inhalt eingesetzt werden soll, fügt er Variablen/Platzhalter ein. Der Programmierer setzt für diese Variablen Werte ein, und muß sich somit nicht um das Design kümmern. Wenn sich in der HTML-Datei etwas ändert, muß das Script nicht geändert werden - und umgekehrt.

Beispiel

<html>
  <head>
    <title>{titel}</title>
  </head>
  <body>
    <h1>{titel}</h1>
    <p>
      {inhalt}
    </p>
  </body>
</html>
So könnte ein einfaches Template zum Beispiel aussehen. Als Gegenstück dazu muß vom Programmierer ein Script geschrieben werden, das die Variablen ,,titel`` und ,,inhalt`` mit entsprechenden Werten füllt.

Da wir uns nicht mit regulären Ausdrücken herumschlagen wollen, verwenden wir ein Templatemodul. Ich will in den weiteren Abschnitten zwei solcher Module vorstellen.

PEAR::IT[X]

Integrated Template (Extension) ist ein Templatemodul, das mit PHP (ab Version 4) mitgeliefert wird. Es ist Bestandteil des Code-Repositorys PEAR[*] und ist somit bei korrekter Installation von PEAR per include "HTML/ITX.php" verfügbar.
<?php
include_once "HTML/ITX.php";

// ITX erwartet den Pfad zu den Templates als Parameter
$tpl = new IntegratedTemplateExtension("./");
$tpl->loadTemplateFile("template.html");

// Setzen der Variablen
$tpl->setVariable("titel", "Test-Template");
$tpl->setVariable("inhalt", "Just a test...");

// Ausgeben
$tpl->show();
?>

Block-API

IT[X] bietet auch noch weitere interessante Features an. Mit Hilfe der Block-API ist der Programmierer in der Lage, Teile des Templates mehrmals auszugeben (mit unterschiedlichen Werten). Als Beispiel könnte man zum Beispiel ein HTML-Selectfeld nehmen. Es hat mehrere Optionen zum auswählen. Wenn diese Optionen dynamisch generiert werden, kommt man mit den herkömmlichen Platzhaltern nicht mehr weit.
<html>
  <body>
    <select>
      <!-- BEGIN option_loop -->
      <option>{wert}</option>
      <!-- END option_loop -->
    </select>
  </body>
</html>
Das PHP-Script soll in diesem Fall für jede einzelne Option den gesamten Block einfügen, und für ,,wert`` etwas einfügen.
<?php
include_once "HTML/ITX.php";

// ITX erwartet als Parameter den Pfad zu den Template
$tpl = new IntegratedTemplateExtension("./");
$tpl->loadTemplateFile("template.html");


// Array aus Optionen
$optionen = array(
    "Option 1",
    "Option 2",
    "Noch eine Option",
    "Wieder eine",
    "Und die letzte"
);

// Auswählen des Blocks
$tpl->setCurrentBlock("option_loop");
foreach ($optionen as $wert) {
    $tpl->setVariable("wert", $wert);
    // Zuletzt muß der Block nach dem Setzen
    // der Variable(n) geparsed werden
    $tpl->parseCurrentBlock();
}

// Ausgeben
$tpl->show();
?>

Smarty

Smarty wird nicht mit PHP mitgeliefert, sondern muß von http://smarty.php.net/heruntergeladen werden. Die Smarty-Templates sind um einiges flexibler, aber auch komplizierter. Smarty bietet viele Features, die hier nicht alle aufgelistet werden können. Trotzdem ein kleines Beispiel:

<html>
  <head>
    <title>{$titel}</title>
  </head>
  <body>
    <select>
      {html_options output=$optionen}
    </select>
  </body>
</html>

Ich habe hier eine kombinierte Version der beiden oberen Beispiele benutzt. Wie man sieht, hat Smarty eine leicht veränderte Syntax für Variablen. Außerdem gibt es schon vorgefertigte Funktionen, wie zum Beispiel ,,html_options``, welche eine Select-Liste erstellt.

<?php
include_once "Smarty.class.php";

$smarty = new Smarty;

$smarty->assign("titel", "Smarty-Test");
$smarty->assign("optionen", array("Option 1",
                                  "Option 2",
                                  "Noch eine Option",
                                  "Wieder eine",
                                  "Und die letzte"));

$smarty->display("test.tpl"); // Templates werden bei
                              // Smarty als .tpl gespeichert
?>

Der Titel wird ähnlich wie bei IT[X] in das Template eingefügt. Aus dem Array mit dem Optionen erstellt Smarty direkt eine Select-Liste, was etwas Tipp-Arbeit erspart.

Smarty bietet noch viele weitere Funktionen, wie zum Beispiel eine Art Debugger, der außer einer Angabe, wieviel Zeit zum Parsen benötigt wurde, auch ausgibt, welche Variablen mit welchen Werten belegt wurden. Auch If-Else-Abfragen, Foreach-Schleifen und Include-Direktiven sind kein Problem. Allerdings stellt man sich bei der Fülle an Funktionen manchmal die Frage, ob man nicht gleich den PHP-Code in die HTML-Datei einbetten sollte, da die Templates oft sehr unübersichtlich werden.

Christoph Reeg