décembre
2005
Smarty est un moteur de template pour php.
L’utilité première d’un tel outil est de vous permettre de séparer votre code applicatif de la présentation.
Vous le trouverez ici.
Cet article n’est pas une introduction à l’utilisation de smarty mais plutot un guide pour des personnes l’utilisant déja et voulant étendre ses possibilités.
En effet, cet outil offre la possibilité de créer ses propres « balises » de template.
Nous verrons comment ajouter simplement un select html remplit avec le contenu d’une table de notre base de donnée avec une balise de cette forme :
{monselect table= »user » value= »iduser » text= »name »}
Pour que smarty puisse remplacer notre balise par ce que l’on veut, il nous suffit de lui ajouter une fonction a l’aide de sa méthode register_function.
Imaginons la fonction suivante :
function mafonction($params){ $buffer = ""; if(array_key_exists("table",$params)){ $table = $params["table"]; $value = $params["value"]; $text = $params["text"]; $buffer = "<select name='".$table."'>"; mysql_connect(.....); mysql_select_db(....); $res = mysql_query("SELECT ".$value.",".$text." FROM ".$table); while($row = mysql_fetch_assoc($res)){ $buffer .= "<option value='".$row[$value]."'>". $row[$text]."</option>"; } $buffer .= "</select>"; }else{ $buffer = "erreur machin ...."; } return $buffer; }
Vous l’aurez donc compris, cette fonction doit retourner une chaine qui viendra remplacer votre balise.
Notre fonction recevra un paramètre qui sera un tableau associatif contenant les différents attributs de notre balise.
Il ne reste plus qu’a l’ajouter a smarty :
$smarty->register_function(‘monselect’,’mafonction’);
$smarty étant bien entendu notre objet smarty.
On peut aussi mettre cette fonction dans une classe, a ce moment la, le register_function change un peu :
$smarty->register_function(‘monselect’,array($objetInstancie,’mafonction’));
Les utilisateurs de php 4 penseront bien entendu a mettre un &$objetInstancie pour passer une référence.
Encore une autre possibilité : passer juste le nom de la classe, mais a ce moment là, la méthode devra etre statique.
$smarty->register_function(‘monselect’,array(‘nomDeLaClasse’,’mafonction’));
Faisons un peu de php 5 !
Il existe une api de reflexion en php 5, c’est à dire que vous pouvez « explorer » un objet.
Nous allons nous en servir pour ajouter automatiquement a smarty toutes les méthodes d’une classe qui serait dédiée à contenir nos fonctions smarty.
class FonctionsSmarty{ public static function mafonction($params){ $buffer = ""; if(array_key_exists("table",$params)){ $table = $params["table"]; $value = $params["value"]; $text = $params["text"]; $buffer = "<select name='".$table."'>"; mysql_connect(.....); mysql_select_db(....); $res = mysql_query("SELECT ".$value.",".$text." FROM ".$table); while($row = mysql_fetch_assoc($res)){ $buffer .= "<option value='".$row[$value]."'>". $row[$text]."</option>"; } $buffer .= "</select>"; }else{ $buffer = "erreur machin ...."; } return $buffer; } }
Il ne nous reste plus qu’à parcourir notre classe pour ajouter toutes ses fonctions a smarty :
$class= new ReflectionClass('FonctionsSmarty'); $methods = $class->getMethods(); foreach($methods as $method){ $smarty->register_function($method->getName(), array('FonctionsSmarty', $method->getName())); }
Et le tour est joué
En faisant comme ca, votre balise devra s’appeler comme votre fonction par contre.
Il ne vous reste plus qu’à rajouter des attributs supplémentaires a votre balise pour gérer une clause where ou orderby ….