Tutoriel : Création de modificateurs personnalisés avec Smarty

Dans ce tutoriel, nous allons voir, au même titre que les fonctions personnalisées, comment mettre en place un modificateur de variable avec le moteur de Template Smarty. Tant qu’à faire, nous allons garder le même plan que l’article précédent sur les fonctions personnalisées, puisque c’est sensiblement la même utilisation !

Qu’est-ce que c’est ?

Modificateur de variable personnalisé ?

Eh bien, ce ne sont finalement que des fonctions personnalisées, mais appliquées directement aux variables.

… Tu veux nous faire une copie de l’autre article ?

Mais non, y’a quand même quelques petites différences ! Regardez à quoi ça ressemble:

{$myVar|default='Vide!'}
{* Ou bien : *}
{$myVar2|nl2br}
{* Et même : *}
{$myVar3|escape|capitalize}

Vous situez mieux ? Si non, je vous invite à aller relire la documentation, où sont d’ailleurs listés tous les modificateurs : http://smarty.net/manual/en/language.modifiers.php :p

Dans tous les cas, vous voyez peut-être mieux l’intérêt de créer ses propres modificateurs. Non ? Et bien par exemple pour appliquer des fonctions PHP de traitement de chaine directement dans Smarty !

Allez, on va mettre tout ça en application, ca sera plus parlant !

Application

C’est le même principe que pour les fonctions personnalisées ! On va créer une fonction PHP, qu’on va faire utiliser par l’instance de Smarty.

/**
 * Mélange aléatoirement les caractères d'un chaine
 * @param string $string La chaine à mélanger
 * @param boolean $ucfirst Si on doit mettre le premier caractère en majuscule ou pas
 * @return string La chaine une fois les changements appliqués
 */
function smarty_modifier_shuffle ($string, $ucfirst=false)
{
  // On replace les caractères de la chaine aléatoirement
  $string = str_shuffle($string);
 
  // On met la première lettre en majuscule ou pas.
  if ($ucfirst)
  {
    $string = ucfirst($string);
  }
  return $string;
}
$smarty->register_modifier('shuffle', 'smarty_modifier_shuffle');

Et dans le Template :

{* Deux moyens d'utilisation ici. Soit : *}
{$myVar|shuffle:true}
{* Soit (utilisation de la valeur par défaut): *}
{$myVar|shuffle}

On remarque tout de suite que les arguments de la fonction PHP ne sont pas les mêmes que sur une fonction personnalisée : ici on liste tous les paramètres, avec en premier la variable affectée par le modificateur ! Les plus perspicaces d’entre vous ( :p ) remarqueront aussi que le deuxième paramètre de la fonction PHP (le seul de la fonction Smarty donc) est plutôt inutile. Je l’ai rajouté afin de vous montrer un fonctionnement concret avec un paramètre.

Un changement important aussi par rapport aux fonctions personnalisées, c’est que la fonction n’affiche pas sur la sortie standard, mais retourne quelque chose !

L’utilisation n’est pas bien compliquée. Il est bon de savoir que vous pouvez rajouter autant de paramètres que vous le voulez tant que vous adaptez le prototype de la fonction PHP. Ils s’ajouteront de cette manière:

{$myVar|shuffle:'1er param':'2ème param':'3ème...'}

Une utilisation correcte

Tout comme les fonctions personnalisées, les modificateurs ne doivent pas être employés à tort et à travers. Vous devez toujours avoir en tête que ces modificateurs ne sont là que pour formater l’affichage, et ont très rarement un autre usage.

De plus veillez à ne pas réinventer la roue, comme créer un modificateur « mail » alors que Smarty possède déjà une fonction {mailto} très complète.

Il est aussi bon à savoir que n’importe quelle fonction PHP (même les vôtres !) peut-être utilisée en tant que modificateur de variable, sans manipulation.

Donc ta fonction « shuffle » ne sert à rien ?

Parfaitement ! :pouce: J’étais en manque d’inspiration. On aurait très bien pu écrire:

{$myVar|str_shuffle|ucfirst}

Enfin, elle était déjà inutile avant de découvrir qu’on avait pas besoin de réécrire une fonction, puisque le résultat attendu lui même ne sert à rien ! (qui à envie de mélanger un mot et de mettre sa première lettre en majuscule, franchement ?) :D

À noter que {$myVar|ucfirst|str_shuffle} ne produira pas le même résultat que notre fonction. En effet, les modificateurs sont appliqués de gauche à droite !

Si ça marche avec nos fonctions, à quoi sert « register_modifier » ?

Cette méthode de Smarty a tout de même une utilité. (Si si !) Elle permet tout d’abord de ne pas donner forcement le même nom à la fonction PHP et au modificateur, ce qui est déjà pas mal pratique.

De plus, elle permet d’écraser les modificateurs déjà existants. Ce qui comprend aussi les fonctions PHP ! (La méthode n’écrase pas la fonction PHP bien sur, mais le modificateur lié à la fonction du même nom)

Voila, je pense avoir fait le tour du sujet. Bien évidemment, si vous avez des questions, des remarques, n’hésitez pas à poster un commentaire ! ;)

Tagués avec : , , , , , , ,
Publié dans Smarty
3 commentaires pour “Tutoriel : Création de modificateurs personnalisés avec Smarty
  1. Ariden dit :

    Avec ZF1.9 et smarty,

    Je n’arrive juste pas à faire appel à des fonctions, même simples dans la vue {$this->headStyle()},
    par contre, j’arrive bien à afficher la valeur de mes variables telles que {$book|upper} ou à en créer de nouvelles directement dans ma vue.

    si qql voit pourquoi ?

  2. Bonjour Ariden !

    Je ne suis pas un grand connaisseur du ZF, mais je vais essayer de t’aider.
    Quel message d’erreur cela t’affiche-t-il ?
    Sinon, tu utilises la pseudo-variable $this. Si tu n’es pas à l’intérieur d’un objet, $this est une variable comme n’importe laquelle, qu’il te faudra instancier. Peut-être devrais-tu regarder de ce côté là ?

    Tiens nous au courant !

    A +.

    Antonin.

  3. Ariden dit :

    Bonjour Antonin,

    Avec Zend framework, je n’ai aucun problème pour appeler des fonctions au sein de mes views,

    mais en associant zend avec smarty, je n’arrive pas à appeler ces mêmes fonctions dans mes views.

    J’ai essayé :

    $this->headStyle();
    {$this->headStyle()}
    {$this->headStyle}
    {$headStyle()}

    mais rien…

    Mais je n’ai aucune erreur à l’écran qui s’affichent.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*