Erste SchritteWas ist Smarty?
Smarty ist eine Template-Engine für PHP. Genauer gesagt
erlaubt es die einfache Trennung von Applikations-Logik und
Design/Ausgabe. Dies ist vor allem wünschenswert, wenn der
Applikationsentwickler nicht die selbe Person ist wie der
Designer. Nehmen wir zum Beispiel eine Webseite die Zeitungsartikel
ausgibt. Der Titel, die Einführung, der Author und der Inhalt
selbst enthalten keine Informationen darüber wie sie
dargestellt werden sollen. Also werden sie von der Applikation an
Smarty übergeben, damit der Designer in den Templates mit
einer Kombination von HTML- und Template-Tags die Ausgabe
(Tabellen, Hintergrundfarben, Schriftgrössen, Stylesheets,
etc.) gestalten kann. Falls nun die Applikation eines Tages
angepasst werden muss, ist dies für den Designer nicht von
Belang, da die Inhalte immer noch genau gleich übergeben
werden. Genauso kann der Designer die Ausgabe der Daten beliebig
verändern, ohne dass eine Änderung der Applikation
vorgenommen werden muss. Somit können der Programmierer die
Applikations-Logik und der Designer die Ausgabe frei anpassen, ohne
sich dabei in die Quere zu kommen.
Was Smarty nicht kann: Smarty versucht nicht die gesamte Logik aus
dem Template zu verbannen. Solange die verwendete Logik
ausschließlich für die Ausgabe verwendet wird, kann sie auch
im Template eingebettet werden. Ein Tip: versuchen Sie
Applikations-Logik aus dem Template und Präsentations-Logik
aus der Applikation herauszuhalten. Nur so bleibt die Applikation
auf absehbere Zeit gut skalier- und wartbar.
Einer der einzigartigen Aspekte von Smarty ist die Kompilierung der
Templates. Smarty liest die Template-Dateien und generiert daraus
neue PHP-Skripte; von da an werden nur noch diese Skripte
verwendet. Deshalb müssen Templates nicht für jeden
Seitenaufruf performance-intensiv neu geparst werden und jedes
Template kann voll von PHP Compiler-Cache Lösungen
profitieren. (Zend, &url.zend;;
PHP Accelerator, &url.php-accelerator;)
Ein paar Smarty Charakteristiken
Sehr schnell.
Sehr effizient, da der PHP-Parser die 'schmutzige' Arbeit
übernimmt.
Kein Overhead durch Template-Parsing, nur einmaliges kompilieren.
Re-kompiliert nur gänderte Templates.
Sie können die Engine um individuelle Funktionen
und Variablen-Modifikatoren
erweitern.
Konfigurierbare Syntax für Template-Tags: Sie
können {}, {{}}, <!--{}-->, etc. verwenden.
'if/elseif/else/endif'-Konstrukte
werden direkt dem PHP-Parser übergeben. Somit können {if
...} Ausdrücke sowohl sehr einfach als auch sehr komplex sein.
Unbegrenzte Verschachtelung von 'section', 'if' und
anderen Blöcken.
Ermöglicht die direkte Einbettung von
PHP-Code. (Obwohl es weder benötigt noch empfohlen
wird, da die Engine einfach erweiterbar ist.)
Eingebauter Caching-Support
Beliebige Template-Quellen
Eigene Cache-Handling
Funktionen
Plugin Architektur
InstallationAnforderungen
Smarty benötigt einen Webserver mit PHP >=4.0.6.
Basis InstallationTechnische Bemerkung
Dieser Leitfaden geht davon aus, dass Sie Ihr Webserver- und
PHP-Setup kennen und mit den Namenskonventionen für Dateien
und Verzeichnisse Ihres Betriebssystems vertraut sind. Im
Folgenden wird ein Unix-Dateisystem verwendet, stellen Sie also
sicher, dass sie die für Ihr Betriebssystem nötigen
Änderungen vornehmen.
Das Beispiel geht davon aus, dass '/php/includes' in Ihrem
PHP-'include_path' liegt. Konsultieren Sie das PHP-Manual
für weiterführende Informationen hierzu.
Installieren Sie als erstes die Smarty-Library Dateien (den
/libs/-Ordner der Smarty Distribution). Diese Dateien sollten von
Ihnen NICHT editiert und von allen Applikationen verwendet
werden. Sie werden nur erneuert, wenn Sie eine neue Version von
Smarty installieren.
Technische Bemerkung
Wir empfehlen keine Änderungen an den Smarty-Library Dateien
vorzunehmen. Dies macht ein mögliches Upgrade wesentlich
einfacher. Sie müssen diese Dateien auch nicht anpassen, um
Smarty zu konfigurieren! Benutzen Sie für diesen Zwecke eine
Instanz der Smarty-Klasse.
Folgende Library Dateien werden mit Smarty geliefert und werden benötigt:
Benötigte Smarty-Library Dateien
Sie können diese Dateien entweder in Ihrem PHP-'include_path'
oder auch in irgend einem anderen Verzeichnis ablegen, solange die
Konstante SMARTY_DIR auf den korrekten
Pfad zeigt. Im Folgenden werden Beispiele für beide
Fälle aufgezeigt. SMARTY_DIR muss in jedem
Fall am Ende einen Slash ("/", unter Windows ggf. einen
Backslash "\") enthalten.
So erzeugt man eine Instanz der Smarty-Klasse im PHP-Skript:
Smarty Instanz erstellen:
]]>
Versuchen Sie das Skript auszuführen. Wenn Sie eine
Fehlermeldung erhalten dass Smarty.class.php
nicht gefunden werden konnte, versuchen Sie folgendes:
Manuelles setzen der SMARTY_DIR-Konstanten
]]>
Absoluter Pfad übergeben
]]>
Library Verzeichnis dem Include-Pfad hinzufügen
]]>
SMARTY_DIR manuell setzen
]]>
Jetzt, wo die Library Dateien an ihrem Platz sind, wird es Zeit,
die Smarty Verzeichnisse zu erstellen.
Für unser Beispiel werden wir die Smarty Umgebung für
eine Gästebuch-Applikation konfigurieren. Wir verwenden den
Applikationsnamen nur, um die Verzeichnis-Struktur zu
verdeutlichen. Sie können die selbe Umgebung für alle
Ihre Applikationen verwenden indem Sie 'guestbook' durch dem Namen
Ihrer Applikation ersetzen.
Stellen Sie sicher, dass Sie die DocumentRoot Ihres Webservers
kennen. In unserem Beispiel lautet sie
'/web/www.domain.com/docs/'.
Die Smarty Verzeichnisse werden in den Klassen-Variablen $template_dir, $compile_dir, $config_dir und $cache_dir definiert. Die
Standardwerte sind: templates, templates_c, configs und cache. Für unser Beispiel legen
wir alle diese Verzeichnisse unter /web/www.domain.com/smarty/guestbook/
an.
Technische Bemerkung
Wir empfehlen, diese Verzeichnisse ausserhalb der DocumentRoot
anzulegen, um mögliche Direktzugriffe zu verhindern.
In Ihrer DocumentRoot muss mindestens eine Datei liegen, die
für Browser zugänglich ist. Wir nennen dieses Skript
index.php, und legen es in das Verzeichnis
/guestbook/ in unserer
DocumentRoot.
Technische Bemerkung
Bequem ist es, den Webserver so zu konfigurieren, dass
index.php als Standard-Verzeichnis-Index
verwendet wird. Somit kann man das Skript direkt mit
'http://www.domain.com/guestbook/' aufrufen. Falls Sie Apache
verwenden, lässt sich dies konfigurieren indem Sie
index.php als letzten Eintrag für
DirectoryIndex verwenden. (Jeder Eintrag
muss mit einem Leerzeichen abgetrennt werden).
Die Dateistruktur bis jetzt:
Beispiel der DateistrukturTechnische Bemerkung
Falls Sie kein Caching und keine Konfigurationsdateien verwenden,
ist es nicht erforderlich die Verzeichnisse '$config_dir' und
'$cache_dir' zu erstellen. Es wird jedoch trotzdem empfohlen, da
diese Funktionalitäten eventuell später genutzt werden
sollen.
Smarty benötigt Schreibzugriff auf die Verzeichnisse $compile_dir und $cache_dir. Stellen Sie also
sicher, dass der Webserver-Benutzer (normalerweise Benutzer
'nobody' und Gruppe 'nogroup') in diese Verzeichnisse schreiben
kann. (In OS X lautet der Benutzer normalerweise 'www' und ist in
der Gruppe 'www'). Wenn Sie Apache verwenden, können Sie in
der httpd.conf (gewöhnlich in '/usr/local/apache/conf/')
nachsehen, unter welchem Benutzer Ihr Server läuft.
Dateirechte einrichtenTechnische Bemerkung
'chmod 770' setzt ziemlich strenge Rechte und erlaubt nur dem
Benutzer 'nobody' und der Gruppe 'nobody' Lese-/Schreibzugriff
auf diese Verzeichnisse. Falls Sie die Rechte so setzen
möchten, dass auch andere Benutzer die Dateien lesen
können (vor allem für Ihren eigenen Komfort), so
erreichen Sie dies mit 775.
Nun müssen wir die index.tpl Datei
erstellen, welche Smarty laden soll. Die Datei wird in Ihrem
$template_dir
abgelegt.
Editieren von /web/www.example.com/smarty/guestbook/templates/index.tplTechnische Bemerkung
{* Smarty *} ist ein Template-Kommentar. Der
wird zwar nicht benötigt, es ist jedoch eine gute Idee jedes
Template mit einem Kommentar zu versehen. Dies erleichtert die
Erkennbarkeit des Templates, unabhängig von der verwendeten
Dateierweiterung. (Zum Beispiel für Editoren die
Syntax-Highlighting unterstützen.)
Als nächstes editieren wir die Datei
index.php. Wir erzeugen eine Smarty-Instanz,
weisen dem Template mit assign()
eine Variable zu und geben index.tpl mit
display aus.
Editieren von /web/www.example.com/docs/guestbook/index.php
template_dir = '/web/www.example.com/smarty/guestbook/templates/';
$smarty->compile_dir = '/web/www.example.com/smarty/guestbook/templates_c/';
$smarty->config_dir = '/web/www.example.com/smarty/guestbook/configs/';
$smarty->cache_dir = '/web/www.example.com/smarty/guestbook/cache/';
$smarty->assign('name','Ned');
$smarty->display('index.tpl');
?>
]]>
Technische Bemerkung
In unserem Beispiel verwenden wir durchwegs absolute Pfadnamen zu
den Smarty-Verzeichnissen. Falls /web/www.example.com/smarty/guestbook/
in Ihrem PHP-'include_path' liegt, wäre dies nicht
nötig. Es ist jedoch effizienter und weniger
fehleranfällig die Pfade absolut zu setzen. Und es
garantiert, dass Smarty die Templates aus dem geplanten
Verzeichnis lädt.
Wenn Sie index.php nun in Ihrem Webbrowser
öffnen, sollte 'Hallo, Ned!' ausgegeben werden.
Die Basis-Installation von Smarty wäre somit beendet.
Erweiterte Konfiguration
Dies ist eine Weiterführung der Basis Installation, bitte
lesen Sie diese zuerst!
Ein flexiblerer Weg um Smarty aufzusetzen ist, die Klasse zu
erweitern und eine eigene Smarty-Umgebung zu
initialisieren. Anstatt immer wieder die Verzeichnisse zu
definieren, kann diese Aufgabe auch in einer einzigen Datei
erledigt werden. Beginnen wir, indem wir ein neues Verzeichnis
namens '/php/includes/guestbook/' erstellen und eine Datei namens
'setup.php' darin anlegen.
Editieren von /php/includes/guestbook/setup.php
Smarty();
$this->template_dir = '/web/www.example.com/smarty/guestbook/templates/';
$this->compile_dir = '/web/www.example.com/smarty/guestbook/templates_c/';
$this->config_dir = '/web/www.example.com/smarty/guestbook/configs/';
$this->cache_dir = '/web/www.example.com/smarty/guestbook/cache/';
$this->caching = true;
$this->assign('app_name','Guest Book');
}
}
?>
]]>
Technische Bemerkung
In unserem Beispiel werden die Library Dateien ausserhalb der
DocumentRoot abgelegt. Diese Dateien könnten sensitive
Informationen enthalten, die wir nicht zugänglich machen
möchten. Deshalb legen wir alle Library Dateien in
'/php/includes/guestbook/' ab und laden sie in unserem 'setup.php'
Skript, wie Sie im oben gezeigten Beispiel sehen können.
Nun passen wir index.php an, um 'setup.php'
zu verwenden:
Editieren von /web/www.example.com/docs/guestbook/index.php
assign('name','Ned');
$smarty->display('index.tpl');
?>
]]>
Wie Sie sehen können, ist es sehr einfach eine Instanz von
Smarty zu erstellen. Mit Hilfe von Smarty_GuestBook werden alle
Variablen automatisch initialisiert.