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.
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>
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>
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>
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>
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}
page1.tpl
{$welcome|var_dump}
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>
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>
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>
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>
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>
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>
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.
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/');
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.
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>
Afficher la valeur des variables
{$welcome|var_dump}
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
Smarty.net
Tuto Developpez.com
Tuto Site du zero
Variables Smarty Prestashop