Appendices Diagnostic des erreurs Erreurs Smarty/PHP Smarty peut identifier de nombreuses erreurs comme des attributs de balises manquants ou de noms de variables malformés. Dans ce cas-là, vous verrez apparaître une erreur semblable à : erreurs Smarty Warning: Smarty: [in index.tpl line 4]: syntax error: unknown tag - '%blah' in /path/to/smarty/Smarty.class.php on line 1041 Fatal error: Smarty: [in index.tpl line 28]: syntax error: missing section name in /path/to/smarty/Smarty.class.php on line 1041 Smarty vous indique le nom du template, le numéro de la ligne et l'erreur. Après cela, vous pouvez connaître le numéro de ligne où il y a eu erreur dans la définition de la classe Smarty. Il y a certaines erreurs que Smarty ne peut pas détecter, comme les balises fermantes manquantes. Ce type d'erreurs est la plupart du temps repéré dans la phase de compilation PHP du template compilé. erreur d'analyse PHP Parse error: parse error in /path/to/smarty/templates_c/index.tpl.php on line 75 Quand vous rencontrez une erreur d'analyse PHP, le numéro de la ligne indiqué est celui du fichier PHP compilé et non du template. Vous pouvez alors regarder le template et détecter l'erreur. Voici quelques erreurs fréquentes : balises fermantes pour {if}{/if} ou {section}{/section} manquantes, ou syntaxe logique incorrecte dans une instruction {if}. Si vous ne trouvez pas l'erreur, vous devrez alors ouvrir le fichier PHP compilé et aller à la ligne correspondante pour trouver d'où vient l'erreur. Trucs et astuces Gestion des variables non-assignées Peut-être voudrez-vous des fois afficher une valeur par défaut pour une variable qui n'a pas été assignée, comme pour afficher "&nbsp;" afin que les couleurs de fond des tableaux fonctionnent. Beaucoup utiliseraient une instruction {if} pour gérer cela, mais il existe un moyen plus facile dans Smarty, l'utilisation du modificateur de variable default. afficher &nbsp; quand une variable est vide {* la méthode pas adaptée *} {if $title eq ""} &nbsp; {else} {$title} {/if} {* la bonne méthode *} {$title|default:"&nbsp;"} Gestion des variables par défaut Si une variable est utilisée fréquemment dans vos templates, lui appliquer le modificateur par défaut peut être un peu fastidieux. Vous pouvez remédier à cela en lui assignant une valeur par défaut avec la fonction assign. assigner une valeur par défaut à une variable de template {* faites cela qq part en haut de votre template *} {assign var="title" value=$title|default:"no title"} {* si $title est vide, il contiendra alors no "no title" *} {$title} Passage du titre à un template d'en-tête Quand la majorité de vos templates utilisent les mêmes en-tête et pied-de-page, il est d'usage de les mettre dans leurs propres templates et de les inclure. Mais comment faire si l'en-tête doit avoir un titre différent, selon la page d'où on vient ? Vous pouvez passer le titre à l'en-tête quand il est inclus. passer le titre au template d'en-tête mainpage.tpl ------------ {include file="header.tpl" title="Main Page"} {* le corps du template va ici *} {include file="footer.tpl"} archives.tpl ------------ {config_load file="archive_page.conf"} {include file="header.tpl" title=#archivePageTitle#} {* le corps du template va ici *} {include file="footer.tpl"} header.tpl ---------- <HTML> <HEAD> <TITLE>{$title|default:"BC News"}</TITLE> </HEAD> <BODY> footer.tpl ---------- </BODY> </HTML> Quand la page principale est conçue, le titre "Main page" est passé à header.tpl et sera donc utilisé pour le titre. Quand la page d'archive est conçue, le titre sera "Archives". Notez que dans l'exemple des archives, on utilise le fichier archives_page.conf plutôt que des variables codées en dur. Remarquez aussi que "BC News" est affichée si la variable $title n'est pas définie, grâce au modificateur de variable default. Dates De façon générale, essayez de toujours passer les dates à Smarty sous forme de timestamp. Cela permet aux designers de templates d'utiliser date_format pour avoir un contrôle total sur le formatage des dates et de comparer facilement les dates entre elles. NOTE : à partir Smarty 1.4.0, vous pouvez passer les dates à Smarty sous la forme de timestamps Unix ou MySQL, ou tout autre format de dates que comprend strtotime(). utilisation de date_format {$startDate|date_format} OUTPUT: Jan 4, 2001 {$startDate|date_format:"%Y/%m/%d"} OUTPUT: 2001/01/04 {if $date1 < $date2} ... {/if} En utilisant la fonction {html_select_date} dans un template, le programmeur veut en général convertir le résultat d'un formulaire en un timestamp. Voici une fonction qui devrait vous être utile. conversion des éléments date d'un formulaire en timestamp // cela suppose que vos éléments de formulaire soient nommés // 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 Les templates WAP/WML nécessitent un en-tête "Content-Type" qui doit être passé avec le template. Le moyen le plus facile de faire cela est d'écrire une fonction utilisateur qui écrit l'en-tête. Si vous utilisez le cache, cela ne fonctionnera pas. Nous utiliserons donc une balise d'insertion (rappelez-vous que les balises d'insertion ne sont pas mises en cache !). Assurez-vous qu'aucune sortie rien n'est transmise au navigateur avant l'appel du template, sans quoi la modification de l'en-tête échouera. utilisation d'insert pour écrire un en-tête Content-Type WML // assurez-vous que Apache est configuré pour les extensions .wml ! // mettez cette fonction qq part dans votre applications // ou dans Smarty.addons.php function insert_header() { // cette fonction attend un argument $content extract(func_get_arg(0)); if(empty($content)) return; header($content); return; } // votre template Smarty DOIT commencer avec la balise d'insertion <?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"> <!-- begin new wml deck --> <wml> <!-- begin first card --> <card> <do type="accept"> <go href="#two"/> </do> <p> Welcome to WAP with Smarty! Press OK to continue... </p> </card> <!-- begin second card --> <card id="two"> <p> Pretty easy isn't it? </p> </card> </wml> Templates composants Cette astuce tient plus du hack qu'autre chose mais n'en demeure pas moins une idée plutôt chouette. Utilisez-la à vos propres risques. ;-) Traditionnellemnt, la programmation avec des templates dans les applications se déroule de la façon suivante : d'abord vous récupérez vos variables dans l'application PHP (peut-être avec des requêtes en base de données), puis vous instanciez votre objet Smarty, assignez les variables et affichez le template. Disons par exemple que nous avons un téléscripteur dans notre template. Nous récupérerions les données dans notre application, puis les assignerions ensuite pour les afficher. Mais ne serait-ce pas mieux de pouvoir ajouter ce téléscripteur à n'importe quelle application en incluant directement le template sans avoir à se soucier de la récupération des données. Vous pouvez intégrer du PHP dans vos templates avec les balises {php}{/php}. Avec cette méthode, vous pouvez inclure des templates complets, dans la mesure où ils récupèrent leurs propres données pour les assigner à leurs propres variables. Avec le traitement intégré de cette façon, vous pouvez garder le template et le traitement ensemble. Ainsi, on ne se soucie plus d'où vient le contenu du template, tout vient comme un seul et unique composant. template composant {* Smarty *} {php} // notre fonction pour récupérer les données function fetch_ticker($symbol,&$ticker_name,&$ticker_price) { // du traitement qui récupère $ticker_name // $ticker_price } // appelle la fonction fetch_ticker("YHOO",$ticker_name,$ticker_price); // assigne les variables $this->assign("ticker_name",$ticker_name); $this->assign("ticker_price",$ticker_price); {/php} Stock Name: {$ticker_name} Stock Price: {$ticker_price} A partir de Smarty 1.5.0, il y a même un moyen plus propre. Vous pouvez inclure du PHP dans votre template avec la balise {include_php ...}. De cette façon, vous pouvez garder séparée la logique applicative de la logique de présentation. Reportez-vous à la fonction include_php pour plus d'informations. template composant avec include_php load_ticker.php --------------- <?php // notre fonction pour récupérer les données function fetch_ticker($symbol,&$ticker_name,&$ticker_price) { // put logic here that fetches $ticker_name // and $ticker_price from some resource } // appelle la fonction fetch_ticker("YHOO",$ticker_name,$ticker_price); // assigne les variables $this->assign("ticker_name",$ticker_name); $this->assign("ticker_price",$ticker_price); ?> index.tpl --------- {* Smarty *} {include_php file="load_ticker.php"} Stock Name: {$ticker_name} Stock Price: {$ticker_price} Dissimuler les adresses email Vous-êtes vous déjà demandé pourquoi vos adresses emails sont sur autant de mailing listes de spam ? Une façon pour les spammers de récupérer les adresses est de parcourir les pages Web. Voici une façon de remédier à ce problème : mettre votre adresse email dans du Javascript brouillé au milieu de votre source HTML, sans que cela ne gêne l'affichage sur le navigateur Web. Cela est fait grâce au plugin mailto. exemple de dissimulation d'une adresse email index.tpl --------- Send inquiries to {mailto address=$EmailAddress encode="javascript" subject="Hello"} Note technique Cette méthode n'est pas infaillible. Un spammer peut programmer son collecteur d'email pour passer outre cette astuce, mais c'est cependant peu probable. Ressources La page Web de Smarty se trouve à l'adresse suivante : http://smarty.php.net/. Vous pouvez souscrire à la mailing liste en envoyant un email à smarty-general-subscribe@lists.php.net. Les archives de la mailing list se trouvent à l'adresse suivante : http://marc.theaimsgroup.com/?l=smarty&r=1&w=2 BUGS Vérifiez le fichier de BUGS fourni avec la dernière version de Smarty ou consultez le site Web.