Initiation aux templates en PHP avec Smarty


prcdentsommairesuivant

III. Les diffrentes 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 mcanisme 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 mme principe que le test que l'on a fait (dans le chapitre 'tester').
Dans le fichier PHP, nous allons crer 2 variables (un entier et une chane de caractres).
Ensuite il nous faut les "recenser" dans l'objet Smarty avec la mthode assign('variable_cible_smarty', $variablePHP).
Enfin on provoque l'affichage avec la mthode 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 gnial 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 aprs passage de l'objet
$oSmarty->display('exemple.tpl');

La mthode assign() de la classe Smarty recense une variable PHP (second argument) et l'associe une chane de caractres qui sera une variable Smarty dans le fichier de template. On peut tre drout (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 chane de caractres.

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 dveloppeurs qui utilisent PHP4 on utilisera avantageusement la mthode 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'avre un peu plus dlicate... mais rassurez vous, rien d'insurmontable.
A noter que le principe pour le rfrencement des variables Smarty est exactement le mme (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 accder la variable souhaite

tabIndexe.php
Sélectionnez
// Inclure la librairie smarty
require_once('../smarty/Smarty.class.php');
 
// Instancier notre objet smarty
$oSmarty = new Smarty();
 
// 1. Cration 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 aprs 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

Mme principe que ce que l'on a vu prcdemment, l'accs aux valeurs est un peu diffrent de la mthode utilise pour les tableaux indexs un exemple:

tabAssoc.php
Sélectionnez
// Inclure la librairie smarty
require_once('../smarty/Smarty.class.php');
 
// Instancier l'objet smarty
$oSmarty = new Smarty();
 
// 1. Cration 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 aprs 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 intermdiaire (comme je l'ai fait dans les deux exemples prcdents): l'utilisation de la mthode append().

Une autre utilit cette mthode est la possibilit d'ajouter la mme variable Smarty du contenu plusieurs moments du script, ce qui est exclu avec la mthode 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 mthode append() ne permet pas le debogage ct PHP (par exemple avec la fonction print_r()) puisqu'il n'y a pas de variable intermdiaire dans le script PHP.

III-C. Les objets (syntaxe PHP5)

Reprenons l'exemple (dfinition 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');
 
// Dfinition 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. Cration 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 aprs passage de l"objet
$oSmarty->display("exempleClass.tpl");

Maintenant voyons comment "rcuprer 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>Proprit "nom" de l'objet: {$smarty_objet_personne->nom}</li> 
			<!-- Affiche "Pommereau" -->
 
			<li>Proprit "aInfos" (premire 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 diffrents types de variables, qui expose les diverses faon d'accder 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 5me lment 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 proprit "bar" de l'objet
{$foo->bar()} <-- affiche la valeur retourne de la mthode "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 autorises
 
{$foo.bar.baz}
{$foo.$bar.$baz}
{$foo[4].baz}
{$foo[4].$baz}
{$foo.bar.baz[4]}
{$foo->bar($baz,2,$bar)} <-- passage de paramtres
{"foo"}       <-- les valeurs statiques sont autorises

III-E. Les variables internes

Smarty offre, en plus du mcanisme "manuel" d'affectation de variable, la possibilit d'accder certaines variables rserves accessible par l'intermdiaire 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 accder aux valeurs de ces variables internes vous n'avez rien faire ct PHP, tout est directement accessible dans le fichier de template. L'accs se fait par la variable "$smarty" qui est automatiquement cre.

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" rcupre 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}

prcdentsommairesuivant

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 ni 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.