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éesIII-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}

