III. Les différentes variables Smarty▲
Nous allons voir dans ce chapitre comment passer des variables PHP au moteur Smarty et ensuite comment les utiliser dans les fichiers de templates. Le mécanisme d'affectation des variables n'est pas si simple... comme nous allons le voir.
III-A. Les variables simples▲
On commence ici en douceur puisque l'on reprend le même principe que le test que l'on a fait (dans le chapitre 'tester').
Dans le fichier PHP, nous allons créer 2 variables (un entier et une chaîne de caractères).
Ensuite il nous faut les "recenser" dans l'objet Smarty avec la méthode assign('variable_cible_smarty', $variablePHP).
Enfin on provoque l'affichage avec la méthode display('nom_du_template.tpl') de notre objet Smarty.
//
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
génial
smarty
"
;
$un_entier
=
33;
//
2.
Recensement
dans
smarty
$oSmarty
-
>
assign('
smarty_une_chaine
'
,
$une_chaine
);
$oSmarty
-
>
assign('
smarty_un_entier
'
,
$un_entier
);
//
3.
Affichage
du
template
après
passage
de
l'objet
$oSmarty
-
>
display('
exemple
.
tpl
'
);
La méthode assign() de la classe Smarty recense une variable PHP (second argument) et l'associe à une chaîne de caractères qui sera une variable Smarty dans le fichier de template. On peut être dérouté (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 chaîne de caractères.
<!
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 développeurs qui utilisent PHP4 on utilisera avantageusement la méthode assign_by_ref() qui évite la "recopie" des variables.
III-B. Les tableaux▲
III-B-1. Les tableaux indexes▲
Si l'usage des variables simple est relativement simple, l'utilisation des tableaux s'avère un peu plus délicate... mais rassurez vous, rien d'insurmontable.
A noter que le principe pour le référencement des variables Smarty est exactement le même (ce sera le cas quelque soit le type de variable utilisé). C'est dans le fichier de template que l'on modifiera la syntaxe pour accéder à la variable souhaitée
//
Inclure
la
librairie
smarty
require_once('
.
.
/
smarty
/
Smarty
.
class
.
php
'
);
//
Instancier
notre
objet
smarty
$oSmarty
=
new Smarty();
//
1.
Création
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
après
passage
de
l'objet
$oSmarty
-
>
display('
tabIndexe
.
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 indexé: {$smarty_mon_tableau_indexe[0]}<
/
li
>
<!--
Jean-Luc
-->
<
li
>
Une valeur du tableau indexé: {$smarty_mon_tableau_indexe[1]}<
/
li
>
<!--
Jean
-->
<
li
>
Une valeur du tableau indexé: {$smarty_mon_tableau_indexe[2]}<
/
li
>
<!--
Sylvain
-->
<
li
>
Une valeur du tableau indexé: {$smarty_mon_tableau_indexe[3]}<
/
li
>
<!--
Eric
-->
<
/
ul
>
<
/
body
>
<
/
html
>
III-B-2. Les tableaux associatifs▲
Même principe que ce que l'on a vu précédemment, l'accès aux valeurs est un peu différent de la méthode utilisée pour les tableaux indexés un exemple:
//
Inclure
la
librairie
smarty
require_once('
.
.
/
smarty
/
Smarty
.
class
.
php
'
);
//
Instancier
l'objet
smarty
$oSmarty
=
new Smarty();
//
1.
Création
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
après
passage
de
l'objet
$oSmarty
-
>
display("
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
>
III-B-3. La fonction append()▲
Une alternative à l'utilisation d'un tableau intermédiaire (comme je l'ai fait dans les deux exemples précédents): l'utilisation de la méthode append().
Une autre utilité cette méthode est la possibilité d'ajouter à la même variable Smarty du contenu à plusieurs moments du script, ce qui est exclu avec la méthode assign().
//
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 méthode append() ne permet pas le debogage côté PHP (par exemple avec la fonction print_r()) puisqu'il n'y a pas de variable intermédiaire dans le script PHP.
III-C. Les objets (syntaxe PHP5)▲
Reprenons l'exemple (définition de la classe et utilisation de l'objet) vu au dessus, et
//
Inclure
la
librairie
smarty
require_once('
.
.
/
smarty
/
Smarty
.
class
.
php
'
);
//
Définition
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
$oSmarty
=
new
Smarty();
//
1.
Création
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
après
passage
de
l"objet
$oSmarty
-
>
display("
exempleClass
.
tpl
"
);
Maintenant voyons comment "récupérer nos petits" dans notre fichier de template:
<!
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
>
Propriété "nom" de l'objet: {$smarty_objet_personne->nom}<
/
li
>
<!--
Affiche
"Pommereau"
-->
<
li
>
Propriété "aInfos" (première valeur du tableau) de l'objet:
{$smarty_objet_personne->aInfos[0]}
<
/
li
>
<!--
Affiche
"mobile:
01.213.65.32"
-->
<
/
ul
>
<
/
body
>
<
/
html
>
III-D. Doc Smarty▲
Vous trouverez dans la liste suivante, provenant tout droit de la documentation SmartyDocumentation Smarty: les différents types de variables, qui expose les diverses façon d'accéder à des variables dans les templates Smarty:
{$foo} <
--
affiche
une
variable
simple
(qui
n'
est
pas
un
tableau
ou
un
objet)
{$foo[4]}
<--
affiche
le
5ème
élément
d
'
un
tableau
indexé
{$foo.bar}
<
--
affiche
la
clé
"
bar
"
d'
un
tableau,
identique
à
$foo[
'
bar'
]
en
PHP
{$foo.$bar}
<--
affiche
la
valeur
de
la
clé
d
'
un
tableau,
identique
à
$foo[$bar]
en
PHP
{$foo->
bar} <
--
affiche
la
propriété
"
bar
"
de
l'
objet
{$foo->bar()}
<--
affiche
la
valeur
retournée
de
la
méthode
"bar"
de
l
'
objet
{#foo#}
<
--
affiche
la
variable
du
fichier
de
configuration
"
foo
"
{$smarty.config.foo}
<
--
synonyme
pour
{#foo#}
{$foo[bar]}
<
--
syntaxe
uniquement
valide
dans
une
section
de
boucle,
voir
{section}
Plusieurs
autres
combinaisons
sont
autorisées
{$foo.bar.baz}
{$foo.$bar.$baz}
{$foo[4].baz}
{$foo[4].$baz}
{$foo.bar.baz[4]}
{$foo->
bar($baz,2,$bar)} <
--
passage
de
paramètres
{"
foo
"
}
<
--
les
valeurs
statiques
sont
autorisées
III-E. Les variables internes▲
Smarty offre, en plus du mécanisme "manuel" d'affectation de variable, la possibilité d'accéder à certaines variables réservées accessible par l'intermédiaire de la variable "smarty". Il s'agit en fait de l'enrobage des variables PHP ($_SERVER ou $_ENV par exemple). Cette fois encore je reprends la doc Smarty pour afficher quelque unes de ces variables
Pour accéder aux valeurs de ces variables internes vous n'avez rien à faire côté PHP, tout est directement accessible dans le fichier de template. L'accès se fait par la variable "$smarty" qui est automatiquement créée.
{* Affiche la valeur de page dans l'url (GET) http://www.example.com/index.php?page=foo *}
{$smarty.get.page}
{* affiche la variable "page" récupérée 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}