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 deux 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 indexés▲
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.
À noter que le principe pour le référencement des variables Smarty est exactement le même (ce sera le cas, quel que soit le type de variable utilisé). C'est dans le fichier de templates que l'on modifiera la syntaxe pour accéder à la variable souhaitée :
// Inclure la bibliothèque 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 bibliothèque 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().
// sélection 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
...
*/
// sélection 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 débogage 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 bibliothèque 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çons 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 5e é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 accessibles 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 quelques-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 templates. 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}