Einführung in die Template-Engine Smarty
Tapetenwechsel: Smarty

Marketing

Sie haben eine PHP-Anwendung erstellt und plötzlich soll das Layout ganz anders aussehen? Haben Sie Programmierlogik und die Formatierung der Daten miteinander vermischt, dann ist das oft schwierig. Eine Template-Engine wie Smarty kann das Leben da vereinfachen.

Was ist ein Template?

Einführung in die Template-Engine Smarty

Wenn Sie ein Content-Management-System erstellen möchten, dann ist es eine gute Idee, eine Template-Engine einzusetzen. Eine Template-Engine dient dazu, die Daten, die aus einer Datenbank oder Datei kommen, mit Hilfe von Templates auszugeben.

Zuerst stellt sich jedoch die Frage, was ein Template ist. Ein Template können Sie mit einer Schablone vergleichen, welche die Daten formatiert, die ausgegeben werden sollen. Konkret heißt das, es handelt sich um eine HTML-Seite, in der ein paar Platzhalter zu finden sind. Diese Platzhalter werden dann durch die Daten ersetzt, die aus einer Datenbank oder Datei kommen.

Um eine Seite im Browser auszugeben, benötigen Sie also zwei Dateien. Aber warum sollte man so einen Aufwand betreiben, wenn eine Datei doch alles leisten kann? Schließlich können Sie mit einem echo ja nicht nur Texte aus der Datenbank, sondern auch HTML-Befehle ausgeben lassen.


Warum Templates?

Einführung in die Template-Engine Smarty

Es gibt zwei Gründe, die dafür sprechen, mit Templates zu arbeiten. Der erste ist, dass die Logik, auf der ein CMS basiert, sich selten ändert. Das Aussehen der generierten Seiten – gerade dann, wenn ein CMS verschiedene Layouts bedienen soll – ändert sich aber recht oft. Wird der gesamte Job von einer Datei erledigt, dann müssen Sie diese eine Datei also auch ständig umstellen, um das Layout zu ändern. Das kann schnell sehr aufwendig werden und steigert den Pflegeaufwand deutlich. Muss nur das Template überarbeitet werden, sieht das schon anders aus.

Der zweite Grund ist, dass Programmierer, die ja die eigentliche Anwendung erstellen, oft nicht unbedingt ein Händchen für ein schönes Design haben. Und gute Webdesigner können meist nicht so gut programmieren. Deswegen ist es sinnvoll, diese beiden Aufgabenbereiche sauber zu trennen.

Natürlich könnten Sie nun auf die Idee kommen, selbst eine Vorgehensweise zu entwerfen, um mit Templates zu arbeiten. Dagegen ist nichts einzuwenden. Sie werden aber feststellen, dass es nicht ganz trivial ist, eine solche Template-Engine zu entwerfen. Daher ist es meist besser, auf eine fertige Engine zurückzugreifen. Es gibt inzwischen eine recht große Anzahl von Projekten, die eigene En gines hervorgebracht haben. Smarty ist dabei eines der stabils ten und schnellsten Produkte, das Sie finden können. Smarty kennt nicht nur einen umfangreichen eigenen Befehlssatz, sondern ist vor allem auch in der Lage, fertige Seiten zu cachen.


Smarty installieren

Einführung in die Template-Engine Smarty

Smarty können Sie recht einfach installieren. Zuerst laden Sie das Tool von der Website des Projekts herunter und entpacken die entsprechende ZIP-Datei. Keine Angst, die vielen Dateien und Unterverzeichnisse, die dabei entstehen, benötigen Sie nicht alle. Lediglich die Dateien und Unterverzeichnisse, die sich im Ordner libs befinden, müssen Sie in ein Verzeichnis kopieren, auf das Ihr Webserver Zugriff hat. In den nachfolgenden Beispielen liegen diese Daten in einem Verzeichnis namens smarty, das sich direkt unterhalb des Document-Root-Verzeichnisses befindet. Die Smarty-Dateien müssten allerdings nicht direkt unter dem Document-Root liegen. Es reicht, wenn der Webserver lesend darauf zugreifen kann. Das hat den Vorteil, dass mehrere virtuelle Server auf dieselben Smarty-Dateien zugreifen können. Um die mehrfache Nutzung einer Installation zu gewährleisten, nutzt Smarty auch keine Konfigurationsdatei im herkömmlichen Sinn. Die meisten Einstellungen werden direkt im Code der eigentlichen PHP-Datei vorgenommen. Somit kann jede Anwendung, in der Smarty genutzt wird, individuell konfiguriert werden.

Jede Anwendung, die auf Smarty basiert, benötigt da rüber hinaus noch vier Verzeichnisse, um Smartys vollen Funktionsumfang nutzen zu können. Hierbei handelt es sich zunächst um das Verzeichnis templates, in dem die Templates abgelegt werden. Der Ordner configs wird dazu genutzt, lokale Konfigurationen zu speichern. Die Verzeichnisse cache und template_c werden von Smarty genutzt, um den Cache und kompilierte Templates zu verwalten. Hierbei müssen Sie beachten, dass der Webserver Schreibrechte für diese Ordner benötigt. Die meisten Provider haben ihre Server aber so konfiguriert, dass die Schreibrechte automatisch vergeben werden. Ist das nicht der Fall, dann müssten Sie die Schreibrechte mit Hilfe Ihres FTP-Programms vergeben. Alle Verzeichnisse können Sie direkt unterhalb des Ordners anlegen, in dem Smarty verwendet werden soll. Die Verzeichnisse können übrigens auch andere Namen bekommen. Bei den hier genannten Namen handelt es sich aber um den üblichen Standard.


Individuell bleiben

Einführung in die Template-Engine Smarty

Möchten Sie die Unterverzeichnisse anders benennen, ist das auch kein Problem. In dem Fall müssen Sie Smarty nur mitteilen, wie die neuen Verzeichnisnamen heißen. Smarty arbeitet objektorientiert. In dem Objekt, das Sie von der Klasse Smarty ableiten, gibt es Eigenschaften, in denen die Verzeichnisnamen gespeichert werden. Diesen Eigenschaften müssen Sie die Namen der Verzeichnisse zuweisen. Damit Sie das nicht jedes Mal aufs Neue machen müssen, ist es eine gute Idee, die Klasse Smarty ein wenig zu erweitern. Das heißt, dass Sie einfach eine neue Klasse ableiten, welche die Klasse Smarty als Basisklasse nutzt, aber einen eigenen Konstruktor verwendet. In diesem Konstruktor werden dann die Namen der Verzeichnisse zugewiesen. Das hat auch den Vorteil, dass Sie hier noch weitere Einstellungen vornehmen können, die für die ganze Applikation gelten sollen. So etwas könnte folgendermaßen aussehen:


class MySmarty extends Smarty

{
// Konstruktor der neuen Klasse
function MySmarty()
{
// Konstruktor der
// Elternklasse aufrufen
$this->Smarty();

//Namen der Verzeichnisse setzen
$this->template_dir = '/htdocs/daten/templates/';
$this->compile_dir = '/htdocs/daten/templates_c/';
$this->config_dir = '/htdocs/daten/configs/';
$this->cache_dir = '/htdocs/daten/cache/';
}
}

In diesem Beispiel sind zwar die Standardnamen genutzt worden, aber dadurch können Sie besser erkennen, welche Eigenschaft welchen Ordnernamen speichert.

Sinnvollerweise sollten Sie den obigen Code in einer Extra-Datei ablegen. Diese können Sie dann in Ihren Code einbinden und die gesamte Konfiguration steht zur Verfügung, wenn Sie ein Objekt Ihrer Klasse ableiten. Denken Sie daran, dass Sie nun ein Objekt Ihrer Klasse (in diesem Beispiel also MySmarty) ableiten müssen und nicht mehr auf die Klasse Smarty zugreifen dürfen. Da aber alle Methoden und Eigenschaften von der Elternklasse übernommen werden, können Sie jederzeit darauf zugreifen.


Auf geht´s

Einführung in die Template-Engine Smarty

Wie erwähnt benötigen Sie zwei Dateien, um eine Bildschirmseite zu generieren: das Template und die PHP-Datei, welche die Daten einfügt.

Ein Template ist im Endeffekt eine normale HTML-Seite, die alle Formatierungen beinhaltet. Ein solches Template kann beispielsweise so aussehen:



Hallo Smarty


Vorname: {$vorname}< br>
Nachname: {$nachname}

Im Template sehen Sie PHP-Variablen, die in geschweifte Klammern eingefasst sind. Hierbei handelt es sich um die angesprochenen Platzhalter, die in Smarty auch als Variablen bezeichnet werden, die später durch die eigentlichen Werte ersetzt werden. Die geschweiften Klammern finden Sie übrigens auch bei anderen Sprachelementen von Smarty wieder.

Nun stellt sich die Frage, wie Sie das Template mit Werten füllen und auf dem Bildschirm darstellen. Dazu braucht es eine PHP-Datei, die Sie dann später auch im Browser aufrufen. Aber auch diese Datei ist kein größeres Problem, wie die folgenden Zeilen zeigen:

require_once("smarty/Smarty.class.php");
// Neues Objekt ableiten
$smarty = new Smarty();

// Variablen mit Werten belegen
$smarty->assign('vorname', 'Peter');
$smarty->assign('nachname',
'Sausewind');

// Template ausgeben
$smarty->display('template.tpl');

Nachdem Sie die Datei Smarty.class.php eingebunden haben, können Sie ein neues Smarty-Objekt ableiten. Sollten Sie die Klasse erweitert haben, dann müssten Sie natürlich Ihre Datei einbinden und ein Objekt Ihrer Klasse ableiten.


Variablen

Einführung in die Template-Engine Smarty

In diesem Objekt müssen Sie nun die Smarty-Variablen vorname und nachname mit Werten belegen. Dafür ist die Methode assign zuständig, die als ersten Parameter den Namen der Variablen und als zweiten Parameter den dazugehörigen Wert übergeben bekommt. Nach der Zuweisung kann das Template, das unter dem Namen template.tpl gespeichert wurde, ausgegeben werden, was die Methode display übernimmt. Sie bekommt den Dateinamen des Templates übergeben, liest die Datei ein, ersetzt die Platzhalter durch die Inhalte der Variablen und gibt die fertige Seite an den Browser aus. Das Template ist übrigens im Verzeichnis templates gespeichert. Sie müssen den Namen des Unterverzeichnisses also nicht angeben, wenn Sie mit den Default-Namen arbeiten.
In diesem Beispiel wurden den Smarty-Variablen Konstanten zugewiesen. Sie können natürlich auch den Wert einer PHP-Variablen an eine Smarty-Variable weiterreichen, wenn Sie die PHP-Variable als zweiten Parameter an assign übergeben.



Arrays

Smarty hat auch kein Problem mit Arrays. Ein Array können Sie auch mit assign an eine Smarty-Variable übergeben. Allerdings müssen Sie im Template eine kleine Veränderung vornehmen. Smarty benötigt die Information, welcher Wert denn ausgegeben werden soll. Bei einem indizierten Array geben Sie den Schlüssel des Wertes einfach in eckigen Klammern an, wie Sie das auch aus PHP kennen:

//PHP-Datei
$daten = array ('Peter',
'Sausewind');

$smarty->assign('namen', $daten);

Vorname: {$namen[0]}< br>
Nachname: {$namen[1]}< br>

Bei einem assoziativen Array hängen Sie den Schlüssel, getrennt durch einen Punkt, direkt an den Namen der Variablen an:

//PHP-Datei
$daten = array ('vorname' => 'Peter', 'nachname'=>'Sausewind');
$smarty->assign('namen', $daten);


Vorname: {$namen.vorname}< br>
Nachname: {$namen.nachname}< br>

Einfach nur Werte auszugeben wäre aber langweilig. Smarty kann noch mehr.


Modifikatoren

Einführung in die Template-Engine Smarty

Template-Designer haben oft das Problem, dass Daten nicht einfach direkt ausgegeben werden sollen. Oft wollen sie Texte nicht so verwenden, wie sie aus der Datenbank kommen. Unter Umständen sollen alle Buchstaben groß oder vielleicht auch klein ausgegeben werden. Damit der Template-Designer bei so einfachen Aufgaben nicht immer den Programmierer bitten muss, den Code zu ändern, kennt Smarty so genannte Modifikatoren. Ein solcher Modifikator wäre zum Beispiel upper. Er wird nach dem Namen der Variable angegeben, wobei Variable und Modifikator durch eine Pipe (|) getrennt werden. Mit

Vorname: {$vorname|upper}

wird also der Inhalt der Variable vorname ausgegeben und beider Ausgabe komplett in Großbuchstaben umgewandelt. Sie können übrigens auch mehrere Modifikatoren miteinander verknüpfen. In dem Fall geben Sie die Modifikatoren in der Reihenfolge, in der sie ausgeführt werden sollen, hinter der Variablen an:

Vorname: {$vorname|upper|spacify:" "}

Der Modifier spacify fügt zwischen den Buchstaben eines Wortes jeweils den String ein, der nach dem Doppelpunkt angegeben wird. In diesem Fall würde der Name Peter in der späteren Seite also als P E T E R dargestellt und als P