Initiation aux templates en PHP avec Smarty


précédentsommairesuivant

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.

Fichier exemple.php
Sélectionnez
// 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.

exemple.tpl
Sélectionnez
<!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

tabIndexe.php
Sélectionnez
// 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');
tabIndexe.tpl
Sélectionnez
<!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:

tabAssoc.php
Sélectionnez
// 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");
tabAssoc.tpl
Sélectionnez
<!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().

exemple 1 (tableau indexé)
Sélectionnez
// 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

exempleClass.php
Sélectionnez
// 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:

exempleClass.tpl
Sélectionnez
<!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:

 
Sélectionnez
{$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.

Quelques variables internes de Smarty
Sélectionnez
{* 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}

précédentsommairesuivant

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Copyright © 2008 Eric POMMEREAU. Aucune reproduction, même 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'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.