Dans cette partie, ne vous attendez pas à pouvoir modifier le code source de Smarty ou à le récrire entièrement à votre guise. Cette partie est là pour vous apprendre à personnaliser un peu plus Smarty pour vous permettre d'économiser votre temps.
Dans cette partie, je vous propose d'entrer un peu plus dans le monde merveilleux de Smarty. Nous allons voir comment réaliser des fonctions utilisateur (vous savez, celles qui sont entourées par des accolades dans le fichier de template) — qui, à la différence des fonctions natives vues plus haut, sont écrites par des utilisateurs comme vous et moi —, ou encore des modificateurs de variable.
Créer sa fonction utilisateur
Tout d'abord, je vous invite à regarder l'arborescence de votre projet. Dirigez-vous dans le dossier
tpl puis dans le dossier
plugins où se trouve la majorité des modificateurs de variable et des fonctions natives de Smarty. Si vous avez la curiosité d'observer comment elles sont écrites, vous remarquerez qu'elles ont le même modèle.
Code : PHP - function.nomdelafonction.php | <?php
function smarty_function_nomdelafonction($params, &$smarty)
{
if (empty($params['nomdunparametre'])) {
$smarty->_trigger_fatal_error("[plugin] le paramètre 'nomdunparametre' est vide");
return;
}
/***/
}
?>
|
La création d'une telle fonction utilisateur est très facile ; on procède de la même manière que pour une fonction native, la seule différence étant qu'il est interdit de donner comme nom à la fonction utilisateur le nom d'une fonction native. Je vais donc prendre comme exemple quelque chose de très simple, qui se base sur le QCM, à l'image de l'exemple qu'en donne M@teo21 dans son tutoriel à propos des conditions.
Vous devez faire très attention à l'orthographe des noms du fichier (« function. » suivi du nom de la fonction puis de « .php ») et de la fonction (« smarty_function_ » suivi du nom de la fonction).
De notre côté, la fonction utilisateur s'appellera
note_qcm. Créez alors un fichier nommé
function.note_qcm.php dans lequel vous écrirez ceci :
Code : PHP - function.note_qcm.php | <?php
function smarty_function_note_qcm($params, &$smarty)
{
}
?>
|
Puisque notre fonction va contenir un paramètre, la note, il faut définir le paramètre qui passe par la variable
$params ; si vous n'avez pas besoin de paramètre, cela ne sert à rien de le mettre. Il ne faut pas oublier aussi de vérifier si le paramètre n'est pas vide. Ce qui donne :
Code : PHP - function.note_qcm.php | <?php
function smarty_function_note_qcm($params, &$smarty)
{
if (empty($params['note'])) {
$smarty->_trigger_fatal_error("[plugin] le paramètre 'note' est vide");
return;
}
}
?>
|
Nous allons nous baser sur ce code pour réaliser la fonction utilisateur.
Attention. — Il ne faut surtout pas faire de echo dans la fonction utilisateur, un return suffit largement.
Ce qui donne pour notre fonction utilisateur le code suivant :
Code : PHP - function.note_qcm.php 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 | <?php
function smarty_function_note_qcm($params, &$smarty){
if (empty($params['note'])) {
$smarty->_trigger_fatal_error("[plugin] le paramètre 'note' est vide");
return;
}
switch ($params['note']) // On indique sur quelle variable on travaille
{
case 0: // Dans le cas où $note vaut 0
return "Tu es vraiment un gros Zéro !";
break;
case 5: // Dans le cas où $note vaut 5
return "Tu es très mauvais.";
break;
case 7: // Dans le cas où $note vaut 7
return "Tu es mauvais.";
break;
case 10: // Etc.
return "Tu as pile poil la moyenne, c'est un peu juste...";
break;
case 12:
return "Tu es assez bon.";
break;
case 16:
return "Tu te débrouilles très bien !";
break;
case 20:
return "Excellent travail, c'est parfait !";
break;
default:
return "Désolé, je n'ai pas de message à afficher pour cette note.";
}
}
?>
|
Maintenant, pour utiliser cette fonction utilisateur, il suffit d'écrire ceci dans notre fichier :
Code : Smarty
D'après les statistiques du QCM, vous êtes nombreux à vous tromper dans l'écriture de la fonction utilisateur dans le fichier de template ! Faites donc attention à ne mettre que le nom de la fonction et rien d'autre !
Créer son propre modificateur de variable
Rien de bien compliqué, j'ose dire que c'est encore plus facile qu'une fonction utilisateur.

Tout d'abord, il faut savoir qu'il n'y a qu'un seul paramètre et que celui-ci est la chaîne de caractères contenue dans la variable que vous voulez modifier.
Vous connaissez sûrement la fonction
htmlspecialchars qui permet de transcrire des caractères spéciaux en écriture HTML et d'éviter ainsi des problèmes de sécurité.
Comme pour la fonction utilisateur, il faut utiliser un nom spécial pour les modificateurs de variable : « smarty_modifier_ » suivi du nom du modificateur. Et pour le fichier qui le contient : « modifier. » puis le nom du modificateur.
Code : PHP - modifier.htmlspecialchars.php | <?php
function smarty_modifier_htmlspecialchars($string) {
}
?>
|
Il suffit ensuite de retourner le contenu « htmlspecialcharsé » vers le fichier de template :
Code : PHP - modifier.htmlspecialchars.php | <?php
function smarty_modifier_htmlspecialchars($string) {
return htmlspecialchars($string);
}
?>
|
Voilà ! Bien sûr, il existe des modificateurs beaucoup plus compliqués qui vous simplifieront grandement la vie.
{foreach}
N'avez vous jamais voulu faire une liste de membre sans omettre les virgules et le « et » du dernier argument. Grâce à Smarty il est possible de configurer tout cela avec facilité.
Tout d'abord il faut donner un nom à notre
{foreach} grâce à l'attribut
name. Pour notre listage de membre cela va donc donner ceci:
{foreach from=$liste_membre item=$pseudo name=liste_membre}.
Puis entre en jeu deux nouveaux arguments :
- .first qui renvoie true si la valeur est la première de l'array.
- .last qui a l'opposé de .first renvoie true si la valeur est la dernière de l'array.
Pour notre cas, grâce à ces deux arguments donnent :
Code : Smarty - liste_membre.html | {foreach from=$liste_membre item=$pseudo name=liste_membre}
{if !$smarty.foreach.liste_membre.first}{* Si le pseudo n'est pas le premier *}
{if !$smarty.foreach.reader.last}{* Si le pseudo n'est pas le dernier on met une virgule*}
,
{else}{* Si le pseudo est le dernier on met un « et »*}
et
{/if}
{/if}
{$pseudo}{* On finit par afficher le pseudo*}
{/foreach}
|
Cette méthode vous permet d'avoir un affichage de vos liste plus recherché.
L'héritage des templates
Recopier sa structure (x)HTML sur chaque page, vous connaissez ? Grâce à la nouvelle version de Smarty il est possible de réaliser un héritage de template. Ce qu'il vous faut, une page dite mère — qui elle contient la structure des pages de votre site (titre, menu ...) — et une page dite fille — qui contient le contenu de la page (news, texte ...).
Tout d'abord votre page
trame.html va contenir une structure tout simple (x)HTML avec un menu, un titre de page et une place pour le contenu.
Code : HTML - trame.html | <html>
<head>
<title>Titre par defaut</title>
</head>
<body>
<!-- Place pour le contenu exemple:«Cette page ne contient rien» -->
</body>
</html>
|
On va y mettre un fonction native de faire de placer le contenu de la page
index.html dans notre fichier actuel. On utilise pour ceci la fonction
{block name=titre} (fonction qui bien sûr se ferme à l'aide de
{/block}). Il suffit juste de mettre le nom du block concerné et de mettre entre l'ouverture et la fermeture de cette fonction native le contenu par defaut.
Code : Smarty - trame.html | <html>
<head>
<title>{block name=titre}Titre par defaut{/block}</title>
</head>
<body>
{block name=contenu}Cette page ne contient rien{/block}
</body>
</html>
|
Ainsi vous pouvez ajouter dans le fichier que sur lequel vous travaillez (nous ici
index.html) les balises
{block} avec le contenu que vous souhaitez afficher. Pour permettre l'import du fichier trame il suffit d'utiliser la fonction
extends et de mettre pour le paramètre
file le chemin qui mène au fichier de trame ce qui donne ici :
{extends file="trame.html"}.
Code : Smarty - index.html | {extends file="trame.html"}
{block name=titre}Le titre de ma page{/block}
{block name=contenu}"Contenu" est un mot.{/block}
|
Astuce ─ Quand vous commencez à avoir trop de variable, je vous conseille d'utiliser la fonction native {debug} qui permet l'ouverture d'une pop-up regroupant toutes les variables et leur contenu.