I. Introduction▲
I-A. Remerciements▲
Tout d'abord merci à Yogui, responsable de la partie PHP chez DEVELOPPEZ.COM, qui a tout de suite répondu présent quand je l'ai contacté pour la rédaction de cet article et qui a largement contribué à l'amélioration du document d'origine.
Merci également à GrandFather et titoumimi pour leurs contributions.
Merci à mes collègues: Sylvain JAMES, Jean-Luc MICHEL et Jean PEYROUX qui m'ont supporté dans la rédaction de cet article.
I-B. Présentation▲
Smarty est un système (ou moteur) de templates (entendez par template modèle ou patron) utilisable avec PHP 4 ou PHP 5.
Vous trouverez le site officiel ici
Dans cet article les exemples sont présentés en PHP5
I-C. Avantages et inconvénients▲
L'intérêt principal de Smarty réside dans la séparation du contenu et de la forme.
Le concept d'un système de template en général et de Smarty en particulier est de réserver les tâches de production des données à PHP et de mettre le code de présentation (HTML en l'occurence) dans des 'templates' ou modèles, un fichier qu l'on suffixera dans nos exemples par '.TPL'
L'analyse des avantages et inconvénients de Smarty que je fais ci-après est le fruit des quelques expériences que j'ai eu avec ce moteur de templates. Je sais que tout le monde ne sera pas forcément d'accord avec les arguments avancés. Je vous encourage donc à mettre Smarty en oeuvre et vous faire vous-même une opinion... l'important est d'essayer pour se faire une idée.
I-C-1. Inconvénients▲
L'utilisation du système de template Smarty n'est pas à la portée de tous, souvent le développeur non chevronné sera rebuté par son utilisation. Par exemple, il est fréquent de ne pas trouver immédiatement la façon d'accéder à sa variable dans le template (même avec un peu d'expérience d'ailleur)... ce qui peut être un peu irritant.
Même avec une certaine expérience en PHP "traditionnel" (production et présentation PHP mélangés), l'utilisation de Smarty n'est pas évidente, elle remet en cause nombre de choses dans la manière de développer.
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 connaître les variables (et les innombrables façon d'y accéder), les fonctions, le debogage. C'est ce que je me propose de vous expliquer.
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 apparaît comme une évidence.
Le second avantage est la plus grande facilité de travailler à plusieurs. Prenez une équipe de développement avec des niveaux disparates (c'est le cas où je travaille). Ce découplage métier / présentation permet potentiellement à tout le monde de participer au développement bien plus facilement que dans un développement PHP plus traditionnel.
Un autre avantage qui m'est particulièrement cher (demandez donc à mes collègues !!!) est qu'avec Smarty au final le code produit est plus "propre" et "compréhensible" .. au final mieux organisé en particulier dans les gros projets. Bien sur il est possible de coder comme un cochon quand même !!!
Enfin, un système de cache permet d'accélérer considérablement la vitesse des traitements (la page n'est pas systématiquement recalculée). La décision d'utiliser la gestion de cache est à la charge du développeur.
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 nécessite peu de pré-requis:
- Un serveur web supportant PHP (apache ou IIS par exemple)
- Php version 4.0.6 ou version sipérieure
Je vous encourage également à télécharger (ou consulter) la documentation de Smarty qui est très complète.
L'étape suivante est de télécharger les sources de SmartyTélécharger Smarty et de les installer sur votre serveur (dans les exemples j'utilise le package WAMPSite de WAMP). Attention l'archive contenant les sources de Smarty, téléchargeable sur ce site, est au format .tar.gz, procurez vous de quoi décompresser ce type d'archive (par exemle 7zip).
Une fois l'archive de Smarty récupérée, vous constaterez la présence de plusieurs fichiers et répertoires:
En fait pour démarrer c'est simplement le répertoire '/libs' qui nous intéresse. Il contient les fichiers suivants:
Un conseil: placez les sources de Smarty dans un répertoire en ayant à l'esprit que vous pourrez utiliser ce système de templates dans plusieurs projets, à la racine de votre serveur web par exemple.
I-E. Tester▲
En premier lieu vous devez créer le fichier PHP qui aura pour objet de "piloter" Smarty (Inclusion de la librairie et instanciation de l'objet Smarty et affichage du template après compilation).
//
Inclusion
de
la
librairie
require_once('
.
.
/
Smarty
/
Smarty
.
class
.
php
'
);
//
Instanciation
d'un
l'objet
Smarty
$oSmarty
=
new Smarty();
//
Affichage
du
template
après
compilation
$oSmarty
-
>
display('
test
.
tpl
'
);
L'étape suivante est de créer deux répertoires (dans les exemples, ces deux répertoires sont placés à la racine du répertoire contenant le fichier PHP):
- templates/
- templates_c/
Ces deux répertoires contiendront respectivement les fichiers templates (.TPL) et les fichiers compilés.
La présence de ces deux répertoires est obligatoire pour l'utilisation de Smarty.
Vous avez le choix pour l'emplacement des répertoires:
- L'emplacement explicite: Dans ce cas vous spécifiez vous-même l'emplacement de ces deux répertoires avec les deux propriétés de l'objet Smarty: "template_dir" et "compile_dir"
- L'emplacement implicite: il s'agit simplement de créer ces deux répertoires dans le répertoire du script PHP qui s'occupe des manipulations Smarty (c'est la méthode que nous retiendrons pour les exemples)
Pour terminer notre premier test, nous allons créer un fichier "test.tpl" dans le répertoire "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 tâche d'afficher les données produites dans le fichier PHP. En voici le contenu:
<!
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 prévisualisation, lancez votre page "test.php". Vous devriez obtenir le résultat suivant:
Nous allons ensuite tester le passage d'une variable (produite dans le fichier PHP) au template Smarty, dans le but d'afficher une chaîne de caractères dans notre page HTML. Avant de nous lancer dans l'écriture du code sachez qu'il est nécessaire de respecter deux étapes:
- Côté PHP: utilisation de la méthode assign() de l'objet Smarty pour affecter à la variable Smarty la valeur de la variable PHP
- Côté TEMPLATE: Afficher la variable Smarty
<?php
//
Inclure
la
librairie
smarty
require_once('
.
.
/
smarty
/
Smarty
.
class
.
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
'
);
//
Provoque
le
rendu
du
template
$oSmarty
-
>
display('
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
donnée
qui
vient
de
mon
script
PHP
"{$hello_world}"
-->
<
h2
color
=
"
red
"
>
{$hello_world}<
/
h2
>
<
/
body
>
<
/
html
>
Revenons en à l'utilisation de la méthode assign() dans le fichier PHP.
Cette méthode prend deux arguments:
- Le nom de la variable "cible" que l'on utilisera dans le fichier template (c'est une chaîne de caractères)
- 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 métas-structures PHP (tabelaux, objets, fichiers xml -avec simpleXML-) que nous utiliserons par la suite.