Erste Schritte Was 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, http://www.zend.com; PHP Accelerator, http://www.php-accelerator.co.uk) 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 Installation Anforderungen Smarty benötigt einen Webserver mit PHP >=4.0.6. Basis Installation Technische 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. 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: Smarty-Library Dateiliste Smarty.class.php Smarty_Compiler.class.php Config_File.class.php debug.tpl /plugins/*.php (alle 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. So erzeugt man eine Instanz der Smarty-Klasse im PHP-Skript: Smarty Instanz aus 'include_path' erstellen: require('Smarty.class.php'); $smarty = new Smarty; Wenn sich die Dateien ausserhalb des PHP-'include_path' befinden, muss die Konstante SMARTY_DIR auf den absoluten Pfad zeigen und mit einem '/' enden. Nehmen wir an, die Library-Dateien befinden sich in '/usr/local/lib/php/Smarty/': Instanz von Smarty aus SMARTY_DIR erstellen: define('SMARTY_DIR','/usr/local/lib/php/Smarty/'); require(SMARTY_DIR.'Smarty.class.php'); $smarty = new Smarty; 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 Dateistruktur /usr/local/lib/php/Smarty/Smarty.class.php /usr/local/lib/php/Smarty/Smarty_Compiler.class.php /usr/local/lib/php/Smarty/Config_File.class.php /usr/local/lib/php/Smarty/debug.tpl /usr/local/lib/php/Smarty/plugins/*.php /web/www.mydomain.com/smarty/guestbook/templates/ /web/www.mydomain.com/smarty/guestbook/templates_c/ /web/www.mydomain.com/smarty/guestbook/configs/ /web/www.mydomain.com/smarty/guestbook/cache/ /web/www.mydomain.com/docs/guestbook/index.php Technische 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 'web' und ist in der Gruppe 'web'). 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 einrichten chown nobody:nobody /web/www.mydomain.com/smarty/templates_c/ chmod 770 /web/www.mydomain.com/smarty/templates_c/ chown nobody:nobody /web/www.mydomain.com/smarty/cache/ chmod 770 /web/www.mydomain.com/smarty/cache/ Technische 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.mydomain.com/smarty/templates/index.tpl {* Smarty *} Hallo, {$name}! Technische 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 eine Variable zu und geben 'index.tpl' aus. Editieren von /web/www.mydomain.com/docs/guestbook/index.php define('SMARTY_DIR','/usr/local/lib/php/Smarty/'); require(SMARTY_DIR.'Smarty.class.php'); $smarty = new Smarty; $smarty->template_dir = '/web/www.mydomain.com/smarty/guestbook/templates/'; $smarty->compile_dir = '/web/www.mydomain.com/smarty/guestbook/templates_c/'; $smarty->config_dir = '/web/www.mydomain.com/smarty/guestbook/configs/'; $smarty->cache_dir = '/web/www.mydomain.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.mydomain.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 Library Dateien laden define('SMARTY_DIR','/usr/local/lib/php/Smarty/'); require(SMARTY_DIR.'Smarty.class.php'); // ein guter Platz um Applikations spezifische Libraries zu laden // require('guestbook/guestbook.lib.php'); class Smarty_GuestBook extends Smarty { function Smarty_GuestBook() { // Konstruktor. Diese Werte werden für jede Instanz automatisch gesetzt $this->Smarty(); $this->template_dir = '/web/www.mydomain.com/smarty/guestbook/templates/'; $this->compile_dir = '/web/www.mydomain.com/smarty/guestbook/templates_c/'; $this->config_dir = '/web/www.mydomain.com/smarty/guestbook/configs/'; $this->cache_dir = '/web/www.mydomain.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.mydomain.com/docs/guestbook/index.php require('guestbook/setup.php'); $smarty = new Smarty_GuestBook; $smarty->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.