Tutoriel : Création de fonctions personnalisées avec Smarty

Dans ce tutoriel, nous allons voir comment mettre en place une fonction personnalisée avec le moteur de Template Smarty !

Qu’est-ce que c’est ?

Fonction personnalisée ?

Oui, les mêmes que vous utilisez de base dans vos Templates. Si si, je suis sur que vous voyez, ça ressemble à ça :

{include file="inc/ma_template.tpl"}
{* Ou: *}
{config_load file='global.conf' section='accueil'}
{* Ou bien encore: *}
{cycle values="bleu,rouge"}
{* Et même des trucs dans le genre: *}
{assign var='name' value='Bob'}

C’est déjà plus parlant ? ;)

Smarty intègre déjà quelques fonctions, et la plupart du temps, ce que vous voudrez existe déjà. La liste des fonctions est là : http://www.smarty.net/manual/en/language.builtin.functions.php et là http://www.smarty.net/manual/en/language.custom.functions.php

Le premier lien liste les fonctions natives, alors que le second lien liste les fonctions utilisateur. La principale différence est que, contrairement aux fonctions utilisateur, les fonctions natives ne peuvent être réécrites par la méthode détaillée ici.

Néanmoins, il peut-être utile de créer ses propres fonctions, que ce soit pour factoriser votre code, ou pour avoir une interaction plus importante avec PHP. Vous pourrez ainsi effectuer des traitements trop complexes pour le langage Smarty seul.

Application

Comment ça marche alors ?

J’y viens. Le principe est de créer une fonction PHP, qui va effectuer le traitement et afficher le résultat voulu sur la sortie standard. Il suffit alors de dire à son instance de Smarty d’utiliser la fonction.

C’est simple dans la théorie ? Dans la pratique aussi ! Un petit exemple :

/**
 * Affiche une face tirée aléatoirement d'un dé choisi.
 * @param $params array Tableau contenant les paramètres de la fonction Smarty
*/
function smarty_function_de ($params)
{
  // On extrait les paramètres (voir l'explication plus bas)
  extract($params);
 
  // Quelques vérifications basiques
  if (empty($type) || !preg_match('#^[0-9]+$#', $type))
  {
    $type = 6;
  }
 
  // On « tire » le dé
  $resultat = rand(1, $type);
 
  // On affiche (tout simplement !)
  echo $resultat;
}
 
// À supposer que votre instance de Smarty est $smarty …
//  On dit à smarty d'utiliser cette fonction
$smarty->register_function('de', 'smarty_function_de');

Et dans le Template :

{* Utilisation TRÈS complexe, Attention! :p *}
{de type=20}
{* Ou bien (utilisation de la valeur par défaut) : *}
{de}

C’était pas la mer à boire ! Cependant, même si ce traitement était très simple, certains voudront peut-être quelques explications :

C’est quoi cet « extract » ? Il n’y a qu’un seul paramètre ?

Parfaitement ! Lorsque Smarty appelle une fonction, il ne lui passe comme argument qu’un tableau de toutes les variables définies dans cette fonction. Pas très clair ? Reprenons notre exemple :

{de type=6}

Donne un tableau comme ça :

array('type' =>6);

Extract permet donc d’importer des variables depuis un tableau associatif. J’en ai déjà trop dit sur une fonction qui est très bien expliquée dans le manuel: http://fr2.php.net/manual/en/function.extract.php

Vous l’aurez donc compris, le nombre de paramètres n’est pas limité, néanmoins il faut utiliser une méthode spéciale pour accéder à ces derniers.

Doit-on débuter le nom de la fonction par « smarty_function_ » ?

Pas forcément. Ici,  c’est juste par souci d’organisation. Je ferais une partie plus tard sur une façon ou deux de gérer toutes ces fonctions, selon vos besoins.

Plus important : t’as oublié ta recherche ? Tu te fous de nous !?

Une utilisation correcte

Ça fait plaisir de voir que quelqu’un suit ! :pouce:

Vous l’aurez remarqué, la fonction PHP, au lieu d’être utilisée dans une fonction de Template, aurait pu retourner le résultat qui aurait été assigné de façon plus classique, comme ceci (On suppose ici que la fonction PHP a été modifiée pour s’adapter à mon exemple) :

$resultat =  smarty_func_de(20);
$smarty->assign('resultat_de', $resultat);

Tu nous aurais menti ?!

Mais non ! :mechant: C’est juste que ce genre de fonction ne peut-être utilisée que dans un contexte précis. Dans mon cas, les Templates sont stockés dans la Base de Données (j’expliquerais comment faire cela plus tard). On se sait donc pas à l’avance si l’on va devoir utiliser un calcul de jet de dé ou même plusieurs(pour utiliser notre exemple), d’où l’impossibilité de l’assigner avant avec la méthode ci-dessus. Dans un cas comme cela, une fonction de ce genre est utile. Attention: cela ne veut pas dire que l’on ne peut utiliser les fonctions personnalisées que dans ce cas ! Je vous ferais parvenir une liste de quelques fonctions utiles dans tout les cas !

Voila la fin de cette partie sur les fonctions personnalisées avec Smarty ! J’espère qu’elle vous aura été utile, n’hésitez pas à donner vos remarques, à poser des questions. Le prochain article sera consacré aux modificateurs !

Tagués avec : , , , , , ,
Publié dans Smarty
Un commentaire pour “Tutoriel : Création de fonctions personnalisées avec Smarty
  1. gab dit :

    La derniere fois que j’ai bosser avec smarty j’ai failli me tirer une balle! Faudra m’expliquer l’avantage de ne plus pouvoir ecrir du php dans le html… a par te faire apprendre de nouvel fonction smarty alors que ya deja des fonction tres bien en php. A oui aussi les .template qui se mettent pas a jour et qu’il faut supprime a la main… bref smarty que du bonheur xD

Laisser un commentaire

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

*