Tips & Tricks Handhabung unangewiesener Variablen Manchmal möchten Sie vielleicht, dass anstatt einer Leerstelle ein Standardwert ausgegeben wird - zum Beispiel um im Tabellenhintergrund "&nbsp;" auszugeben, damit er korrekt angezeigt wird. Damit dafür keine {if} Anweisung verwendet werden muss, gibt es in Smarty eine Abkürzung: die Verwendung des default Variablen-Modifikators. "&nbsp;" ausgeben wenn eine Variable nicht zugewiesen ist {* kompliziert *} {if $titel eq ""} &nbsp; {else} {$titel} {/if} {* einfach *} {$titel|default:"&nbsp;"} Handhabung von Standardwerten Wenn eine Variable in einem Template häufig zum Einsatz kommt, kann es ein bisschen störend wirken, den 'default'-Modifikator jedes mal anzuwenden. Sie können dies umgehen, indem Sie der Variable mit der assign Funktion einen Standardwert zuweisen. Zuweisen des Standardwertes einer Variable {* schreiben sie dieses statement an den Anfang des Templates *} {assign var="titel" value=$titel|default:"kein Titel"} {* fall 'titel' bei der Anweisung leer war, enthält es nun den Wert 'kein Titel' wenn Sie es ausgeben *} {$titel} Variablen an eingebundene Templates weitergeben Wenn die Mehrzahl Ihrer Templates den gleichen Header und Footer verwenden, lagert man diese meist in eigene Templates aus und bindet diese ein. Was geschieht aber wenn der Header einen seitenspezifischen Titel haben soll? Smarty bietet die Möglichkeit, dem eingebundenen Template, Variablen zu übergeben. Die Titel-Variable dem Header-Template zuweisen ersteseite.tpl ------------ {include file="header.tpl" title="Erste Seite"} {* template body hier *} {include file="footer.tpl"} archiv.tpl ------------ {config_load file="archiv.conf"} {include file="header.tpl" title=#archivSeiteTitel#} {* template body hier *} {include file="footer.tpl"} header.tpl ---------- <HTML> <HEAD> <TITLE>{$title|default:"Nachrichten"}</TITLE> </HEAD> <BODY> footer.tpl ---------- </BODY> </HTML> Sobald die erste Seite geparsed wird, wird der Titel 'Erste Seite' dem header.tpl übergeben und fortan als Titel verwendet. Wenn die Archivseite ausgegeben wird, wird der Titel 'Archive' ausgegeben. Wie Sie sehen können, wird der Wert dafür aus der Datei 'archiv.conf' geladen und nicht von einem übergebenen Wert. Der Standardwert 'Nachrichten' wird verwendet, wenn die '$titel' leer ist. Erneut wird dafür der default-Modifikator angewandt. Zeitangaben Um dem Template Designer höchstmögliche Kontrolle über die Ausgabe von Zeitangaben/Daten zu ermöglichen, ist es empfehlenswert Daten immer als Timestamp zu übergeben. Der Designer kann danach die Funktion date_format für die Formatierung verwenden. Bemerkung: Seit Smarty 1.4.0 ist es möglich jede Timestamp zu übergeben, welche mit strtotime() ausgewertet werden kann. Dazu gehören Unix-Timestamps und MySQL-Timestamps. Die Verwendung von date_format {$startDatum|date_format} AUSGABE: Jan 4, 2001 {$startDatum|date_format:"%Y/%m/%d"} AUSGABE: 2001/01/04 {if $datum1 < $datum2} ... {/if} Falls {html_select_date} in einem Template verwendet wird, hat der Programmierer die Möglichkeit den Wert wieder in ein Timestamp-Format zu ändern. Dies kann zum Beispiel wie folgt gemacht werden: Formular Datum-Elemente nach Timestamp konvertieren // hierbei wird davon ausgegangen, dass Ihre Formular Elemente wie folgt benannt sind // startDate_Day, startDate_Month, startDate_Year $startDate = makeTimeStamp($startDate_Year,$startDate_Month,$startDate_Day); function makeTimeStamp($year="",$month="",$day="") { if(empty($year)) $year = strftime("%Y"); if(empty($month)) $month = strftime("%m"); if(empty($day)) $day = strftime("%d"); return mktime(0,0,0,$month,$day,$year); } WAP/WML WAP/WML Templates verlangen, dass ein Content-Type Header im Template angegeben wird. Der einfachste Weg um dies zu tun, wäre, eine Funktion zu schreiben, welche den Header ausgibt. Falls sie den Caching Mechanismus verwenden, sollten Sie auf das 'insert'-Tag zurückgreifen ('insert'-Tags werden nicht gecached), um ein optimales Ergebnis zu erzielen. Achten Sie darauf, dass vor der Ausgabe des Headers keine Daten an den Client gesendet werden, da die gesendeten Header-Daten ansonsten von Client verworfen werden. Die verwendung von 'insert' um einen WML Content-Type header zu senden // stellen Sie sicher, dass Apache mit .wml Dateien umgehen kann! // schreiben Sie folgende Funktion in Ihrer Applikation, oder in Smarty.addons.php function insert_header() { // this function expects $content argument // folgende Funktion erwartet ein $inhalt argument extract(func_get_arg(0)); if(empty($inhalt)) return; header($inhalt); return; } // Ihr Template _muss_ danach wie folgt beginnen: {insert name=header inhalt="Content-Type: text/vnd.wap.wml"} <?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"> <!-- neues wml deck --> <wml> <!-- erste karte --> <card> <do type="accept"> <go href="#zwei"/> </do> <p> Welcome to WAP with Smarty! Willkommen bei WAP mit Smarty! OK klicken um weiterzugehen... </p> </card> <!-- zweite karte --> <card id="zwei"> <p> Einfach, oder? </p> </card> </wml> Template/Script Komponenten Dieser Tip ist nicht ausgiebig getestet, aber dennoch eine nette Idee. Verwendung auf eigene Gefahr. ;-) Normalerweise werden Variablen dem Template wie folgt zugewiesen: In Ihrer PHP-Applikation werden die Variablen zusammengestellt (zum Beispiel mit Datenbankabfragen). Danach kreieren Sie eine Instanz von Smarty, weisen die Variablen zu und geben das Template aus. Wenn wir also zum Beispiel einen Börsenticker in unserem Template haben, stellen wir die Kursinformationen in unserer Anwendung zusammen, weisen Sie dem Template zu und geben es aus. Wäre es jedoch nicht nett diesen Börsenticker einfach in ein Template einer anderen Applikation einbinden zu können ohne deren Programmcode zu ändern? Sie können PHP-Code mit {php}{/php} in Ihre Templates einbetten. So können Sie Templates erstellen, welche die Datenstrukturen zur Anweisung der eigenen Variablen enthalten. Durch die Bindung von Template und Logik entsteht so eine eigenständig lauffähige Komponente. Template/Script Komponenten {* Smarty *} {php} // unsere funktion um die börsenkurse zu holen function fetch_ticker($symbol,&$ticker_name,&$ticker_price) { // hier wird $ticker_name und $ticker_price zugewiesen } // aufruf der funktion fetch_ticker("YHOO",$ticker_name,$ticker_price); // zuweisung der variablen $this->assign("ticker_name",$ticker_name); $this->assign("ticker_price",$ticker_price); {/php} Symbol: {$ticker_name} Preis: {$ticker_price} Seit Smarty 1.5.0, gibt es einen noch einfacheren und auch saubereren Weg in dem man die Logik mit {include_php ...} einbindet. So kann man weiterhin die Logik vom Design getrennt halten. Mehr Informationen gibt es in der include_php Dokumentation. Template/Script Komponenten mit include_php load_ticker.php --------------- <?php // unsere funktion um die börsenkurse zu holen function fetch_ticker($symbol,&$ticker_name,&$ticker_price) { // hier wird $ticker_name und $ticker_price zugewiesen } // aufruf der funktion fetch_ticker("YHOO",$ticker_name,$ticker_price); // zuweisung der variablen $this->assign("ticker_name",$ticker_name); $this->assign("ticker_price",$ticker_price); ?> index.tpl --------- {* Smarty *} {include_php file="load_ticker.php"} Symbol: {$ticker_name} Preis: {$ticker_price} Verschleierung von E-mail Adressen Haben Sie sich auch schon gewundert, wie Ihre E-mail Adresse auf so viele Spam-Mailinglisten kommt? Ein Weg, wie Spammer E-mail Adressen sammeln, ist über Webseiten. Um dieses Problem zu bekämpfen, können sie den 'mailto'-Plugin verwenden. Er ändert die Zeichenfolge mit Javascript so, dass sie im HTML Quellcode nicht lesbar ist, jedoch von jedem Browser wieder zusammengesetzt werden kann. Den 'mailto'-Plugin gibt es im Smarty-Repository auf http://smarty.php.net. Laden sie den Plugin herunter und speichern Sie ihn im 'plugins' Verzeichnis. Beispiel von verschleierung von E-mail Adressen index.tpl --------- Fragen bitte an {mailto address=$EmailAddress encode="javascript" subject="Hallo"} senden Technische Details Die Codierung mit Javascript ist nicht sehr sicher, da ein möglicher Spammer die Decodierung in sein Sammelprogramm einbauen könnte. Es wird jedoch damit gerechnet, dass, da Aufwand und Ertrag sich nicht decken, dies nicht oft der Fall ist.