Smarty pour les programmeurs Constantes SMARTY_DIR Il doit s'agir du chemin complet du répertoire où se trouvent les fichiers classes de Smarty. S'il n'est pas défini, Smarty essaiera alors d'en déterminer automatiquement la valeur. S'il est défini, le chemin doit se terminer par un slash. SMARTY_DIR // définit le chemin du répertoire de Smarty define("SMARTY_DIR","/usr/local/lib/php/Smarty/"); require_once(SMARTY_DIR."Smarty.class.php"); Variables $template_dir C'est le nom par défaut du répertoire des templates. Si vous ne spécifiez aucun chemin lors de l'utilisation de templates, Smarty les cherchera à cet emplacement. Par défaut, il s'agit de "./templates", ce qui signifie qu'il va chercher le répertoire templates dans le répertoire où se trouve le script PHP en cours d'exécution. Note technique Il n'est pas conseillé de mettre ce répertoire dans l'arborescence Web. $compile_dir C'est le nom du répertoire où se trouvent les templates compilés. Par défaut, il s'agit de "./templates_c", ce qui signifie que Smarty va chercher ce répertoire dans le même répertoire que le script PHP en cours d'exécution. Note technique Ce réglage doit être soit un chemin absolu, soit un chemin relatif. include_path n'est pas utilisé pour écrire des fichiers. Note technique Il n'est pas conseillé de mettre ce répertoire sous la racine de l'arborescence Web. $config_dir Il s'agit du répertoire utilisé pour stocker les fichiers de configuration utilisés dans les templates. La valeur par défaut est "./configs", ce qui signifie que Smarty va chercher ce répertoire dans le même répertoire que le script PHP qui s'exécute. Note technique Il n'est pas conseillé de mettre ce répertoire sous la racine de l'arborescence Web. $plugins_dir Ce sont les répertoire dans lesquels Smarty ira chercher les plugins dont il a besoin. La valeur par défaut est "plugins" sous le répertoire SMARTY_DIR. Si vous donnez un chemin relatif, Smarty regardera d'abord relativement au SMARTY_DIR, puis relativement au rtc (répertoire de travail courant), puis relativement à chaque entrée de votre répertoire d'inclusion PHP. Note technique Pour des raisons de performances, ne réglez pas votre plugins_dir pour qu'il utilise votre include_path PHP. Utilisez un chemin absolu ou un chemin relatif à SMARTY_DIR ou au rtc. $debugging Cela active la console de débogage. La console est une fenêtre javascript qui vous informe des templates inclus et des variables assignées dans la page courante. $debug_tpl C'est le nom du fichier template utilisé pour la console de débuggage. Par défaut debug.tpl, il se situe dans SMARTY_DIR $debugging_ctrl Cela permet d'avoir différents moyens pour activer le débogage. URL signifie que si SMARTY_DEBUG se trouve dans QUERY_STRING, le débuggage est activé à l'invocation du script. Si $debugging est à vrai, cette valeur est sans effet. $global_assign C'est une liste de variable qui sont toujours implicitement assignées au moteur de templates. Ceci est commode pour rendre des variables globales ou des variables du serveur accessibles à tous les templates plutôt que de devoir les assigner à la main. Chaque élément de $global_assign doit être soit le nom de la variable globale, soit une paire clef/valeur, où clef est le nom du tableau global et valeur le tableau de variable assignées depuis ce tableau global. $SCRIPT_NAME est globalement assigné par défaut depuis $HTTP_SERVER_VARS. Note technique On peut accéder aux variables du serveur avec la variable $smarty, par exemple {$smarty.server.SCRIPT_NAME}. Se reporter à la section sur la variable $smarty. $undefined Cela règle la valeur de $undefined, null par défaut. N'est actuellement utilisé que pour initialiser des variables non-définies dans $global_assign à des valeurs par défaut. $autoload_filters Si vous désirez charger des filtres à chaque invocation de templates, vous pouvez le spécifier en utilisant cette variable. Les types de filtres et les valeurs sont des tableaux comportant le nom des filtres. $smarty->autoload_filters = array('pre' => array('trim', 'stamp'), 'output' => array('convert')); $compile_check A chaque invocation de l'application PHP, Smarty fait un test pour voir si le template courant a été modifié (date de dernière modification différente) depuis sa dernière compilation. S'il a changé, le template est recompilé. Si le template n'a pas encore été compilé, il le sera quelle que soit la valeur ce réglage. Par défaut cette valeur est à vrai. Quand une application est mise en production (les templates ne changent plus), cette vérification n'est pas nécessaire. Assurez-vous de mettre $compile_check à "false" pour des performances maximales. Notez que si vous mettez ce paramètre à "false" et qu'un template est modifié, vous ne verrez *pas* le changement car le template ne sera *pas* recompilé. Si le processus de cache est activé et que $compile_check l'est aussi, alors les fichiers du cache seront regénérés si un template concerné ou un fichier de configuration concerné est modifié. Voir aussi $force_compile ou clear_compiled_tpl. $force_compile Cela oblige Smarty à (re)compiler les templates à chaque invocation. Ce réglage supplante $compile_check. Par défaut, il est désactivé. Ceci est commode pour le développement et le débogage mais ne devrait jamais être utilisé dans un environnment de production. Si le système de cache est actif, les fichiers du cache seront regénérés à chaque appel. $caching Ce paramètre demande à Smarty de mettre ou non en cache la sortie des templates. Par défaut ce réglage est à 0 (désactivé). Si vos templates génèrent du contenu redondant, il est conseillé d'activer le cache. Cela permettra un gain de performance conséquent. Vous pouvez aussi avoir de nombreux fichiers de cache pour un même template. Une valeur de 1 ou 2 active le cache. 1 indique à Smarty d'utiliser la variable $cache_lifetime pour déterminer si le fichier de cache a expiré. Une valeur de 2 indique à Smarty d'utiliser la valeur $cache_lifetime spécifiée à la génération du cache. Ainsi vous pouvez régler la durée de vie d'un fichier de cache avant de récupérer le template pour avoir un certain contrôle quand ce fichier en particulier expire. Voir aussi is_cached. Si $compile_check est actif, le contenu du cache sera regénéré si un des templates ou un des fichiers de configuration qui fait partie de ce fichier de cache a été modifié. Si $force_compile est actif, le contenu du cache est toujours regénéré. $cache_dir Il s'agit du nom du répertoire où les caches des templates sont stockés. Par défaut il s'agit de "./cache", ce qui signifie que Smarty va chercher ce répertoire dans le même répertoire que le script PHP en cours d'exécution. Note technique Ce réglage doit être soit un chemin absolu, soit un chemin relatif. include_path n'a aucune influence lors de l'écriture des fichiers. Technical Note Il n'est pas conseillé de mettre ce répertoire dans l'arborescence Web. $cache_lifetime Il s'agit de la durée en secondes pendant laquelle un cache de template est valide. Une fois cette durée dépassée, le cache est regénéré. $caching doit être à "true" pour que $cache_lifetime ait une quelconque utilité. Avec une valeur de -1, le cache n'expire jamais. Avec une valeur de 0, le cache est toujours regénéré (utile à des fins de tests seulement. Une meilleure façon de désactiver le cache est de mettre $caching à "false"). Si $force_compile est activé, les fichiers du cache seront regénérés à chaque fois, désactivant ainsi le cache. Vous pouvez effacer tous les fichiers du cache avec la function clear_all_cache() ou de façon individuelle (ou groupée) avec la fonction clear_cache(). Note technique Si vous souhaitez donner à certains templates leur propre durée de vie en cache, vous pouvez le faire en réglant $caching à 2, puis $cache_lifetime à une unique valeur juste avant d'appeler display ou fetch(). $cache_handler_func Vous pouvez utiliser votre propre fonction de gestion du cache plutôt que d'utiliser celle livrée avec Smarty. Référez-vous à la section sur la fonction de gestion de cache personnalisée pour plus de détails. $cache_modified_check Si cette variable est à vrai, Smarty respectera l'en-tête If-Modified-Since envoyé par le client. Si la date de dernière modification du fichier de cache n'a pas changé depuis la dernière visite, alors un en-tête "304 Not Modified" sera envoyé à la place du contenu. Cela ne fonctionne qu'avec du contenu mis en cache hors de la balise insert. $config_overwrite Si cette variable est à vrai, les variables lues dans les fichiers de configuration peuvent s'écraser entre elles. Sinon les variables seront mises dans un tableau. Très utile si vous voulez stocker des tableaux de données dans des fichiers de configuration, listez simplement chaque élément plusieurs fois. Mise à faux par défaut. $config_booleanize Si cette variable est à vrai, les valeurs on/true/yes et off/false/no dans les fichiers de configuration sont automitiquement converties en booléen. De cette façon vous pouvez utiliser ces valeurs dans le template de la façon suivante : {if #foobar#} ... {/if}. Si foobar est à on, true ou yes, l'instruction {if} sera exécutée. vrai par défaut. $config_read_hidden Si cette variable est à vrai, les sections cachés (dont les noms commencent par un point) dans les fichiers de configuration peuvent être lues depuis les templates. On laisse habituellement cela à faux, de cette façon vous pouvez stocker des données sensibles dans les fichiers de configuration, comme par exemple des paramètres de base de données, sans vous soucier de la façon dont les templates les chargent. Mise à faux par défaut. $config_fix_newlines Si cette variable est mise à vrai, les caractères de nouvelles lignes mac et dos (\r et \r\n) sont convertis en \n quand ils sont analysés. vrai par défaut. $default_template_handler_func Cette fonction est appelée quand un template ne peut pas être obtenu avec sa ressource. $php_handling Indique à Smarty comment interpréter le code PHP intégré dans les templates. Il y a quatre valeurs possibles, par défaut SMARTY_PHP_PASSTHRU. Notez que cela n'affecte PAS le code PHP entouré des balises {php}{/php} dans le template. SMARTY_PHP_PASSTHRU - Smarty écrit les balises telles quelles. SMARTY_PHP_QUOTE - Smarty transforme les balises en entités HTML. SMARTY_PHP_REMOVE - Smarty supprime les balises des templates. SMARTY_PHP_ALLOW - Smarty exécute les balises comme du code PHP. NOTE : Intégrer du code PHP dans les templates est vivement déconseillé. Préférez les fonctions utilisateurs ou les modificateurs de variables. $security Cette variable est à faux par défaut. $security est de rigueur quand vous n'êtes pas complètement sûr des personnes qui éditent les templates (par ftp par exemple) et que vous voulez réduire le risque que la sécurité du système soit compromise par le language de template. Activer cette option de sécurité applique les règles suivantes au langage de template, à moins que $security_settings ne spécifie le contraire : Si $php_handling est réglée à SMARTY_PHP_ALLOW, cela est implicitement changé à SMARTY_PHP_PASSTHRU. Les fonctions PHP ne sont pas autorisées dans les instructions IF, à part celles déclarées dans $security_settings. Les templates ne peuvent être inclus que depuis des répertoires listés dans le tableau $security_dir. Les fichiers locaux ne peuvent être récupérés que depuis les répertoires listés dans le tableau $security_dir en utilisant {fetch}. Les balises {php}{/php} ne sont pas autorisées. Les fonctions PHP ne sont pas autorisées en tant modificateurs, à part celles spécifiées dans $security_settings. $secure_dir Il s'agit d'un tableau contenant tous les répertoires locaux qui sont considérés comme sécurisés. {include} et {fetch} l'utilisent quand la sécurité est activée. $security_settings Ces réglages servent à écraser ou spécifier les paramètres de sécurité quand celle-ci est activée. Les réglages possibles sont les suivants : PHP_HANDLING - true/false. Si vrai, le réglage $php_handling n'est pas vérifié. IF_FUNCS - Le tableau des noms de fonctions PHP autorisées dans les intructions IF. INCLUDE_ANY - true/false. Si vrai, les templates peuvent être inclus de n'importe où, quelque soit le contenu de $secure_dir. PHP_TAGS - true/false. Si vrai, les balises {php}{/php} sont autorisées dans les templates. MODIFIER_FUNCS - Le tableau des noms de fonctions autorisées à être utilisées comme modificateurs de variables. $trusted_dir $trusted_dir n'est utilisée lorsque $security est activée. C'est un tableau de tous les répertoires qui peuvent être considérés comme sûrs. Les répertoires sûrs sont ceux qui contiennent des scripts PHP qui sont exécutés directement depuis les templates avec {include_php}. $left_delimiter Il s'agit du délimiteur gauche utilisé par le moteur de templates. La valeur par défaut est "{". $right_delimiter Il s'agit du délimiteur droit utilisé par le moteur de templates. La valeur par défaut est "}". $compiler_class Spécifie le nom de la classe du compilateur qui va être utilisée pour compiler les templates. Le compilateur par défaut est 'Smarty_Compiler'. Réservé aux utilisateurs avancés. $request_vars_order L'ordre dans lequel les variables de requêtes sont enregistrées, identique à variables_order dans php.ini. $compile_id Identifiant persistant du compilateur. On peut passer le même compile_id à chaque appel de fonction mais une alternative consiste à régler ce compile_id, qui sera utilisé implicitement. $use_sub_dirs Régler cela à faux si votre environnement PHP n'autorise pas Smarty à créer des sous-répertoires. Les sous-répertoires sont efficaces, utilisez-les quand vous le pouvez. $default_modifiers Il s'agit d'un tableau de modificateurs utilisé pour assigner une valeur par défaut à chaque variable dans un template. Par exemple, pour par défaut échapper les caractères HTML de chaque variable, utilisez array('escape:"htmlall"'); Pour rendre une variable indépendante des modificateurs par défaut, passez-lui en paramètre le modificateur "nodefaults" : {$var|nodefaults}. Méthodes append void append mixed var void append string varname mixed var void append string varname mixed var boolean merge Utilisée pour ajouter un élément à un tableau assigné. Si vous utilisez cette fonction avec une chaîne de caractère, elle est convertie en tableau auquel on ajoute ensuite l'élément. Vous pouvez explicitement passer des paires nom/valeur. Si vous passez le troisième paramètre (optionel) à vrai, la valeur sera fusionnée avec le tableau plutôt que d'être ajoutée. Note technique Le paramètre de fusion respecte les clés des tableaux, ainsi si vous fusionnez deux tableaux indexés numériquement, ils pourront s'écraser l'un l'autre ou donner des clés qui ne se suivent pas. Cela diffère donc de la fonction PHP array_merge() qui supprime les clés numériques et les renumérote. append // passe des paires nom/valeur $smarty->append("Name","Fred"); $smarty->append("Address",$address); // passe un tableau associatif $smarty->append(array("city" => "Lincoln","state" => "Nebraska")); append_by_ref void append_by_ref string varname mixed var void append_by_ref string varname mixed var boolean merge Utilisée pour ajouter des valeurs à un template par référence plutôt que par copie. Si vous ajoutez une variable par référence puis changez sa valeur, le changement est aussi répercuté sur la valeur assignée. Pour les objets, append_by_ref ne fait pas de copie en mémoire de l'objet assigné. Voir la documentation PHP pour plus d'informations sur les références de variable. Si vous passez le troisième paramètre à vrai, la valeur sera fusionnée avec le tableau courant plutôt que d'être ajoutée. Note technique Le paramètre de fusion respecte les clés des tableaux, ainsi si vous fusionnez deux tableaux indexés numériquement, ils pourront s'écraser l'un l'autre ou donner des clés qui ne se suivent pas. Cela diffère donc de la fonction PHP array_merge() qui supprime les clés numériques et les renumérote. append_by_ref // ajoute des paires nom/valeur $smarty->append_by_ref("Name",$myname); $smarty->append_by_ref("Address",$address); assign void assign mixed var void assign string varname mixed var Utilisée pour assigner des valeurs aux templates. Vous pouvez explicitement passer des paires nom/valeur, ou des tableaux associatifs contenant des paires nom/valeur. assign // passe des paires nom/valeur $smarty->assign("Name","Fred"); $smarty->assign("Address",$address); // passe un tableau associatif $smarty->assign(array("city" => "Lincoln","state" => "Nebraska")); assign_by_ref void assign_by_ref string varname mixed var Utilisée pour assigner des valeurs aux templates par référence plutôt que par copie. Référez-vous au manuel PHP pour une explication plus précise sur les références des variables. Note technique Si vous assignez une variable par référence puis changez sa valeur, le changement est aussi répercuté sur la valeur assignée. Pour les objets, assign_by_ref ne fait pas de copie en mémoire de l'objet assigné. Référez-vous au manuel PHP pour une explication plus précise sur les références de variable. assign_by_ref // passe des paires noms/valeurs $smarty->assign_by_ref("Name",$myname); $smarty->assign_by_ref("Address",$address); clear_all_assign void clear_all_assign Utilisée pour effacer les valeurs de toutes les variables assignées. clear_all_assign // efface toutes les variables assignées $smarty->clear_all_assign(); clear_all_cache void clear_all_cache int expire time Utilisée pour effacer les fichiers de cache des templates. Vous pouvez passer un paramètre optionnel afin d'indiquer l'âge minimun que doivent avoir les fichiers de cache pour qu'ils soient effacés. clear_all_cache // efface le cache $smarty->clear_all_cache(); clear_assign void clear_assign string var Efface la valeur d'une variable assignée. Il peut s'agir d'une simple valeur ou d'un tableau de valeur. clear_assign // efface une variable $smarty->clear_assign("Name"); // efface plusieurs variables $smarty->clear_assign(array("Name","Address","Zip")); clear_cache void clear_cache string template string cache id string compile id int expire time Utilisée pour nettoyer le(s) fichier(s) de cache d'un template en particulier. Si vous avez plusieurs fichiers de cache pour ce template vous pouvez en spécifier un en particulier en passant son identifiant en deuxième paramètre. Vous pouvez aussi passer un identifiant de compilation en troisième paramètre. Vous pouvez grouper des templates ensemble afin qu'ils puissent être supprimés en groupe. Référez-vous à la section sur le cache pour plus d'informations. Vous pouvez passer un quatrième paramètre pour indiquer un âge minimum en secondes que le fichier en cache doit avoir avant d'être effacé. clear_cache // efface le fichier de cache de ce template $smarty->clear_cache("index.tpl"); // efface un fichier de cache grâce à son identifiant de cache $smarty->clear_cache("index.tpl","CACHEID"); clear_compiled_tpl void clear_compiled_tpl string tpl_file Utilisée pour effacer la version compilée du template spécifié ou de tous les templates si aucun n'est spécifié. Cette fonction est destinée à un usage avancé et n'est pas habituellement utilisée. clear_compiled_tpl // efface la version compilée du template spécifié $smarty->clear_compiled_tpl("index.tpl"); // efface tout le contenu du répertoire des templates compilés $smarty->clear_compiled_tpl(); clear_config void clear_config string var Utilisée pour effacer toutes les variables de configuration s'étant vues assigner une valeur. Si une variable est spécifiée, seule cette variable est effacée. clear_config // efface toutes les variables de configuration assignées $smarty->clear_config(); // efface une seule variable $smarty->clear_config('foobar'); config_load void config_load string file string section Utilisée pour charger des données d'un fichier de config et les assigner à un template. Cette fonction fonctionne exactement comme la fonction de template config_load. Note technique Comme pour Smarty 2.4.0, les variables de templates assignées sont conservées entre chaque appel à fetch et display. Les variables de configuration chargées avec config_load sont globales. Les fichiers de config sont aussi compilés pour une exécution plus rapide et respecte les réglages de force_compile et de compile_check. config_load // charge les variables de configuration et les assigne $smarty->config_load('my.conf'); // charge une section $smarty->config_load('my.conf','foobar'); display void display string template string cache_id string compile_id Utilisée pour afficher un template. Il faut fournir un type et un chemin de ressource template valides. Vous pouvez passer en second paramètre un identifiant de fichier de cache. Reportez-vous à la section cache pour plus de renseignements. Le troisième paramètre optionnel est un identifiant de compilation. Cela s'avère utile quand vous voulez compiler différentes versions d'un même template, pour par exemple avoir des templates compilés séparés pour différents langages. Une autre utilité de ce paramètre est le cas où vous utilisez plus d'un $template_dir mais un seul $compile_dir, car certains templates avec le même nom s'écraseraient entre eux. Vous pouvez aussi régler la variable $compile_id une seule fois au lieu de la passer à chaque appel. affichage include("Smarty.class.php"); $smarty = new Smarty; $smarty->caching = true; // ne fait un appel à la base de données que si le fichier // de cache n'existe pas if(!$smarty->is_cached("index.tpl")) { // quelques données $address = "245 N 50th"; $db_data = array( "City" => "Lincoln", "State" => "Nebraska", "Zip" = > "68502" ); $smarty->assign("Name","Fred"); $smarty->assign("Address",$address); $smarty->assign($db_data); } // display the output $smarty->display("index.tpl"); Utilisez la syntaxe des ressources templates pour afficher des fichiers en-dehors du répertoire $template_dir exemples de fonction d'affichage de ressources templates // chemin absolu $smarty->display("/usr/local/include/templates/header.tpl"); // chemin absolu (pareil) $smarty->display("file:/usr/local/include/templates/header.tpl"); // chemin absolu Windows (on DOIT utiliser le préfixe "file:") $smarty->display("file:C:/www/pub/templates/header.tpl"); // inclue à partir de la ressource template "db" $smarty->display("db:header.tpl"); fetch string fetch string template string cache_id string compile_id Utilisée pour renvoyer le résultat du template plutôt que de l'afficher. Il faut passer un type et un chemin de ressource template valides. Vous pouvez passer un identifiant de cache en deuxième paramètre. Reportez-vous à la section cache pour plus de renseignements. Un troisième paramètre optionnel est un identifiant de compilation. Cela s'avère utile quand vous voulez compiler différentes versions d'un même template, pour par exemple avoir des templates compilés séparés pour différents langages. Une autre utilité de ce paramètre est le cas où vous utilisez plus d'un $template_dir mais un seul $compile_dir, car certains templates avec le même nom s'écraseraient entre eux. Vous pouvez aussi régler la variable $compile_id une seule fois plutôt que de la passer à chaque appel. fetch include("Smarty.class.php"); $smarty = new Smarty; $smarty->caching = true; // ne fait un appel à la base de données que si le fichier // de cache n'existe pas if(!$smarty->is_cached("index.tpl")) { // quelques données $address = "245 N 50th"; $db_data = array( "City" => "Lincoln", "State" => "Nebraska", "Zip" = > "68502" ); $smarty->assign("Name","Fred"); $smarty->assign("Address",$address); $smarty->assign($db_data); } // récupère le résultat $output = $smarty->fetch("index.tpl"); // fait quelque chose avec $output echo $output; get_config_vars array get_config_vars string varname Retourne la valeur de la variable de configuration passée en paramètre. Si aucun paramètre n'est donné, un tableau de toutes les variables de configuration chargées est renvoyé. get_config_vars // récupère la variable de configuration chargée 'foo' $foo = $smarty->get_config_vars('foo'); // récupère toutes les variables de configuration chargées $config_vars = $smarty->get_config_vars(); // les affiche à l'écran print_r($config_vars); get_registered_object array get_registered_object string object_name Retourne la référence d'un objet enregistré. Utile quand vous voulez accéder directement à un objet enregistré avec une fonction utilisateur. get_registered_object function smarty_block_foo($params, &$smarty) { if (isset[$params['object']]) { // récupère la référence de l'objet enregistré $obj_ref =& $smarty->get_registered_object($params['object']); // $obj_ref est maintenant une référence vers l'objet } } get_template_vars array get_template_vars string varname Retourne la valeur assignée passée en paramètre. Si aucun paramètre n'est donné, un tableau de toutes les variables assignées est renvoyé. get_template_vars // récupère la variable 'foo' assignée au template // get assigned template var 'foo' $foo = $smarty->get_template_vars('foo'); // récupère toutes les variables assignées à ce template $tpl_vars = $smarty->get_template_vars(); // les affiche à l'écran print_r($tpl_vars); is_cached void is_cached string template [string cache_id] Retourne vrai s'il y a un fichier de cache valide pour ce template. Cela fonctionne seulement si caching est à vrai. is_cached $smarty->caching = true; if(!$smarty->is_cached("index.tpl")) { // faire des requêtes base de données et assigner // des variables ici. } $smarty->display("index.tpl"); Vous pouvez aussi passer en second paramètre un identifiant de cache au cas où vous voudriez plusieurs fichiers de cache pour ce template. is_cached with multiple-cache template $smarty->caching = true; if(!$smarty->is_cached("index.tpl","FrontPage")) { // faire des requêtes base de données et assigner // des variables ici. } $smarty->display("index.tpl","FrontPage"); load_filter void load_filter string type string name Cette fonction peut être utilisée pour charger un plugin de filtrage. Le premier argument spécifie le type du filtre et peut prendre l'une des valeurs suivantes : 'pre', 'post' ou 'output'. Le second argument spécifie le nom du plugin de filtrage, par exemple 'trim'. Chargement de plugins de filtrage $smarty->load_filter('pre', 'trim'); // charge le filtre 'trim' de type 'pre' $smarty->load_filter('pre', 'datefooter'); // charge un autre filtre de type 'pre' appelé 'datefooter' $smarty->load_filter('output', 'compress'); // charge le filtre 'compress' de type 'output' register_block void register_block string name string impl Utilisée pour déclarrer dynamiquement des plugins de fonction de blocs. Il faut passer en paramètre le nom de la fonction de blocs, suivi du nom de la fonction PHP qui l'implémente. register_block /* PHP */ $smarty->register_block("translate", "do_translation"); function do_translation ($params, $content, &$smarty) { if ($content) { $lang = $params['lang']; // fait de la traduction avec la variable $content echo $translation; } } {* template *} {translate lang="br"} Hello, world! {/translate} register_compiler_function void register_compiler_function string name string impl Utilisée pour déclarer dynamiquement un plugin de fonction de compilation. Il faut passer en paramètres le nom de la fonction de compilation, suivi par la fonction PHP qui l'implémente. register_function void register_function string name string impl Utilisée pour déclarer dynamiquement des plugins de fonction de templates. Il faut passer en paramètres le nom de la fonction de templates, suivi par le nom de la fonction PHP qui l'implémente. register_function $smarty->register_function("date_now", "print_current_date"); function print_current_date ($params) { extract($params); if(empty($format)) $format="%b %e, %Y"; echo strftime($format,time()); } // vous pouvez maintenant utiliser ceci dans Smarty pour afficher // la date actuelle : {date_now} ou {date_now format="%Y/%m/%d"} // pour la formater register_modifier void register_modifier string name string impl Utilisée pour déclarer dynamiquement un plugin de modificateur. Il faut passer en paramètre le nom du modificateur de variables, suivi de la fonction PHP qui l'implémente. register_modifier // associons la fonction PHP stripslashes à un modificateur Smarty. $smarty->register_modifier("sslash","stripslashes"); // vous pouvez maintenant utiliser {$var|sslash} pour supprimer les slash des variables register_object void register_object string object_name object $object array allowed methods/properties boolean format Utilisée pour enregistrer un objet à utiliser dans un template. Reportez-vous à la section objet de ce manuel pour des exemples. register_outputfilter void register_outputfilter string function_name Utilisée pour déclarer dynamiquement des filtres de sortie, pour agir sur la sortie d'un template avant qu'elle ne soit affichée. Reportez-vous à la section filtres de sortie pour plus d'information sur le sujet. register_postfilter void register_postfilter string function_name Utilisée pour déclarer dynamiquement des filtres de post-compilation pour y faire passer des templates une fois qu'ils ont été compilés. Reportez-vous à la section filtres de post-compilation de templates pour avoir plus de renseignements sur la façon de paramétrer les fonctions de post-compilation. register_prefilter void register_prefilter string function_name Utilisée pour déclarer dynamiquement des filtres de pré-compilation pour y faire passer des templates avant qu'ils ne soient compilés. Reportez-vous à la section filtres de pré-compilation de templates pour avoir plus de renseignements sur la façon de paramétrer les fonctions de pré-compilation. register_resource void register_resource string name array resource_funcs Utilisée pour déclarer dynamiquement une ressource plugin dans Smarty. Il faut passer en paramètre le nom de la ressource et le tableau des fonctions PHP qui l'implémentent. Reportez-vous à la section ressources templates pour avoir plus d'informations sur la façon de paramétrer une fonction récupérant des templates. register_resource $smarty->register_resource("db", array("db_get_template", "db_get_timestamp", "db_get_secure", "db_get_trusted")); trigger_error void trigger_error string error_msg [int level] Cette fonction peut-être utilisée pour afficher un message d'erreur en utilisant Smarty. Le paramètre level peut prendre l'une des valeures utilisées par la fonction PHP trigger_error, i.e. E_USER_NOTICE, E_USER_WARNING, etc. Par défaut il s'agit de E_USER_WARNING. template_exists bool template_exists string template Cette fonction vérifie si le template spécifié existe. Elle accepte soit un chemin vers le template, soit une ressource de type chaîne de caractères précisant le nom du template. unregister_block void unregister_block string name Utilisée pour désallouer dynamiquement un plugin de fonction de blocs. Passez en paramètre le nom du bloc. unregister_compiler_function void unregister_compiler_function string name Utilisée pour désallouer dynamiquement un fonction de compilation. Passez en paramètre le nom de la fonction de compilation. unregister_function void unregister_function string name Utilisée pour désallouer dynamiquement un plugin de fonction de templates. Passez en paramètres le nom de la fonction de templates. unregister_function // nous ne voulons pas que les designers de templates aient accès // au système de fichiers. $smarty->unregister_function("fetch"); unregister_modifier void unregister_modifier string name Utilisée pour désallouer dynamiquement un plugin modificateur de variable. Passez en paramètre le nom du modificateur de templates. unregister_modifier // nous ne voulons pas que les designers de templates // suppriment les balises des élements $smarty->unregister_modifier("strip_tags"); unregister_object void unregister_object string object_name Utilisée pour désallouer un objet. unregister_outputfilter void unregister_outputfilter string function_name Utilisée pour désallouer dynamiquement un filtre de sortie. unregister_postfilter void unregister_postfilter string function_name Utilisée pour désallouer dynamiquement un filtre de post-compilation. unregister_prefilter void unregister_prefilter string function_name Utilisée pour désallouer dynamiquement un filtre de pré-compilation. unregister_resource void unregister_resource string name Utilisée pour désallouer dynamiquement un plugin ressource. Passez en paramètre le nom de la ressource. unregister_resource $smarty->unregister_resource("db"); Cache Le cache est utilisée pour accélérer l'appel de display() ou de fetch() en sauvegardant leur résultat dans un fichier. Si un fichier de cache est disponible lors d'un appel, il sera affiché sans qu'il ne soit nécessaire de regénérer le résultat. Le système de cache peut accélérer les traitements de façon impressionnante, en particulier les templates dont la compilation est très longue. Comme le résultat de display() ou de fetch() est dans le cache, un fichier de cache peut être composé de plusieurs fichiers de templates, plusieurs fichiers de configuration, etc. Comme les templates sont dynamiques, il est important de faire attention à la façon dont les fichiers de cache sont générés, et pour combien de temps. Si par exemple vous affichez la page d'accueil de votre site Web dont le contenu ne change pas souvent, il peut être intéressant de mettre cette page dans le cache pour une heure ou plus. A l'inverse, si vous affichez une page de météo mises à jour toutes les minutes, mettre cette page en cache n'a aucun sens. Paramétrer le cache La première chose à faire est d'activer le cache. Cela est fait en mettant $caching = true (ou 1). activation du cache require('Smarty.class.php'); $smarty = new Smarty; $smarty->caching = true; $smarty->display('index.tpl'); Avec le cache activé, la fonction display('index.tpl') va afficher le template mais sauvegardera par la même occasion une copie du résultat dans un fichier (de cache) du répertoire $cache_dir. Au prochain appel de display('index.tpl'), le fichier de cache sera préféré à la réutilisation du template. Note technique Les fichiers situés dans $cache_dir sont nommés de la même façon que les templates. Bien qu'ils aient une extension ".php", ils ne sont pas vraiment exécutable. N'éditez surtout pas ces fichiers ! Tout fichier de cache à une durée de vie limitée déterminée par $cache_lifetime. La valeur par défaut est 3600 secondes, i.e. 1 heure. Une fois que cette durée est dépassée, le cache est regénéré. Il est possible de donner une durée d'expiration propre à chaque fichier de cache en réglant $caching = 2. Se reporter à la documentation de $cache_lifetime pour plus de détails. réglage individuel de cache_lifetime require('Smarty.class.php'); $smarty = new Smarty; $smarty->caching = 2; // régler la durée de vie individuellement // régle la durée de vie du cache à 15 minutes pour index.tpl $smarty->cache_lifetime = 300; $smarty->display('index.tpl'); // régle la durée de vie du cache à 1 heure pour home.tpl $smarty->cache_lifetime = 3600; $smarty->display('home.tpl'); // NOTE : le réglage suivant ne fonctionne pas quand $caching = 2. La durée de vie // du fichier de cache de home.tpl a déjà été réglée à 1 heure et ne respectera // plus la valeur de $cache_lifetime. Le cache de home.tpl expirera toujours // dans 1 heure. $smarty->cache_lifetime = 30; // 30 secondes $smarty->display('home.tpl'); Si $compile_check est actif, chaque fichier de template et de configuration qui a un rapport avec le fichier de cache sera vérifié pour détecter une éventuelle modification. Si l'un de ces fichiers a été modifié depuis que le fichier de cache a été généré, le cache est immédiatement regénéré. Ce processus est coûteux, donc, pour des raisons de performances, mettez ce paramètre à false pour une application en production. activation de $compile_check require('Smarty.class.php'); $smarty = new Smarty; $smarty->caching = true; $smarty->compile_check = true; $smarty->display('index.tpl'); Si $force_compile est actif, les fichiers de cache sont toujours regénérés. Ceci revient finalement à désactiver le cache. $force_compile est utilisé à des fins de débogage, un moyen plus efficace de désactiver le cache est de régler $caching = false (ou 0). La fonction is_cached() permet de tester si un template a ou non un fichier de cache valide. Si vous disposez d'un template en cache qui requiert une requête à une base de données, vous pouvez utiliser cette méthode plutôt que $compile_check. utilisation de is_cached() require('Smarty.class.php'); $smarty = new Smarty; $smarty->caching = true; if(!$smarty->is_cached('index.tpl')) { // pas de cache disponible, on assigne $contents = get_database_contents(); $smarty->assign($contents); } $smarty->display('index.tpl'); Vous pouvez rendre dynamiques seulement certaines parties d'une page avec la fonction de templates insert. Imaginons que toute une page doit être mise en cache à part une bannière en bas à droite. En utilisant une fonction insert pour la bannière, vous pouvez garder cet élément dynamique dans le contenu qui est en cache. Reportez-vous à la documentation insert pour plus de détails et des exemples. Vous pouvez effacer tous les fichiers du cache avec la fonction clear_all_cache(), ou de façon individuelle (ou par groupe) avec la fonction clear_cache(). nettoyage du cache require('Smarty.class.php'); $smarty = new Smarty; $smarty->caching = true; // efface tous les fichiers du cache $smarty->clear_all_cache(); // efface le fichier de cache du template 'index.tpl' $smarty->clear_cache('index.tpl'); $smarty->display('index.tpl'); Caches multiples pour une seule page Vous pouvez avoir plusieurs fichiers de caches pour un même appel aux fonctions display() ou fetch(). Imaginons qu'un appel à display('index.tpl') puisse avoir plusieurs résultats, en fonction de certaines conditions, et que vous vouliez des fichiers de cache séparés pour chacun d'eux. Vous pouvez faire cela en passant un identifiant de cache (cache_id) en deuxième paramètre à l'appel de fonction. Passage d'un cache_id à display() require('Smarty.class.php'); $smarty = new Smarty; $smarty->caching = true; $my_cache_id = $_GET['article_id']; $smarty->display('index.tpl',$my_cache_id); Nous passons ci-dessus la variable $my_cache_id à display() comme identifiant de cache. Pour chaque valeur distincte de $my_cache_id, un fichier de cache distinct va être créé. Dans cet exemple, "article_id" a été passé dans l'URL et est utilisé en tant qu'identifiant de cache. Note technique Soyez prudent en passant des valeurs depuis un client (navigateur Web) vers Smarty (ou vers n'importe quelle application PHP). Bien que l'exemple ci-dessus consistant à utiliser article_id depuis l'URL puisse paraître commode, le résultat peut s'avérer mauvais. L'identifiant de cache est utilisé pour créer un répertoire sur le système de fichiers, donc si l'utilisateur décide de donner une très grande valeur à article_id ou d'écrire un script qui envoie des article_id de façon aléatoire, cela pourra causer des problèmes coté serveur. Assurez-vous de bien tester toute donnée passée en paramètre avant de l'utiliser. Dans cet exemple, peut-être savez-vous que article_id a une longueur de 10 caractères, est exclusivement composé de caractères alph-numériques et doit avoir une valeur contenue dans la base de données. Vérifiez-le bien ! Assurez-vous de bien passer le même identifiant aux fonctions is_cached() et clear_cache(). passer un cache_id à is_cached() require('Smarty.class.php'); $smarty = new Smarty; $smarty->caching = true; $my_cache_id = $_GET['article_id']; if(!$smarty->is_cached('index.tpl',$my_cache_id)) { // pas de fichier de cache dispo, on assigne donc les variables $contents = get_database_contents(); $smarty->assign($contents); } $smarty->display('index.tpl',$my_cache_id); Vous pouvez effacer tous les fichiers de cache pour un identifiant de cache particulier en passant null en tant que premier paramètre à clear_cache(). effacement de tous les fichiers de cache pour un identifiant de cache particulier require('Smarty.class.php'); $smarty = new Smarty; $smarty->caching = true; // efface tous les fichiers de cache avec "sports" comme identifiant $smarty->clear_cache(null,"sports"); $smarty->display('index.tpl',"sports"); De cette manière vous pouvez "grouper" vos fichiers de cache en leur donnant le même identifiant. groupes de fichiers de cache Vous pouvez faire des groupements plus élaborés en paramétrant les groupes d'identifiant de cache. Il suffit de séparer chaque sous-groupes avec une barre verticale "|" dans la valeur de l'identifiant de cache. Vous pouvez faire autant de sous-groupes que vous le désirez. groupes d'identifiants de cache require('Smarty.class.php'); $smarty = new Smarty; $smarty->caching = true; // efface tous les fichiers de cache avec "sports|basketball" comme premiers // groupes d'identifiants de cache $smarty->clear_cache(null,"sports|basketball"); // efface tous les fichiers de cache "sports" comme premier groupe d'identifiants. // Inclue donc "sports|basketball" ou "sports|nimportequoi|nimportequoi|..." $smarty->clear_cache(null,"sports"); $smarty->display('index.tpl',"sports|basketball"); Note technique Le système de cache n'utilise PAS le chemin vers le template en quoi que ce soit pour l'identifiant de cache. Si par exemple vous faites display('themes/blue/index.tpl'), vous ne pouvez pas effacer tous les fichiers de cache dans le répertoire "theme/blue". Si vous voulez faire cela, vous devez les grouper avec un même identifiant de cache, display('themes/blue/index.tpl','themes|blue'). Vous pouvez ensuite effacer les fichiers de cache pour blue et theme avec clear_cache(null,'theme|blue'). Fonctionnalités avancées Objets Smarty donne l'accès aux objets PHP à travers les templates. Il y a 2 moyens d'y avoir accès. Le premier consiste à allouer les objets au template puis de les utiliser avec une syntaxe similaire à celles des fonctions personnalisées. Le deuxième moyen consiste à allouer des objets aux templates et de les utiliser comme n'importe quelle variable. La première méthode a une syntaxe beaucoup plus sympathique. Elle est aussi plus sécurisée, puisqu'un objet alloué ne peut avoir accès qu'à certaines méthodes et propriétés. Néanmoins, un objet alloué ne peut pas avoir de lien sur lui-même ou être mis dans un tableau d'objet, etc. Vous devez choisir la méthode qui correspond à vos besoins, mais tâchez d'utiliser la première méthode autant que possible afin de réduire la syntaxe des templates au minimum. Si l'option de sécurité est activée, aucune méthode ou fonctions privées n'est accessible (commençant par "_"). S'il existe une méthode et une propriété du même nom, c'est la méthode qui sera utilisée. Vous pouvez restreindre l'accès aux méthodes et aux propriétés en les listant dans un tableau en tant que troisième paramètre d'allocation. Par défaut, les paramètres passés aux objets depuis le templates le sont de la même façon que les fonctions utilisateurs les récupèrent. Le premier paramètre correspond à un tableau associatif, le second à l'objet Smarty. Si vous souhaitez que les paramètres soient passées un à un, comme dans un appel traditionnel, définissez registration, quatrième paramètre optionnel, à false. utilisation d'un objet alloué ou assigné <?php // la classe class My_Object() { function meth1($params, &$smarty_obj) { return "this is my meth1"; } } $myobj = new My_Object; // enregistre l'objet $smarty->register_object("foobar",$myobj); // on restreint l'accès à certaines méthodes et propriétés en les listant $smarty->register_object("foobar",$myobj,array('meth1','meth2','prop1')); // pour utiliser le format habituel de paramètre objet, passez le booléen = false $smarty->register_object("foobar",$myobj,null,false); // on peut aussi assigner des objets. Assignez par référence quand c'est possible $smarty->assign_by_ref("myobj", $myobj); $smarty->display("index.tpl"); ?> TEMPLATE: {* accès à notre objet enregistré *} {foobar->meth1 p1="foo" p2=$bar} {* on peut aussi assigner la sortie *} {foobar->meth1 p1="foo" p2=$bar assign="output"} the output was {$output) {* access our assigned object *} {$myobj->meth1("foo",$bar)} Filtres de pré-compilation Les filtres de pré-compilation sont des fonctions PHP que vos templates exécutent avant qu'ils ne soient compilés. Cela peut être utile pour pré-traiter vos templates afin d'enlever les commentaires inutiles, garder un oeil sur ce que les gens mettent dans leurs templates, etc. Les filtre de pré-compilations peuvent être soit déclarés soit chargés à partir des répertoires de plugins en utilisant la fonction load_filter() ou en réglant la variable $autoload_filters. Smarty passera à la fonction le code source en tant que premier argument, et attendra en retour le code modifié. Utilisation un filtre de pré-compilation de template <?php // mettre ceci dans votre application function remove_dw_comments($tpl_source, &$smarty) { return preg_replace("/<!--#.*-->/U","",$tpl_source); } // enregistrer le filtre de pré-compilation $smarty->register_prefilter("remove_dw_comments"); $smarty->display("index.tpl"); ?> {* template Smarty index.tpl *} <!--# cette ligne va être supprimée par le filtre de pré-compilation --> Filtres de post-compilation Les filtres de post-compilation sont des fonctions PHP que vos templates exécutent après avoir été compilés. Les filtres de post-compilation peuvent être soit déclarés soit chargés depuis les répertoires des plugins en utilisant la fonction load_filter() ou en réglant la variable $autoload_filters. Smarty passera le template compilé en tant que premier paramètre et attendra de la fonction qu'elle retourne le résultat de l'exécution. utilisation d'un filtre de post-compilation de templates <?php // mettez cela dans votre application function add_header_comment($tpl_source, &$smarty) { return "<?php echo \"<!-- Created by Smarty! -->\n\" ?>\n".$tpl_source; } // enregistre le filtre de post-compilation $smarty->register_postfilter("add_header_comment"); $smarty->display("index.tpl"); ?> {* template Smarty compilé index.tpl *} <!-- Created by Smarty! --> {* reste du contenu du template... *} Filtres de sortie Quand le template est appelé via les fonctions display() ou fetch(), sa sortie est envoyée à travers un ou plusieurs filtres de sorties. Ils diffèrent des filtres de post-compilation dans le sens ou ils agissent sur la sortie des templates, une fois exécutés, et non sur les sources des templates. Les filtres de sortie peuvent être soit déclarés soit chargés depuis les répertoires des plugins en utilisant la fonction load_filter() ou en réglant la variable $autoload_filters. Smarty passera la sortie du template en premier argument et attendra de la fonction qu'elle retourne le résultat de l'exécution. utilisation d'un filtre de sortie <?php // mettez ceci dans votre application function protect_email($tpl_output, &$smarty) { $tpl_output = preg_replace('!(\S+)@([a-zA-Z0-9\.\-]+\.([a-zA-Z]{2,3}|[0-9]{1,3}))!', '$1%40$2', $tpl_output); return $tpl_output; } // enregistre le filtre de sortie $smarty->register_outputfilter("protect_email"); $smarty->display("index.tpl"); // dorénavant toute occurence d'un adresse email dans le résultat du template // aura un protection simple contre les robots spammers ?> Fonction de gestion du cache Une alternative au mécanisme de cache par défaut (basé sur des fichiers de cache) consiste à spécifier une fonction de gestion de cache utilisateur qui sera utilisée pour lire, écrire et effacer les fichiers de cache. Il suffit de créer dans votre application une fonction que Smarty utilisera pour la gestion du cache et d'assigner le nom de cette fonction à la variable de classe $cache_handler_func. Smarty utilisera alors cette fonction pour gérer les données du cache. Le premier argument est l'action, qui sera 'read', 'write' ou 'clear'. Le second paramètre est l'objet Smarty. Le troisième est le contenu du cache. Pour écrire, Smarty passe le contenu du cache dans ces paramètres. Pour lire, Smarty s'attend à ce que votre fonction accepte ce paramètre par référence et que vous le remplissiez avec les données du cache. Pour effacer, il suffit de passer une variable fictive car cette dernière n'est pas utilisée. Le quatrième paramètre est le nom du fichier de template (utile pour lire/écrire), le cinquième paramètre est l'identifiant de cache (optionnel) et le sixième est l'identifiant de compilation. exemple d'utilisation de MySQL pour la source du cache <?php /* exemple d'usage : include('Smarty.class.php'); include('mysql_cache_handler.php'); $smarty = new Smarty; $smarty->cache_handler_func = 'mysql_cache_handler'; $smarty->display('index.tpl'); la base mysql est attendu dans ce format : create database SMARTY_CACHE; create table CACHE_PAGES( CacheID char(32) PRIMARY KEY, CacheContents MEDIUMTEXT NOT NULL ); */ function mysql_cache_handler($action, &$smarty_obj, &$cache_content, $tpl_file=null, $cache_id=null, $compile_id=null) { // l'hôte de la bd, l'utilisateur, et le mot de passe $db_host = 'localhost'; $db_user = 'myuser'; $db_pass = 'mypass'; $db_name = 'SMARTY_CACHE'; $use_gzip = false; // crée un identifiant de cache unique $CacheID = md5($tpl_file.$cache_id.$compile_id); if(! $link = mysql_pconnect($db_host, $db_user, $db_pass)) { $smarty_obj->_trigger_error_msg("cache_handler: could not connect to database"); return false; } mysql_select_db($db_name); switch ($action) { case 'read': // récupère le cache dans la base de données $results = mysql_query("select CacheContents from CACHE_PAGES where CacheID='$CacheID'"); if(!$results) { $smarty_obj->_trigger_error_msg("cache_handler: query failed."); } $row = mysql_fetch_array($results,MYSQL_ASSOC); if($use_gzip && function_exists("gzuncompress")) { $cache_contents = gzuncompress($row["CacheContents"]); } else { $cache_contents = $row["CacheContents"]; } $return = $results; break; case 'write': // sauvegarde le cache dans la base de données if($use_gzip && function_exists("gzcompress")) { // compresse le contenu pour gagner de la place $contents = gzcompress($cache_content); } else { $contents = $cache_content; } $results = mysql_query("replace into CACHE_PAGES values( '$CacheID', '".addslashes($contents)."') "); if(!$results) { $smarty_obj->_trigger_error_msg("cache_handler: query failed."); } $return = $results; break; case 'clear': // efface les données du cache if(empty($cache_id) && empty($compile_id) && empty($tpl_file)) { // les efface toutes $results = mysql_query("delete from CACHE_PAGES"); } else { $results = mysql_query("delete from CACHE_PAGES where CacheID='$CacheID'"); } if(!$results) { $smarty_obj->_trigger_error_msg("cache_handler: query failed."); } $return = $results; break; default: // erreur, action inconnue $smarty_obj->_trigger_error_msg("cache_handler: unknown action \"$action\""); $return = false; break; } mysql_close($link); return $return; } ?> Ressources Les templates peuvent provenir d'une grande variété de ressources. Quand vous affichez ou récupérez un template, ou quand vous incluez un template dans un autre template, vous fournissez un type de ressource, suivi par le chemin approprié et le nom du template. Templates depuis $template_dir Les templates du répertoire $template_dir n'ont pas besoin d'une ressource template, bien que vous puissiez utiliser la ressource "file" pour être cohérent. Vous n'avez qu'à fournir le chemin vers le template que vous voulez utiliser, relatif au répertoire racine $template_dir. Utilisation de templates depuis $template_dir // le script PHP $smarty->display("index.tpl"); $smarty->display("admin/menu.tpl"); $smarty->display("file:admin/menu.tpl"); // le même que celui ci-dessus {* le template Smarty *} {include file="index.tpl"} {include file="file:index.tpl"} {* le même que celui ci-dessus *} Templates à partir de n'importe quel répertoire Les templates en-dehors du répertoire $template_dir nécessitent le type de ressource template, suivi du chemin absolu et du nom du template. utilisation d'un template depuis n'importe quel répertoire // le script PHP $smarty->display("file:/export/templates/index.tpl"); $smarty->display("file:/path/to/my/templates/menu.tpl"); {* le template Smarty *} {include file="file:/usr/local/share/templates/navigation.tpl"} Chemin de fichiers Windows Si vous utilisez Windows, les chemins de fichiers sont la plupart du temps sur un disque identifié par une lettre (c:) au début du chemin. Assurez-vous de bien mettre "file:" dans le chemin pour éviter des conflits d'espace de nommage et obtenir les résultats escomptés. utilisation de templates avec des chemins de fichiers Windows // le script PHP $smarty->display("file:C:/export/templates/index.tpl"); $smarty->display("file:F:/path/to/my/templates/menu.tpl"); {* le template Smarty *} {include file="file:D:/usr/local/share/templates/navigation.tpl"} Templates depuis d'autres sources Vous pouvez récupérer les templates à partir n'importe quelle source à laquelle vous avez accès avec PHP : base de données, sockets, LDAP et ainsi de suite. Il suffit d'écrire les fonctions de ressource plugins et de les enregistrer auprès de Smarty. Reportez-vous à la section ressource plugins pour plus d'informations sur les fonctions que vous êtes censé fournir. Notez que vous ne pouvez pas écraser la ressource file native, toutefois, vous pouvez fournir une ressource qui récupère un template depuis le système de fichier par un autre moyen en l'enregistrant sous un autre nom de ressource. utilisation de ressources utilisateurs // le script PHP // mettez ces fonctions quelque part dans votre application function db_get_template ($tpl_name, &$tpl_source, &$smarty_obj) { // requête BD pour récupérer le template // et remplir $tpl_source $sql = new SQL; $sql->query("select tpl_source from my_table where tpl_name='$tpl_name'"); if ($sql->num_rows) { $tpl_source = $sql->record['tpl_source']; return true; } else { return false; } } function db_get_timestamp($tpl_name, &$tpl_timestamp, &$smarty_obj) { // requête BD pour remplir $tpl_timestamp $sql = new SQL; $sql->query("select tpl_timestamp from my_table where tpl_name='$tpl_name'"); if ($sql->num_rows) { $tpl_timestamp = $sql->record['tpl_timestamp']; return true; } else { return false; } } function db_get_secure($tpl_name, &$smarty_obj) { // on suppose que tous les templates sont sûrs return true; } function db_get_trusted($tpl_name, &$smarty_obj) { // pas utilisée pour les templates dans notre cas } // enregistre le nom de ressource "db" $smarty->register_resource("db", array("db_get_template", "db_get_timestamp", "db_get_secure", "db_get_trusted")); // utilise la ressource depuis le script PHP $smarty->display("db:index.tpl"); {* utilise la ressource depuis le template Smarty *} {include file="db:/extras/navigation.tpl"} Fonction de gestion de template par défaut Vous pouvez spécifier une fonction qui sera utilisée pour récupérer le contenu d'un template dans le cas où le template ne peut pas être récupéré depuis sa ressource. Une utilisation possible est la création de templates à la volée. utilisation de la fonction de gestion de template par défaut <?php // mettez cette fonction quelque part dans votre application function make_template ($resource_type, $resource_name, &$template_source, &$template_timestamp, &$smarty_obj) { if( $resource_type == 'file' ) { if ( ! is_readable ( $resource_name )) { // crée le fichier de template et renvoie le contenu $template_source = "This is a new template."; $template_timestamp = time(); $smarty_obj->_write_file($resource_name,$template_source); return true; } } else { // pas un fichier return false; } } // régle la fonction par défaut $smarty->default_template_handler_func = 'make_template'; ?> Etendre Smarty avec des plugins La version 2.0 a introduit l'architecture de plugin qui est utilisée pour pratiquement toute les fonctionnalités personnalisables de Smarty. Ceci comprend : les fonctions les modificateurs les fonctions de blocs les fonctions de compilation les filtres de pré-compilation les filtres de post-compilation les filtres de sorties les ressources les insertions A part pour les ressources, la compatibilité avec les anciennes façons d'enregistrer les fonctions de gestion avec l'API register_ est conservée. Si vous n'avez pas utilisé cette API et que vous avez à la place directement modifié les variables de classes $custom_funcs, $custom_mods et d'autres, vous devez alors modifier vos scripts pour utiliser l'API ou convertir vos fonctionnalités personnalisées en plugins. Comment fonctionnent les plugins Les plugins sont toujours chargés à la demande. Seuls les modificateurs de variables, les ressources, etc invoqués dans les scripts de templates seront chargés. De plus, chaque plugin n'est chargé qu'une fois, et ce même si vous avez plusieurs instances de Smarty qui tournent dans la même requête. Les filtres de post/pré-compilation et les filtres de sortie sont des cas un peu spéciaux. Comme ils ne sont pas mentionnés dans les templates, ils doivent être déclarés ou chargés explicitement via les fonctions de l'API avant que le template ne soit exécuté. L'ordre dans lequel les filtres multiples d'un même type sont exécutés dépend de l'ordre dans lequel ils sont enregistrés ou chargés. Il n'existe qu'un seul répertoire de plugin (pour des raisons de performances). Pour installer un plugin, copiez-le simplement dans le répertoire et Smarty l'utilisera automatiquement. Conventions de nommage Les fichiers et les fonctions de plugins doivent suivre une convention de nommage très spécifique pour être localisés par Smarty. Les fichiers de plugins doivent être nommés de la façon suivante :
type.nom.php
type est l'une des valeurs suivantes : function modifier block compiler prefilter postfilter outputfilter resource insert Et nom doit être un identifiant valide (lettres, nombres et underscore seulement). Quelques exemples : function.html_select_date.php, resource.db.php, modifier.spacify.php. Les fonctions de plugins dans les fichiers de plugins doivent être nommées de la façon suivante :
smarty_type_nom
Les significations de type et de nom sont les mêmes que précédemment. Smarty donnera des messages d'erreur approprié si le fichier de plugin n'est pas trouvé, ou si le fichier ou la fonction de plugin ne sont pas nommés correctement.
Ecrire des plugins Les plugins peuvent être soit chargés automatiquement par Smarty depuis le système de fichier, soit être déclarés pendant l'exécution via une fonction register_* de l'API. Ils peuvent aussi être désalloués en utilisant une fonction unregister_* de l'API. Pour les plugins qui ne sont pas enregistrés pendant l'exécution, le nom des fonctions n'ont pas à suivre la convention de nommage. Si certaines fonctionnalités d'un plugin dépendent d'un autre plugin (comme c'est le cas de certains plugins accompagnant Smarty), alors la manière appropriée de charger le plugin est la suivante : require_once SMARTY_DIR . 'plugins/function.html_options.php'; Une règle générale est que chaque objet Smarty est toujours passé au plugin en tant que dernier paramètre (à part pour les modificateurs). Les fonctions de templates void smarty_function_name array $params object &$smarty Tous les attributs passés aux fonctions de template à partir du template sont contenus dans le tableau associatif $params. Vous pouvez accéder à ces valeurs soit directement, par exemple $params['start'], soit en utilisant extract($params) pour les importer dans la table des symboles. Le retour de la fonction sera substituée à la balise de fonction du template (fonction fetch par exemple). Sinon, la fonction peut simplement accomplir une autre tâche sans sortie (la fonction assign par exemple) Si la fonction a besoin d'assigner des variables aux templates ou d'utiliser d'autres fonctionnalités fournies par Smarty, elle peut recevoir un objet $smarty pour cela. Référez-vous aussi à : register_function(), unregister_function(). fonction de plugin avec sortie <?php /* * Smarty plugin * ------------------------------------------------------------- * Fichier : function.eightball.php * Type : fonction * Nom : eightball * Rôle : renvoie une phrase magique au hasard * ------------------------------------------------------------- */ function smarty_function_eightball($params, &$smarty) { $answers = array('Yes', 'No', 'No way', 'Outlook not so good', 'Ask again soon', 'Maybe in your reality'); $result = array_rand($answers); return $answers[$result]; } ?> peut être utilisée dans le template de la façon suivante : Question: Will we ever have time travel? Answer: {eightball}. fonction de plugin sans sortie <?php /* * Smarty plugin * ------------------------------------------------------------- * Fichier : function.assign.php * Type : fonction * Nom : assign * Purpose : assigne une valeur à une variable de template * ------------------------------------------------------------- */ function smarty_function_assign($params, &$smarty) { extract($params); if (empty($var)) { $smarty->trigger_error("assign: missing 'var' parameter"); return; } if (!in_array('value', array_keys($params))) { $smarty->trigger_error("assign: missing 'value' parameter"); return; } $smarty->assign($var, $value); } ?> Modificateurs Les modificateurs sont des petites fonctions appliquées à une variable de template avant qu'elle ne soit affichée ou utilisée dans un autre contexte. Les modificateurs peuvent être chaînés entre eux. mixed smarty_modifier_name mixed $value [mixed $param1, ...] Le premier paramètre passé au modificateur est la valeur sur laquelle le modificateur est supposé opérer. Les autres paramètres peuvent être optionnels, dépendant de quel genre d'opération doit être effectué. Le modificateur doit retourner le résultat de son exécution. Regardez aussi register_modifier(), unregister_modifier(). plugin modificateur simple Ce plugin est un alias d'une fonction PHP. Il n'a aucun paramètre supplémentaires. <?php /* * Smarty plugin * ------------------------------------------------------------- * Fichier : modifier.capitalize.php * Type : modificateur * Name : capitalize * Rôle : met une majuscule aux mots d'une phrase * ------------------------------------------------------------- */ function smarty_modifier_capitalize($string) { return ucwords($string); } ?> un plugin modificateur un peu plus complexe <?php /* * Smarty plugin * ------------------------------------------------------------- * Fichier : modifier.truncate.php * Type : modificateur * Name : truncate * Rôle : Tronque une chaîne à une certaine longueur si * nécessaire, la coupe optionnellement au milieu * d'un mot et ajoute la chaîne $etc * ------------------------------------------------------------- */ function smarty_modifier_truncate($string, $length = 80, $etc = '...', $break_words = false) { if ($length == 0) return ''; if (strlen($string) > $length) { $length -= strlen($etc); $fragment = substr($string, 0, $length+1); if ($break_words) $fragment = substr($fragment, 0, -1); else $fragment = preg_replace('/\s+(\S+)?$/', '', $fragment); return $fragment.$etc; } else return $string; } ?> Fonctions de blocs void smarty_block_name array $params mixed $content object &$smarty Les fonctions de blocs sont des fonctions de la forme {func} .. {/func}. En d'autres mots, elles englobent des blocs de template et opèrent sur les contenus de ces blocs. Les fonctions de blocs ont la priorité sur les fonctions utilisateurs de même nom, ce qui signifie que vous ne pouvez avoir une fonction utilisateur {func} et une fonction de bloc {func} .. {/func}. L'implémentation de votre fonction est appelée deux fois par Smarty : une fois pour la balise ouvrante et une autre fois pour la balise fermante. Seule la balise ouvrante d'une fonction de bloc peut avoir des attributs. Tous les attributs passés par le template aux fonctions de templates sont contenues dans le tableau associatif $params. Vous pouvez accéder à ces valeurs soit directement, par exemple $params['start'], soit en utilisant extract($params) pour les importer dans la table des symboles. Votre fonction a aussi accès aux attributs de la balise ouvrante quand c'est la balise fermante qui est exécutée. La valeur de la variable $content est différente selon si votre fonction est appelée pour la balise ouvrante ou la balise fermante. Si c'est pour la balise ouvrante, elle sera à null et si c'est la balise fermante elle sera égale au contenu du bloc de template. Notez que le bloc de template aura déjà été exécuté par Smarty, vous recevrez donc la sortie du template et non sa source. Si vous imbriqué des fonctions de bloc, il est possible de connaître la fonction de bloc parente grâce à la variable $smarty->_tag_stack. Faites un var_dump() dessus et la structure devrait apparaître. Regardez aussi : register_block(), unregister_block(). fonction de bloc <?php /* * Smarty plugin * ------------------------------------------------------------- * Fichier : block.translate.php * Type : bloc * Nom : translate * Rôle : traduire un bloc de texte * ------------------------------------------------------------- */ function smarty_block_translate($params, $content, &$smarty) { if ($content) { $lang = $params['lang']; // fait une traduction de $content echo $translation; } } Fonctions de compilation Les fonctions de compilation sont appelées durant la compilation du template. Elles sont utiles pour injecter du code PHP ou du contenu "statique variant avec le temps" (bandeau de pub par ex.). Si une fonction de compilation et une fonction personnalisée ont le même nom, la fonction de compilation a priorité. mixed smarty_compiler_name string $tag_arg object &$smarty Les fonctions de compilation ont deux paramètres : une chaîne contenant la balise - en gros, tout, depuis le nom de la fonction jusqu'au délimiteur de fin - et l'objet Smarty. Elles sont censées retourner le code PHP qui doit être injecté dans le template compilé. Regardez aussi register_compiler_function(), unregister_compiler_function(). fonction de compilation simple <?php /* * Smarty plugin * ------------------------------------------------------------- * Fichier : compiler.tplheader.php * Type : compilation * Nom : tplheader * Rôle : Renvoie l'en-tête contenant le nom du fichier * source et le temps de compilation. * ------------------------------------------------------------- */ function smarty_compiler_tplheader($tag_arg, &$smarty) { return "\necho '" . $smarty->_current_file . " compiled at " . date('Y-m-d H:M'). "';"; } ?> Cette fonction peut-être appelé depuis le template comme suivant : {* cette fonction n'est executée que lors de la compilation *} {tplheader} Le code PHP résultant dans les templates compilés ressemblerait à ça : <php echo 'index.tpl compiled at 2002-02-20 20:02'; ?> filtres de pré-compilation/filtres de post-compilation Les filtres de pré-compilation et les filtres de post-compilation ont des concepts très proches. Ils différent dans leur exécution, plus précisément dans le moment où ils sont exécutés. string smarty_prefilter_name string $source object &$smarty Les filtres de pré-compilation sont utilisés pour transformer la source d'un template juste avant la compilation. Le premier paramètre passé à la fonction de filtre de pré-compilation est la source du template, éventuellement modifiée par d'autres filtre de pré-compilations. Le plugin est supposé retourner la source modifiée. Notez que cette source n'est sauvegardée nulle part, elle est seulement utilisé pour la compilation. string smarty_postfilter_name string $compiled object &$smarty Les filtres de post-compilation sont utilisés pour modifier la sortie du template (le code PHP) juste après que la compilation a été faite mais juste avant que le template ne soit sauvegardé sur le système de fichiers. Le premier paramètre passé à la fonction de filtre de post-compilation est le code du template compilé, éventuellement déjà modifié par d'autres filtre de post-compilations. Le plugin est censé retourner la version modifié du code. plugin de filtre de post-compilation <?php /* * Smarty plugin * ------------------------------------------------------------- * Fichier : prefilter.pre01.php * Type : filtre de pré-compilation * Nom : pre01 * Rôle : Passe les balises HTML en minuscules. * ------------------------------------------------------------- */ function smarty_prefilter_pre01($source, &$smarty) { return preg_replace('!<(\w+)[^>]+>!e', 'strtolower("$1")', $source); } ?> plugin de filtre de post-compilation <?php /* * Smarty plugin * ------------------------------------------------------------- * Fichier : postfilter.post01.php * Type: filtre de post-compilation * Nom : post01 * Rôle : Renvoie du code qui liste toutes les variables * du template. * ------------------------------------------------------------- */ function smarty_postfilter_post01($compiled, &$smarty) { $compiled = "<pre>\n<?php print_r(\$this->get_template_vars()); ?>\n</pre>" . $compiled; return $compiled; } ?> Filtres de sortie Les plugins de filtres de sortie opèrent sur la sortie du template, après que le template a été chargé et exécuté, mais avant que la sortie ne soit affichée. string smarty_outputfilter_name string $template_output object &$smarty Le premier paramètre passé à la fonction du filtre de sortie est la sortie du template qui doit être modifiée et le second paramètre est l'instance de Smarty appelant le plugin. Le plugin est supposé faire un traitement et en retourner le résultat. plugin de filtre de sortie /* * Smarty plugin * ------------------------------------------------------------- * Fichier : outputfilter.protect_email.php * Type : filtre de sortie * Nom : protect_email * Rôle: Convertie les @ en %40 pour protéger des * robots spammers. * ------------------------------------------------------------- */ function smarty_outputfilter_protect_email($output, &$smarty) { return preg_replace('!(\S+)@([a-zA-Z0-9\.\-]+\.([a-zA-Z]{2,3}|[0-9]{1,3}))!', '$1%40$2', $output); } Ressources Les plugins ressources sont un moyen générique de fournir des sources de templates ou des composants de scripts PHP à Smarty. Quelques exemples de ressources : bases de données, LDAP, mémoire partagée, sockets, et ainsi de suite. Il y au total 4 fonctions qui ont besoin d'être enregistrées pour chaque type de ressource. Chaque fonction reçoit le nom de la ressource demandée comme premier paramètre et l'objet Smarty comme dernier paramètre. Les autres paramètres dépendent de la fonction. bool smarty_resource_name_source string $rsrc_name string &$source object &$smarty bool smarty_resource_name_timestamp string $rsrc_name int &$timestamp object &$smarty bool smarty_resource_name_secure string $rsrc_name object &$smarty bool smarty_resource_name_trusted string $rsrc_name object &$smarty La première fonction est supposée récupérer la ressource. Son second paramètre est une variable passée par référence où le résultat doit être stocké. La fonction est supposée retourner true si elle réussi à récupérer la ressource et false sinon. La seconde fonction est supposée récupérer la date de dernière modification de la ressource demandée (comme un timestamp UNIX). Le second paramètre est une variable passée par référence dans laquelle la date doit être stockée. La fonction est supposée renvoyer true si elle a réussi à récupérer la date et false sinon. La troisième fonction est supposée retourner true ou false selon si la ressource demandée est sûre ou non. La fonction est utilisée seulement pour les ressources templates mais doit tout de même être définie. La quatrième fonction est supposée retourner true ou false selon si on peut faire confiance ou non à la ressource demandée. Cette fonction est utilisée seulement pour les composants de scripts PHP demandés par les balises include_php ou insert ayant un attribut src. Quoiqu'il en soit, elle doit être définie pour les ressources templates. Regardez aussi register_resource(), unregister_resource(). resource plugin <?php /* * Smarty plugin * ------------------------------------------------------------- * Fichier : resource.db.php * Type : ressource * Nom : db * Rôle : Récupère des templates depuis une base de données * ------------------------------------------------------------- */ function smarty_resource_db_source($tpl_name, &$tpl_source, &$smarty) { // fait des requêtes BD pour récupérer votre template // et remplir $tpl_source $sql = new SQL; $sql->query("select tpl_source from my_table where tpl_name='$tpl_name'"); if ($sql->num_rows) { $tpl_source = $sql->record['tpl_source']; return true; } else { return false; } } function smarty_resource_db_timestamp($tpl_name, &$tpl_timestamp, &$smarty) { // fait des requêtes BD pour remplir $tpl_timestamp $sql = new SQL; $sql->query("select tpl_timestamp from my_table where tpl_name='$tpl_name'"); if ($sql->num_rows) { $tpl_timestamp = $sql->record['tpl_timestamp']; return true; } else { return false; } } function smarty_resource_db_secure($tpl_name, &$smarty) { // suppose que tous les templates sont sûrs return true; } function smarty_resource_db_trusted($tpl_name, &$smarty) { // inutilisée pour les templates } ?> Insertions Les plugins d'insertion sont utilisés pour implémenter les fonctions qui sont appelées par les balises insert dans les templates. string smarty_insert_name array $params object &$smarty Le premier paramètre passé à la fonction est une tableau associatif d'attributs. Vous pouvez accéder à ces valeurs soit directement, par exemple $params['start'], soit en utilisant extract($params) pour les importer dans la table des symboles. La fonction d'insertion est supposée retourner le résultat qui sera substitué à la balise insert dans le template. plugin d'insertion <?php /* * Smarty plugin * ------------------------------------------------------------- * Fichier : insert.time.php * Type : temps * Nom : time * Rôle : Insert la date/heure courante conformément * au format * ------------------------------------------------------------- */ function smarty_insert_time($params, &$smarty) { if (empty($params['format'])) { $smarty->trigger_error("insert time: missing 'format' parameter"); return; } $datetime = strftime($params['format']); return $datetime; } ?>