IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

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

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 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 :

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

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

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çons d'accéder à des variables dans les templates Smarty :

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.

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

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.