Cet article pour but d'initier le lecteur l'utilisation des templates en PHP avec le moteur de template Smarty. Une autre ide, sous-jacente, est de convaincre de l'intrt d'utiliser un systme de template dans les dveloppements PHP. Il ne s'agit en aucun cas ici de vous en prsenter toutes les fonctionnalits, mais de vous donner un aperu de ce que l'on peut faire avec Smarty et comment on peut le faire. J'ai souhait rendre Smarty le plus accessible possible en mettant l'accent sur les aspects pratiques (exemples, recettes de code et debogage), j'espre que vous aurez plaisir me lire.
I - Introduction..............................................................................................................................................................3 I-A - Remerciements.............................................................................................................................................. 3 I-B - Prsentation................................................................................................................................................... 3 I-C - Avantages et inconvnients...........................................................................................................................3 I-C-1 - Inconvnients.........................................................................................................................................3 I-C-2 - Avantages..............................................................................................................................................4 I-D - Installer...........................................................................................................................................................4 I-E - Tester..............................................................................................................................................................4 II - Retour sur les mtas-structures............................................................................................................................ 6 II-A - Les tableaux..................................................................................................................................................6 II-A-1 - Les tableaux indexes............................................................................................................................6 II-A-2 - Les tableaux associatifs....................................................................................................................... 7 II-B - Les objets (syntaxe PHP5)........................................................................................................................... 7 II-C - Les fichiers xml (avex SimpleXml)............................................................................................................... 8 III - Les diffrentes variables Smarty.......................................................................................................................... 8 III-A - Les variables simples...................................................................................................................................8 III-B - Les tableaux.................................................................................................................................................9 III-B-1 - Les tableaux indexes...........................................................................................................................9 III-B-2 - Les tableaux associatifs.................................................................................................................... 10 III-B-3 - La fonction append()......................................................................................................................... 11 III-C - Les objets (syntaxe PHP5)........................................................................................................................ 11 III-D - Doc Smarty................................................................................................................................................ 12 III-E - Les variables internes................................................................................................................................ 13 IV - Les fonctions natives.......................................................................................................................................... 13 IV-A - Section....................................................................................................................................................... 13 IV-B - If, else, elseif............................................................................................................................................. 14 IV-C - Literal......................................................................................................................................................... 15 IV-D - Include....................................................................................................................................................... 16 V - Les fonctions utilisateur....................................................................................................................................... 16 V-A - Html_options............................................................................................................................................... 17 V-B - Cycle........................................................................................................................................................... 17 V-C - Mailto.......................................................................................................................................................... 18 V-D - Liste des fonctions utilisateur..................................................................................................................... 18 VI - Les modificateurs de variable............................................................................................................................ 18 VI-A - Upper......................................................................................................................................................... 18 VI-B - Default........................................................................................................................................................19 VI-C - Truncate..................................................................................................................................................... 19 VII - La console de debogage...................................................................................................................................20 VII-A - Appel dans le script PHP......................................................................................................................... 20 VII-B - Appel dans le template.............................................................................................................................20 VII-C - La console sans javascript....................................................................................................................... 20 VII-D - Paramtre dans l'url................................................................................................................................. 21 VIII - Recettes de code............................................................................................................................................. 21 VIII-A - Extraction Mysql vers tableau HTML...................................................................................................... 21 VIII-B - Utilisation d'une source xml.....................................................................................................................22 VIII-C - Production d'un fichier XML (fil rss)........................................................................................................ 24 IX - Ressources......................................................................................................................................................... 25 X - Conclusion........................................................................................................................................................... 25
-2Copyright 2008 - Eric POMMEREAU. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://eric-pommereau.developpez.com/tutoriels/initiation-smarty/
I-B - Prsentation
Smarty est un systme (ou moteur) de templates (entendez par template modle ou patron) utilisable avec PHP 4 ou PHP 5. Vous trouverez le site officiel ici Dans cet article les exemples sont prsents en PHP5
I-C-1 - Inconvnients
L'utilisation du systme de template Smarty n'est pas la porte de tous, souvent le dveloppeur non chevronn sera rebut par son utilisation. Par exemple, il est frquent de ne pas trouver immdiatement la faon d'accder sa variable dans le template (mme avec un peu d'exprience d'ailleur)... ce qui peut tre un peu irritant. Mme avec une certaine exprience en PHP "traditionnel" (production et prsentation PHP mlangs), l'utilisation de Smarty n'est pas vidente, elle remet en cause nombre de choses dans la manire de dvelopper. L'apprentissage du langage de templates (ce que l'on retrouvera dans nos fichiers .TPL) est indispensable. Cela pourra aussi en refroidir plus d'un. Ainsi il faudra connatre les variables (et les innombrables faon d'y accder), les fonctions, le debogage. C'est ce que je me propose de vous expliquer.
-3Copyright 2008 - Eric POMMEREAU. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://eric-pommereau.developpez.com/tutoriels/initiation-smarty/
I-C-2 - Avantages
Le premier avantage que je vois l'utilisation de Smarty est le gain de temps moyen/long terme. Si sa mise en place peut prendre un peu plus de temps, plus on avance dans un projet et plus Smarty apparat comme une vidence. Le second avantage est la plus grande facilit de travailler plusieurs. Prenez une quipe de dveloppement avec des niveaux disparates (c'est le cas o je travaille). Ce dcouplage mtier / prsentation permet potentiellement tout le monde de participer au dveloppement bien plus facilement que dans un dveloppement PHP plus traditionnel. Un autre avantage qui m'est particulirement cher (demandez donc mes collgues !!!) est qu'avec Smarty au final le code produit est plus "propre" et "comprhensible" .. au final mieux organis en particulier dans les gros projets. Bien sur il est possible de coder comme un cochon quand mme !!! Enfin, un systme de cache permet d'acclrer considrablement la vitesse des traitements (la page n'est pas systmatiquement recalcule). La dcision d'utiliser la gestion de cache est la charge du dveloppeur.
Vous l'aurez compris, en ce qui me concerne, je suis convaincu que Smarty est un outil de PRODUCTIVITE.
I-D - Installer
L'installation de Smarty ncessite peu de pr-requis: Un serveur web supportant PHP (apache ou IIS par exemple) Php version 4.0.6 ou version siprieure
Je vous encourage galement tlcharger (ou consulter) la documentation de Smarty qui est trs complte. L'tape suivante est de tlcharger les sources de Smarty et de les installer sur votre serveur (dans les exemples j'utilise le package WAMP). Attention l'archive contenant les sources de Smarty, tlchargeable sur ce site, est au format .tar.gz, procurez vous de quoi dcompresser ce type d'archive (par exemle 7zip). Une fois l'archive de Smarty rcupre, vous constaterez la prsence de plusieurs fichiers et rpertoires:
En fait pour dmarrer c'est simplement le rpertoire '/libs' qui nous intresse. Il contient les fichiers suivants:
Un conseil: placez les sources de Smarty dans un rpertoire en ayant l'esprit que vous pourrez utiliser ce systme de templates dans plusieurs projets, la racine de votre serveur web par exemple.
I-E - Tester
En premier lieu vous devez crer le fichier PHP qui aura pour objet de "piloter" Smarty (Inclusion de la librairie et instanciation de l'objet Smarty et affichage du template aprs compilation). test.php
// Inclusion de la librairie require_once('../Smarty/Smarty.class.php'); // Instanciation d'un l'objet Smarty $oSmarty = new Smarty(); // Affichage du template aprs compilation
-4Copyright 2008 - Eric POMMEREAU. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://eric-pommereau.developpez.com/tutoriels/initiation-smarty/
test.php
$oSmarty->display('test.tpl');
L'tape suivante est de crer deux rpertoires (dans les exemples, ces deux rpertoires sont placs la racine du rpertoire contenant le fichier PHP): templates/ templates_c/
Ces deux rpertoires contiendront respectivement les fichiers templates (.TPL) et les fichiers compils. La prsence de ces deux rpertoires est obligatoire pour l'utilisation de Smarty. Vous avez le choix pour l'emplacement des rpertoires: L'emplacement explicite: Dans ce cas vous spcifiez vous-mme l'emplacement de ces deux rpertoires avec les deux proprits de l'objet Smarty: "template_dir" et "compile_dir" L'emplacement implicite: il s'agit simplement de crer ces deux rpertoires dans le rpertoire du script PHP qui s'occupe des manipulations Smarty (c'est la mthode que nous retiendrons pour les exemples)
Pour terminer notre premier test, nous allons crer un fichier "test.tpl" dans le rpertoire "templates/". C'est dans ce fichier que l'on retrouvera tout ce qui concerne l'affichage de notre page, savoir le HTML (ventuellement JAVASCRIPT et STYLE) et les instructions propres Smarty qui auront pour tche d'afficher les donnes produites dans le fichier PHP. En voici le contenu: test.tpl
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Test smarty</title> </head> <body> <h1>Test smarty</h1> </body> </html>
Pour la prvisualisation, lancez votre page "test.php". Vous devriez obtenir le rsultat suivant:
Page de test Nous allons ensuite tester le passage d'une variable (produite dans le fichier PHP) au template Smarty, dans le but d'afficher une chane de caractres dans notre page HTML. Avant de nous lancer dans l'criture du code sachez qu'il est ncessaire de respecter deux tapes: 1 2 Ct PHP: utilisation de la mthode assign() de l'objet Smarty pour affecter la variable Smarty la valeur de la variable PHP Ct TEMPLATE: Afficher la variable Smarty
test.php
<?php // Inclure la librairie smarty require_once('../smarty/Smarty.class.php');
-5Copyright 2008 - Eric POMMEREAU. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://eric-pommereau.developpez.com/tutoriels/initiation-smarty/
test.php
// Instancier notre objet smarty $oSmarty = new Smarty(); // Affecter la valeur "Bonjour le monde" la varaible SMARTY 'hello_world' $oSmarty->assign('hello_world', 'Bonjour le monde');
test.tpl
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html> <head> <title>Test smarty</title> </head> <body> <h1>Test smarty</h1> <!-- ici j'injecte la donne qui vient de mon script PHP "{$hello_world}" --> <h2 color="red">{$hello_world}</h2> </body> </html>
Revenons en l'utilisation de la mthode assign() dans le fichier PHP. Cette mthode prend deux arguments: 1 2 Le nom de la variable "cible" que l'on utilisera dans le fichier template (c'est une chane de caractres) La variable ou la valeur PHP que l'on souhaite associer au premier argument(variable ou valeur)
Voi pour nos tests. Maintenant nous allons faire un bref retour sur les mtas-structures PHP (tabelaux, objets, fichiers xml -avec simpleXML-) que nous utiliserons par la suite.
-6Copyright 2008 - Eric POMMEREAU. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://eric-pommereau.developpez.com/tutoriels/initiation-smarty/
-7Copyright 2008 - Eric POMMEREAU. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://eric-pommereau.developpez.com/tutoriels/initiation-smarty/
<?xml version="1.0" encoding="iso-8859-1"?> <personnes> <personne> <nom>POMMEREAU</nom> <prenom>ERIC</prenom> </personne> <personne> <nom>JAMES</nom> <prenom>Sylvain</prenom> </personne> <personne> <nom>MICHEL</nom> <prenom>Jean-Luc</prenom> </personne> </personnes>
Maintenant le fichier PHP que l'on utilise pour accder la valeur du fichier XML par l'intermdiaire de la librairie SimpleXML Le fichier PHP
<?php $oFichierXml = simplexml_load_file('personnes.xml'); // Lecture et affichage du nom *************** echo $oFichierXml->personne[0]->nom; // Affiche: 'POMMEREAU'
?>
// Instancier notre objet smarty $oSmarty = new Smarty(); // Fixer les chemins de template (optionnel) $oSmarty->template_dir = '../templates'; $oSmarty->compile_dir = '../templates_c'; // 1. Affectation des variables $une_chaine = "C'est gnial smarty"; $un_entier = 33; // 2. Recensement dans smarty $oSmarty->assign('smarty_une_chaine', $une_chaine);
-8Copyright 2008 - Eric POMMEREAU. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://eric-pommereau.developpez.com/tutoriels/initiation-smarty/
Fichier exemple.php
La mthode assign() de la classe Smarty recense une variable PHP (second argument) et l'associe une chane de caractres qui sera une variable Smarty dans le fichier de template. On peut tre drout (croyez moi je l'ai t aussi!!) et faire des erreurs en pensant que le premier argument doit tre une variable. Donc n'oubliez pas !!! Le premier argument d'assign est une chane de caractres. exemple.tpl
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Test smarty</title> </head> <body> <h1>Test smarty</h1> <ul> <li>une chaine: <span style="color:red;">{$smarty_une_chaine}</span></li> <li>un entier: <span style="color:red;">{$smarty_un_entier}</span></li> </ul> </body> </html>
Pour les dveloppeurs qui utilisent PHP4 on utilisera avantageusement la mthode assign_by_ref() qui vite la "recopie" des variables.
// Inclure la librairie smarty require_once('../smarty/Smarty.class.php'); // Instancier notre objet smarty $oSmarty = new Smarty(); // 1. Cration et affectation d'un tableau index $mon_tableau_indexe = array("Jean-Luc","Jean","Sylvain","Eric"); // 2. Recensement dans smarty $oSmarty->assign("smarty_mon_tableau_indexe", $mon_tableau_indexe); // 3. Affichage du template aprs passage de l'objet $oSmarty->display('tabIndexe.tpl');
tabIndexe.tpl
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head>
-9Copyright 2008 - Eric POMMEREAU. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://eric-pommereau.developpez.com/tutoriels/initiation-smarty/
tabIndexe.tpl
<title>Test smarty</title> </head> <body> <h1>Test smarty</h1> <ul> <li>Une valeur du tableau <!-- Jean-Luc --> <li>Une valeur du tableau <!-- Jean --> <li>Une valeur du tableau <!-- Sylvain --> <li>Une valeur du tableau <!-- Eric --> </ul> </body> </html>
// Inclure la librairie smarty require_once('../smarty/Smarty.class.php'); // Instancier l'objet smarty $oSmarty = new Smarty(); // 1. Cration et affectation d'un tableau associatif $aMonTableauAsscoiatif = array( "Eric" => "Pommereau", "Jl" => "Michel", "Jean" => "Peyroux" ); // 2. Recensement dans smarty $oSmarty->assign("smarty_mon_tableau_assoc", $aMonTableauAsscoiatif); // 3. Affichage du template aprs passage de l'objet $oSmarty->display("tabAssoc.tpl");
tabAssoc.tpl
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Test smarty</title> </head> <body> <h1>Test smarty</h1> <ul> <li>Une valeur du tableau associatif: {$smarty_mon_tableau_assoc.Eric}</li> <!-- Pommereau --> <li>Une valeur du tableau associatif: {$smarty_mon_tableau_assoc.Jl}</li> <!-- Michel --> <li>Une valeur du tableau associatif: {$smarty_mon_tableau_assoc.Jean}</li> <!-- Peyroux --> </ul> </body> </html>
- 10 Copyright 2008 - Eric POMMEREAU. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://eric-pommereau.developpez.com/tutoriels/initiation-smarty/
// selection de 5 enregistrements ( partir de 0) $sQuery = "SELECT PSN_FIRST_NAME, PSN_LAST_NAME, PSN_PHONE FROM person ORDER BY PSN_LAST_NAME LIMIT 0,5"; $mysql_rs = mysql_query($sQuery, $mysql_ressource) or die(mysql_error()); while ($aRow = mysql_fetch_array($mysql_rs)) { $oSmarty->append('smarty_table_mysql', $aRow); } /* ... INSTRUCTIONS ... */ // selection de 5 enregistrements ( partir de 5) $sQuery = "SELECT PSN_FIRST_NAME, PSN_LAST_NAME, PSN_PHONE FROM person ORDER BY PSN_LAST_NAME LIMIT 5,5"; $mysql_rs = mysql_query($sQuery, $mysql_ressource) or die(mysql_error()); while ($aRow = mysql_fetch_array($mysql_rs)) { $oSmarty->append('smarty_table_mysql', $aRow); }
Attention cependant, utiliser la mthode append() ne permet pas le debogage ct PHP (par exemple avec la fonction print_r()) puisqu'il n'y a pas de variable intermdiaire dans le script PHP.
// Inclure la librairie smarty require_once('../smarty/Smarty.class.php'); // Dfinition de la classe class personne { public $nom = ""; public $prenom = ""; public $aInfos = array(); public function __construct($sNom, $sPrenom) { $this->nom = $sNom; $this->prenom = $sPrenom; } public function add_info($sInfo) { array_push($this->aInfos, $sInfo); }
// Instancier notre objet smarty - 11 Copyright 2008 - Eric POMMEREAU. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://eric-pommereau.developpez.com/tutoriels/initiation-smarty/
exempleClass.php
$oSmarty = new Smarty(); // 1. Cration et affectation d"un objet $oPersonne = new personne("POMMEREAU", "Eric"); $oPersonne->add_info("mobile: 06.11.75.86.xx"); $oPersonne->add_info("Adresse: 4, villa des Marronniers 91580 ETRECHY"); $oPersonne->add_info("Date de naissance: 23/11/1973"); // 2. Recensement dans smarty $oSmarty->assign("smarty_objet_personne", $oPersonne); // 3. Affichage du template aprs passage de l"objet $oSmarty->display("exempleClass.tpl");
Maintenant voyons comment "rcuprer nos petits" dans notre fichier de template: exempleClass.tpl
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Test smarty</title> </head> <body> <h1>Test smarty</h1> <ul> <li>Proprit "nom" de l'objet: {$smarty_objet_personne->nom}</li> <!-- Affiche "Pommereau" --> <li>Proprit "aInfos" (premire valeur du tableau) de l'objet: {$smarty_objet_personne->aInfos[0]} </li> <!-- Affiche "mobile: 01.213.65.32" --> </ul> </body> </html>
- 12 Copyright 2008 - Eric POMMEREAU. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://eric-pommereau.developpez.com/tutoriels/initiation-smarty/
{* Affiche la valeur de page dans l'url (GET) http://www.example.com/index.php?page=foo *} {$smarty.get.page} {* affiche la variable "page" rcupre depuis un formulaire (POST) *} {$smarty.post.page} {* affiche la variable "utilisateur" du regroupement de get/post/cookies/server/env *} {$smarty.request.utilisateur} {* affiche la valeur du cookie "utilisateur" *} {$smarty.cookies.utilisateur} {* affiche la variable serveur "SERVER_NAME" *} {$smarty.server.SERVER_NAME}
IV-A - Section
Cette fonction essentielle est peut-tre la premire qui m'a fait prendre conscience du potentiel de Smarty. Section vous permet d'afficher une portion de code HTML autant de fois qu'il y a d'lments dans le conteneur qui lui a t indiqu. C'est en fait strictement la mme chose qu'une boucle, gardez toujours a l'esprit. Pour que tout cela fonctionne, il faut donc avoir pass Smarty un conteneur de donne (tableau ou objet) et lui se charge du reste. Vous devez spcifier au moins deux arguments: LOOP qui est la variable Smarty (tableau ou objet assign en PHP) et un attribut NAME dont la valeur reprsente le nom de la SECTION. La valeur de NAME est comme un index que nous utiliserons dans la fonction pour accder l'lment courant, aller un exemple: section.php
// Inclure la librairie smarty require_once('../smarty/Smarty.class.php'); // Instancier l'objet smarty $oSmarty = new Smarty(); $aMonTableau = array("Jean", "Jean-Luc", "Sylvain", "Eric"); // 2. Recensement dans smarty de la variable $aMonTableau
- 13 Copyright 2008 - Eric POMMEREAU. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://eric-pommereau.developpez.com/tutoriels/initiation-smarty/
section.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>La fonction section</title> </head> <body> <h2>La fonction section</h2> <ul> <!--Bloc rpt autant de fois qu'il y aura d'lments dans '$smarty_tableau'--> {section name=idx_smarty_tableau loop=$smarty_tableau} <li>{$smarty_tableau[idx_smarty_tableau]}</li> {/section} </ul> </body> </html>
// Inclure la librairie smarty require_once('../smarty/Smarty.class.php'); // Instancier notre objet smarty $oSmarty = new Smarty(); $userIsAdmin = 'true'; // 2. Recensement dans smarty $oSmarty->assign('smarty_userIsAdmin', $userIsAdmin); // 3. Affichage du template aprs passage de l'objet $oSmarty->display('if.tpl');
Ici encore rien de particulier ct PHP, c'est la partie TEMPLATE qui est concerne, dans cet exemple, on teste la valeur d'une variable Smarty concernant les droits d'un utilisateur. if.tpl
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Fonctions IF/ELSE/ELSEIF</title> </head> <body>
- 14 Copyright 2008 - Eric POMMEREAU. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://eric-pommereau.developpez.com/tutoriels/initiation-smarty/
if.tpl
<h2>Les fonctions IF/ELSE/ELSEIF</h2> {if $smarty_userIsAdmin == 'true'} <div>Salut administrateur</div> {else} <div>Salut utilisateur lambda !!</div> {/if}
</body> </html>
IV-C - Literal
Literal vous permet de dsactiver un temps l'interprtation Smarty. Cela permet notamment l'insertion de scripts JAVASCRIPT qui gnrerent habituellement des erreurs (entre autre cause des accolades). En effet le fichier de template suivant gnre une erreur: sansLiteral.tpl
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title></title> </head> <body> <script language="JavaScript" type="text/javascript"> function test () { alert('Bonjour le monde !!'); } </script> </body> </html>
Fatal error: Smarty error: [in index.tpl line 10]: syntax error: unrecognized tag: alert('Bonjour le monde !!'); (Smarty_Compiler.class.php, line 439) in C:\Program Files\wamp\www\demos\smarty\lib_smarty\Smarty.class.php on line 1095 En utilisant la fonction {LITERAL}, c'est dire en entourant le script javascript ou la C.S.S. concern, cela ne posera plus de problme: avecLiteral.tpl
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Literal</title> </head> <body> {LITERAL} <script language="JavaScript" type="text/javascript"> function test () { alert('Bonjour le monde !!'); } </script> {/LITERAL} </body> </html>
- 15 Copyright 2008 - Eric POMMEREAU. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://eric-pommereau.developpez.com/tutoriels/initiation-smarty/
IV-D - Include
Cette fonction permet d'appeler dans un template un autre template, dans la mme ide qu'un include() PHP. Cela permet de dcoupler encore plus la prsentation. Nous allons voir dans l'exemple suivant le cas d'une zone principale et d'un "HEADER". include.php
require_once('../smarty/Smarty.class.php'); // Instancier l'objet smarty $oSmarty = new Smarty(); $oSmarty->assign('header_text', "Ceci est l'entte de ma page !!!"); $oSmarty->assign('main_text', "Ceci est la zone principale de ma page !!!"); // 3. Affichage du template aprs passage de l'objet $oSmarty->display('include.tpl');
Voyons maintenant le template qui prend en charge l'inclusion (ici du template header.tpl) include.tpl
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Exemple d'include</title> </head> <body> {include file="header.tpl"} <div id="main" style="background-color:#6699cc;"> <h1>{$main_text}</h1> </div> </body> </html>
Dans le template inclu on peut utiliser sans problme les variables Smarty.
- 16 Copyright 2008 - Eric POMMEREAU. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://eric-pommereau.developpez.com/tutoriels/initiation-smarty/
V-A - Html_options
La fonction HTML_OPTIONS provoque l'affichage d'une liste d'options ( l'intrieur d'un lment HTML "SELECT"). Il faut pour cela lui indiquer une liste de valeurs qui seront affiches et une liste d'identifiants associs ces valeurs... vite un exemple !!! html_options.php
$oSmarty = new Smarty(); // Liste des textes pour les "<option>" $aNoms = array("Sylvain", "Jean", "Jean-Luc", "Eric"); // Liste des valeurs pour les "<option>" $aIndex = array(1,2,3,4); // L'lment selectionn est le 3 $iSelected = 3; $oSmarty->assign('smarty_liste_noms', $aNoms); $oSmarty->assign('smarty_liste_index', $aIndex); $oSmarty->assign('smarty_liste_selected', $iSelected); $oSmarty->display('html_options.tpl');
html_options.tpl
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>exemple HTMLOPTIONS</title> </head> <body> <form name="mon_formulaire"> <select name="gars_du_dev"> {html_options values=$smarty_liste_index selected=$smarty_liste_selected output=$smarty_liste_noms} </select> </form> </body> </html>
Rsultat
V-B - Cycle
La fonction CYCLE permet l'affichage en alternance de 1 n valeurs. Dans la pratique, on l'utilisera avantageusement pour l'alternat de couleurs dans un tableau affichant un ensemble de donnes. C'est ce que nous allons voir tout de suite dans l'exemple cycle.php
require_once('../lib_smarty/Smarty.class.php'); $oSmarty = new Smarty(); $aNoms = array("Sylvain", "Jean", "Jean-Luc", "Eric"); $oSmarty->assign('smarty_liste_noms', $aNoms); $oSmarty->display('cycle.tpl');
cycle.tpl
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head>
- 17 Copyright 2008 - Eric POMMEREAU. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://eric-pommereau.developpez.com/tutoriels/initiation-smarty/
cycle.tpl
<title>Exemple fonction cycle</title> </head> <body> {section name=idx loop=$smarty_liste_noms} <div style="background-color:{cycle values="red,blue"};">{$smarty_liste_noms[idx]}</div> {/section} </body> </html>
V-C - Mailto
Comme son nom l'indique cette fonction vous permet d'ajouter rapidement un lien mailto (lien vers un ou plusieurs mails). L'utilisation de mailto permet notamment l'encodage en javascript / hexadcimal des adresses mails qui sont alors bien moins facilement reprables. Un exemple d' utlisation en encodage javascript: encode.tpl
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Exemple fonction encode</title> </head> <body> {mailto address="eric190@free.fr" encode="javascript"} </body> </html>
VI-A - Upper
UPPER permet de mettre le contenu de la variable en capitales.
// Inclure la librairie smarty
- 18 Copyright 2008 - Eric POMMEREAU. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://eric-pommereau.developpez.com/tutoriels/initiation-smarty/
Initiation aux templates en PHP avec Smarty par Eric POMMEREAU require_once('../smarty/Smarty.class.php'); // Instancier notre objet smarty $oSmarty = new Smarty(); $oSmarty->assign("smarty_phrase", "Les chaussettes de l'archi-duchesse"); // 3. Affichage du template aprs passage de l'objet $oSmarty->display('exemple.tpl');
Modificateur UPPER
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Exemple modificateur UPPER</title> </head> <body> <p>{$smarty_phrase|upper}</p> </body> </html>
Rsultat
VI-B - Default
Ce modificateur permet de donner une variable Smarty une valeur par dfaut. Par exemple pour insrer un espace dans un tableaux quand la donne est vide. Modificateur DEFAULT
VI-C - Truncate
Truncate entrane la ssure d'une chane de caractres au nombre de caractres souhait
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Modificateur TRUCATE</title> </head> <body> <p>{$smarty_phrase|truncate:30}</p> </body> </html>
Par dfaut, le dcoupage ne se fait normalement pas sur un mot mais su la fin du mot, issu de la doc Smarty: "Par dfaut, truncate tentera de couper la chane la fin d'un mot". Cette caractristique est facilement "dbrayable".
- 19 Copyright 2008 - Eric POMMEREAU. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://eric-pommereau.developpez.com/tutoriels/initiation-smarty/
// Inclure la librairie smarty require_once('../smarty/Smarty.class.php'); // Instancier notre objet smarty $oSmarty = new Smarty(); $oSmarty->debugging = true; $oSmarty->assign("smarty_phrase", "Les chaussettes de l'archi-duchesse"); // 3. Affichage du template aprs passage de l'objet $oSmarty->display('exemple.tpl');
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Exemple d'utilisation de la console de dbogage</title> </head> <body> <p>{$smarty_phrase|truncate:30}</p> {debug} </body> </html>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>La console sans javascript</title>
- 20 Copyright 2008 - Eric POMMEREAU. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://eric-pommereau.developpez.com/tutoriels/initiation-smarty/
consoleEnHtml.tpl
Affichage de la console sans passer par JAVASCRIPT Comme vous le voyez la console n'est plus lance dans une fentre popup mais bien intgre la page web gnre
Appel de la console en utilisant un paramtre dans l'URL Voyez dans la barre d'adresse, j'ai pass le paramtre 'SMARTY_DEBUG' (peu importe qu'il y ait une valeur associe), la proprit Smarty "debugging_ctrl" tant true, la console s'est affiche.
La partie PHP ne prsente rien d'exceptionnel. L'ide est d'empiler chacune des "lignes"rcupres (avec la fonction mysql_fetch_array) pour rutiliser le tableau ainsi constitu dans le template Smarty. fromMysqlToTable.php
require_once('../lib_smarty/Smarty.class.php'); $oSmarty = new Smarty(); $mysql_ressource = mysql_connect('localhost', 'root', ''); mysql_select_db("training", $mysql_ressource); $sQuery = "SELECT PSN_FIRST_NAME, PSN_LAST_NAME, PSN_PHONE FROM person ORDER BY PSN_LAST_NAME"; $mysql_rs = mysql_query($sQuery, $mysql_ressource) or die(mysql_error()); - 21 Copyright 2008 - Eric POMMEREAU. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://eric-pommereau.developpez.com/tutoriels/initiation-smarty/
fromMysqlToTable.php
$aRecordSet = array(); while ($aRow = mysql_fetch_array($mysql_rs)) { array_push($aRecordSet, $aRow); } $oSmarty->assign('smarty_table_mysql', $aRecordSet); $oSmarty->display('index.tpl');
mysqlToTable.tpl
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title></title> </head> <body> <table width="450px"> <tr style="background-color:teal;color:white;"> <th>NOM</th> <th>PRENOM</th> <th>TELEPHONE</th> </tr> <!-- Pour chaque lment du tableau $smarty_table_mysql --> {section name=idx loop=$smarty_table_mysql} <tr style="background-color:{cycle values="#ffffcc, #cccccc"};"> <td>{$smarty_table_mysql[idx].PSN_LAST_NAME}</td> <td>{$smarty_table_mysql[idx].PSN_FIRST_NAME}</td> <td>{$smarty_table_mysql[idx].PSN_PHONE}</td> </tr> {/section} </table> </body> </html>
<?xml version="1.0"?> <personnes> <personne> <nom>PEYROUX</nom> <prenom>Jean</prenom> <tels> <tel>06.76.89.78.56</tel> </tels> </personne> <personne> <nom>MICHEL</nom> <prenom>Jean-Luc</prenom> <tels> <tel>01.87.54.23.34</tel> <tel>06.12.21.34.54</tel> <tel>09.09.98.89.09</tel> </tels> </personne> <personne>
- 22 Copyright 2008 - Eric POMMEREAU. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://eric-pommereau.developpez.com/tutoriels/initiation-smarty/
personnes.xml
Comme nous allons le voir, la taille du code PHP est particulirement faible. personnes.php
require_once('../lib_smarty/Smarty.class.php'); $oSmarty = new Smarty(); $oXmlFile = simplexml_load_file("personnes.xml"); $oSmarty->assign('smarty_xml_file', $oXmlFile); $oSmarty->display('personnes.tpl');
Le fichier de template est un peu plus complexe puisque nous utilisons la fonction foreach (un peu diffrente de {SECTION}), cette fonction est de plus imbrique pour obtenir les tlphones de chacun: personnes.tpl
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Utilisation d'une source XML</title> </head> <body> <table width="450px"> <tr style="background-color:teal;color:white;"> <th>NOM</th> <th>PRENOM</th> <th>TELEPHONES</th> </tr> <!-- pour chaque item personne --> {foreach from=$smarty_xml_file item=personne} <tr style="background-color:{cycle values="#ffffcc, #cccccc"};"> <td>{$personne->nom}</td> <td>{$personne->prenom}</td> <td> <table> <!-- pour chaque item telephone --> {foreach from=$personne->tels->tel item=telephone} <tr> <td> {$telephone} </td> </tr> {/foreach} </table> </td> </tr> {/foreach} </table> </body> </html>
- 23 Copyright 2008 - Eric POMMEREAU. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://eric-pommereau.developpez.com/tutoriels/initiation-smarty/
Pour la suite mme logique que ce que nous avons pu voir prcdemment. Le fichier PHP charg de la rcupration des donnes et de la "ventilation" vers Smarty.
rss.php
<?php require_once('../lib_smarty/Smarty.class.php'); $oSmarty = new Smarty(); // Le tableau conteneur des lments RSS $aRssItems = array(); // Se connecter mysql if (! $oConnexion = mysql_connect('localhost', 'root', '')) die("Impossible de se connecter"); // Choisir la base de donnes if (! mysql_select_db('demos')) die("Erreur de selection de la base de donnes"); // Construire la requte $sSql = "SELECT `title` , `description` , `link` FROM rss" ; // Excuter la requte et rcuprer le jeu d'enregistrments if (! $oMysqlRes = mysql_query($sSql)) die("Erreur: la requte n'a pu tre excute"); // Pour chaque ligne du jeu d'enregistrement while ($oRow = mysql_fetch_array($oMysqlRes, MYSQL_ASSOC)) { // Ajouter dans le conteneur array_push($aRssItems, $oRow); } // Passer la $oSmarty->assign('smarty_RssItems', $aRssItems); header("Content-Type: text/xml"); $oSmarty->display('rss.tpl') ?>
Enfin, le fichier de template est un fichier XML standard RSS 2.0 Standard RSSavec une partie "dynamique" reproduite autant de fois qu'il y a d'lments dans la base de donne. rss.tpl
<?xml version="1.0" encoding="ISO-8859-1" ?> <rss version="0.91"> <channel> <title>Exemple de production de fil RSS avec SMARTY</title> <link>http://localhost/demos/init_smarty/demoRSS/</link>
- 24 Copyright 2008 - Eric POMMEREAU. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://eric-pommereau.developpez.com/tutoriels/initiation-smarty/
rss.tpl
<description>La dmo suivant vous montre comment crer facilement un flux RSS avec SMARTY.</description> <language>fr</language> <copyright>Eric POMMEREAU</copyright> <webMaster>eric-pommereau@developpez.com</webMaster> <image> <title>Smarty</title> <url>http://localhost/demos/init_smarty/demoRSS/smarty_icon.gif</url> <link>http://smarty.php.net/</link> <width>88</width> <height>31</height> </image> {section name=itemIndex loop=$smarty_RssItems} <item> <title>{$smarty_RssItems[itemIndex].title}</title> <description>{$smarty_RssItems[itemIndex].description}</description> <link>{$smarty_RssItems[itemIndex].link}</link> </item> {/section}
</channel> </rss>
IX - Ressources Smarty
Le site de Smarty : Documentation : Smarty La doc Smarty ressources Smarty Smarty : PHP Template Programming and
Les ressources (article, plugins et autres applications utilisant Smarty) : Un seul livre (pour le moment...), il est en anglais : Applications
Tutoriels
Articles concernant les gabarits sur Tutoriel : Tutoriel : Tutoriel : developpez.com Comparatif des systmes de template pour PHP Dcouverte des principaux moteurs de template en PHP Conception avance d'une galerie d'images gnre la vole
Forums
Forums : Forums : Forums: Gnral sur developpez.com Partie PHP sur developpez.com Partie bibliothques PHP sur developpez.com
X - Conclusion
Un petit conseil pour la route: si vous ne vous tes jamais servi de Smarty ne reprenez pas un projet "du type traditionnel" existant ... a peut vite tourner au cauchemar. Je prconise plutt un dmarrage en douceur sur un projet tout neuf.
- 25 Copyright 2008 - Eric POMMEREAU. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://eric-pommereau.developpez.com/tutoriels/initiation-smarty/
Voil... c'est termin. J'espre que vous avez eu plaisir me lire, si j'ai su susciter quelques vocation quand l'utilisation de Smarty dans vos projets... alors mon objectif est atteint !!! Pour ma part je suis convaincu que Smarty est un bon systme (peut-tre pas le meilleur...) pour crer, maintenir et faire voluer des applications en PHP. N'hsitez pas me contacter si vous avez des questions, des suggestion ou pour signaler une erreur. Contact: eric.pommereau@caramail.com
- 26 Copyright 2008 - Eric POMMEREAU. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://eric-pommereau.developpez.com/tutoriels/initiation-smarty/