Smarty

Téléchargement/installation

Télécharger Smarty par la

L'installation proprement dite se résume à extraire le répertoire libs de l'archive et à créer deux répertoires à la racine du projet (accessible à php bien sur). Rien oblige à utiliser cette configuration mais c'est pour faire simple et compatible avec les exemples qui vont suivre.

On supposer donc l'arborescence suivante à la racine d'un serveur web "/"

Le répertoire "libs" contient d'autres dossiers et fichiers ne devant pas être modifiés. J'ai juste montré le fichier "Smarty.class.php" car c'est lui que nous allons appeler pour profiter de tout Smarty.

Le répertoire "templates_c/" doit avoir les droits en écriture.

Passer des variables à Smarty

Passage d'une page HTML

Créer un fichier "page1.php" à la racine du projet et un fichier "page1.tpl" dans le répertoire "templates/".

On pourrais indifféremment remplacer page1.tpl par page1.html mais l'extension .tpl permet de distinguer plus facilement les fichier templates des pages html.

page1.php

<?php
require_once('libs/Smarty.class.php'); 
$Smarty = new Smarty();
$Smarty->display('page1.tpl'); 

page1.tpl

<!doctype html>
<html lang="fr">
    <head>
        <meta charset="utf-8">
        <title>Smarty Party</title>
    </head>
    <body>
        <h1>Smarty Party</h1>
        {* ceci est un commentaire Smarty *}
    </body>
</html>

Passer une simple variable

page1.php

<?php
require_once('libs/Smarty.class.php'); 
$Smarty = new Smarty();
$Smarty->assign('welcome','Bonjour et bienvenue');
$num = 12;
$Smarty->assign('num',$num);
$Smarty->display('page1.tpl'); 

page1.tpl

<!doctype html>
<html lang="fr">
    <head>
        <meta charset="utf-8">
        <title>Smarty Party</title>
    </head>
    <body>
        <h1>Smarty Party</h1>
        <p>{$welcome}</p>
        <p>Vous êtes le {$num}ème visiteur</p>
    </body>
</html>

Passer un tableau

page1.php

<?php
require_once('libs/Smarty.class.php'); 
$Smarty = new Smarty();
$tab1 = array("Pomme","Banane");
$tab2 = array( "key1"=>"Blé", "key2"=>"Maïs" );
$Smarty->assign('fruits',$tab1);
$Smarty->assign('cereales',$tab2);
$Smarty->display('page1.tpl'); 

page1.tpl

<!doctype html>
<html lang="fr">
    <head>
        <meta charset="utf-8">
        <title>Smarty Party</title>
    </head>
    <body>
        <p>Une {$fruits[0]} est un fruit.</p>
        <p>Le {$cereales.key2} est une céréale.</p>
    </body>
</html>

Passer un objet

page1.php

<?php
require_once('libs/Smarty.class.php'); 

class Manger{
    public $fruit = "";
    public $comment = "";

    public function __construct($Fruit, $Comment){
        $this->fruit = $Fruit;
        $this->comment = $Comment;
    }
}
$MiamMiam = new Manger("kiwi", "goulument");
$Smarty = new Smarty();
$Smarty->assign("smarty_objet", $MiamMiam);

$Smarty->display('page1.tpl');

page1.tpl

<!doctype html>
<html lang="fr">
    <head>
        <meta charset="utf-8">
        <title>Smarty Party</title>
    </head>
    <body>
        <p>Je mange un {$smarty_objet->fruit} plutôt {$smarty_objet->comment}.</p>
    </body>
</html>

Passer des variables globales

pour ces exemples la page php est optionnel

get

{* http://www.example.com/index.php?var=foo *}
{$smarty.get.var}

post

{* <input type="text" name="var" /> *}
{$smarty.post.var}

cookie

{* affiche la valeur du cookie "user" *}
{$smarty.cookies.user}

serveur

{$smarty.server.SERVER_NAME}
{$smarty.server.SERVER_ADDR}
# ...

regroupement

{* affiche la variable "user" si elle existe dans  get, post, cookies, server ou env *}
{$smarty.request.user}

Les boucles

La boucle section

page1.php

<?php
require_once('libs/Smarty.class.php'); 
$Smarty = new Smarty();
$tab = array("Pierre","Paul","Jacques","Henri");
$Smarty->assign('tab_noms', $tab);
$Smarty->display('page1.tpl');

page1.tpl

<!doctype html>
<html lang="fr">
    <head>
        <meta charset="utf-8">
        <title>Smarty Party</title>
    </head>
    <body>
        <p>Section se comporte comme une boucle</p>
        <ul>
            {section name=i loop=$tab_noms}
                <li>{$tab_noms[i]}</li>
            {/section}
        </ul>
    </body>
</html>

La boucle foreach

page1.php

<?php
require_once('libs/Smarty.class.php'); 
$tab = array("Pierre"=>"dupont", "Paul"=>"durand");
$Smarty = new Smarty();
$Smarty->assign('tab',$tab);
$Smarty->display('page1.tpl'); 

page1.tpl

<!doctype html>
<html lang="fr">
    <head>
        <meta charset="utf-8">
        <title>Smarty Party</title>
    </head>
    <body>
        {foreach from=$tab key=k item=v}
            <p>{$k} {$v}</p>
        {/foreach}
    </body>
</html>

Combiner les boucles et "cycle"

La fonction native "cycle" n'est pas à proprement parler une boucle. Plutôt qu'un long discours testez le même exemple ci-dessus en modifiant juste la balise <p> comme ceci.

<p class="{cycle values='bleu,blanc,rouge'}">{$k} {$v}</p>

Les conditions

page1.php

<?php
require_once('libs/Smarty.class.php'); 
$Smarty = new Smarty();
$nom = "admin";
$Smarty->assign('nom', $nom);
$Smarty->display('page1.tpl'); 

page1.tpl

<!doctype html>
<html lang="fr">
    <head>
        <meta charset="utf-8">
        <title>Smarty Party</title>
    </head>
    <body>
        {if $nom == "admin"}
            <p>Bonjour chef!</p>
        {elseif $nom != "" && $nom != "admin"}
            <p>Bonjour {$nom}</p>
        {else}
            <p>Bonjour belle inconnue</p>
        {/if}
    </body>
</html>

Inclure un template dans un template

page1.php

<?php
require_once('libs/Smarty.class.php'); 
$Smarty = new Smarty();
$Smarty->assign('title', 'Bienvenue ici!');
$Smarty->display('page1.tpl'); 

title.tpl

<div>
    <h1>{$title}</h1>
</div>

page1.tpl

<!doctype html>
<html lang="fr">
    <head>
        <meta charset="utf-8">
        <title>Smarty Party</title>
    </head>
    <body>
        {include file="title.tpl"}
    </body>
</html>

Échapper une partie de code

l'utilisation de Javascript ou de CSS dans le corps d'un template fera planter Smarty (accolades{})

On échapera une portion de code grâce aux balises {LITERAL}{/LITERAL}

<!doctype html>
<html lang="fr">
    <head>
        <meta charset="utf-8">
        <title>Smarty Party</title>
    </head>
    <body>
        {LITERAL}
            <script language="JavaScript" type="text/javascript">
                function not () { }
            </script>
        {/LITERAL}
    </body>
</html>

Utiliser le cache

Pour que Smarty puisse mettre certaines pages en cache il faudra au préalable créer un répertoire "cache" ayant les droits en écriture au même niveau que la page PHP. Si l'on souhaite placer ce répertoire à un autre endroit il faudra l'indiquer grâce à la variable $cache_dir.

page1.php

<?php
require_once('libs/Smarty.class.php'); 
$Smarty = new Smarty();
$Smarty->caching = 2;
$Smarty->cache_lifetime = 30;
$Smarty->assign('welcome','Bonjour et bienvenue a tous');
$Smarty->display('page1.tpl'); 

On active le cache grâce à $Smarty->caching. Cet attribut peut prendre les valeurs 1 ou 2. 1 est la valeur par défaut soit 1h de cache et 2 permet de donner une valeur choisie ce qui implique d'utiliser $Smarty->cache_lifetime avec une valeur en seconde.

page1.tpl

<!doctype html>
<html lang="fr">
    <head>
        <meta charset="utf-8">
        <title>Smarty Party</title>
    </head>
    <body>
        {$welcome}
    </body>
</html>

Je vous invite à consulter cette page pour plus de subtilité à propos du cache.

Créer ses propre plugins

Si vous jetez un coup d'œil dans le répertoire "libs" vous verrez également un répertoire "plugins". Celui-ci contient toutes les fonctions et modificateurs natifs de Smarty. Il est conseillé de ne pas créer ses propres plugins dans ce répertoire car en cas de mise à jours ceux ci risquent d'être effacés. Je vous invite donc à créer un nouveau répertoire au même niveau que le répertoire "libs" que nous appèlerons "user_plugins".
Pour que Smarty puisse en tenir compte il convient de lui indiquer le chemin depuis la page1.php

<?php
require_once('libs/Smarty.class.php'); 
$Smarty = new Smarty();
$Smarty->addPluginsDir('user_plugins/'); 

Syntaxe des noms de fichiers<=>fonctions

Indiquer l'emplacement du répertoire ne suffit pas, il faut également respecter une convention d'écriture propre à Smarty. Dans l'exemple suivant nous allons créer un modificateur qui supprimera de l'affichage les chaînes de caractères ayant une extension (photo.jpg, fichier.txt, ...). Nous allons appeler ce nouveau plugin "removext". Sachant cela notre fichier s'appellera alors obligatoirement "modifier.removext.php" et la première fonction de ce fichier s'appellera alors obligatoirement ainsi:

<?php
    function smarty_modifier_removext($string) {
        //code de la fonction
    }

On n'utilise jamais "echo" dans les plugins.

Créer un nouveau modificateur

Comme dit plus haut, pour cette exemple nous allons créer un modificateur visant à retirer l'extension d'une chaîne de caractères. Ainsi si nous passons à Smarty une variable "vacances à Tokyo.jpg", il devra afficher "vacances à Tokyo".

modifier.removext.php

<?php
    function smarty_modifier_removext($string) {
        if(strrpos($string, ".")===false) return $string;
        else return substr($string, 0, strrpos($string, "."));
    }

page1.php

<?php
require_once('libs/Smarty.class.php'); 
$Smarty = new Smarty();
$Smarty->addPluginsDir('user_plugins/'); 
$Smarty->assign('chaine', "Photos de vacances.jpg");
$Smarty->display('page1.tpl');

page1.tpl

<!doctype html>
<html lang="fr">
    <head>
        <meta charset="utf-8">
        <title>Smarty Party</title>
    </head>
    <body>
        {$chaine|removext}
    </body>
</html>

Modes de débogage

Affiche des popups de débogage

<?php
require_once('libs/Smarty.class.php'); 
$Smarty = new Smarty();
$Smarty->debugging = true;

Affiche les popups de débogage à la demande. La commande est appelée si une variable SMARTY_DEBUG est passée par la barre d'adresse (www.domaine.com/page1.php?SMARTY_DEBUG).

<?php
require_once('libs/Smarty.class.php'); 
$Smarty = new Smarty();
$Smarty->debugging_ctrl= 'URL';

Demander le débogage par popup directement depuis le template

        # ...
        {debug}
    </body>
</html>

Afficher la console de débogage dans la page du template

        # ...
        {debug output="html"}
    </body>
</html>

Cette dernière ne fonctionne pas chez moi

Liens

Tuto Developpez.com
Tuto Site du zero
Variables Smarty Prestashop

^