Developpez.com - PHP
X

Choisissez d'abord la catégorieensuite la rubrique :


Débuter avec Smarty

Date de publication : 13/01/2006 , Date de mise à jour : 13/01/2006

Par siddh
 

Smarty est un moteur de template pour PHP, il permet de dissocier la partie "code" de la représentation des données (affichage).
Smarty permet énormément de choses ce qui fait qu'il n'est pas toujours facile à prendre en main.
Mais après l'avoir essayé, vous ne pourrez plus vous en passer.


I. Introduction
II. Installation
III. Comment utiliser les templates ?

Fr Cet article en pdf   FTP HTTP Fr Le zip avec les sources   FTP HTTP

I. Introduction

Pourquoi séparer le code et la présentation ?
Il y a plusieurs raisons, voici les principales :

  • Les développeurs et les "designers" peuvent travailler chacun de leur côté sans se marcher dessus.
  • Les pages php ne contiennent que du php.
  • Si on doit modifier le code ou l'affichage, on a pas forcément besoin de modifier l'autre partie.
De plus c'est une tendance aujourd'hui de bien tout compartimenter, par exemple, le XHTML vous permet décrire des données et ensuite vous les présentez avec des CSS.
C'est un gage d'évolutivité, de modularité et ça vous permet aussi une maintenance plus rapide et efficace.

Smarty est diffusé sous licence en LGPL et fait partie du projet fr PHP.
Il existe bien entendu fr d'autres moteurs de templates pour PHP.
Son apprentissage est certainement plus dur que certains autres mais Smarty est l'un des plus performants et l'un des plus utilisés dans les développements professionnels. Ses points forts :

  • Compilation des templates, Smarty transforme votre template en code PHP, cela a pour effet que l'execution sera plus rapide
  • Mise en cache des templates pour des performances encores accrues.
  • Il ne recompile que ce qui à été modifié.
  • On peut stocker ses templates dans différents endroits.
  • Le cache peut être géré par le développeur.
  • Il est extensible très facilement.
Ses points faibles :

  • Il permet tellement de choses que son utilisation peut être complexe
  • Il est necesaire d'apprendre son langage de template.
Nous verrons donc comment l'installer, le configurer et bien sûr comment l'utiliser.


II. Installation

Smarty nécessite un serveur Web utilisant PHP 4.0.6 ou supérieur.
Il faut donc le télécharger. Ensuite vous le décompressez dans un répertoire de votre serveur web.
Tout ce qu'il y a dans l'archive n'est pas nécessaire pour utiliser Smarty. En effet, pour fonctionner correctement, seul le répertoire "libs" est indispensable.
Ne modifiez rien se trouvant dans ce répertoire !
Si vous avez un fichier index.php à coté duquel vous avez votre répertoire "Smarty", il vous faudra faire :
<?php
	require_once("./Smarty/libs/Smarty.class.php");
	$smarty = new Smarty();
?>
Là vous avez votre objet Smarty qui est presque prêt à être utilisé.
Il ne nous reste plus qu'à lui indiqué quels vont être ses répertoires de travail.

Pour fonctionner, Smarty a besoin de 4 répertoires :

  • templates
  • templates_c
  • configs
  • cache
Vous pouvez mettre les 3 derniers dans le premier.
Il faudra donner les droits d'écriture à votre serveur web pour les répertoires templates_c et cache.
Pour définir leur emplacement :
<?php
	require_once("./Smarty/libs/Smarty.class.php");
	$smarty = new Smarty();
	$smarty->template_dir	= './templates/';
	$smarty->compile_dir	= './templates/templates_c/';
	$smarty->config_dir	= './templates/configs/';
	$smarty->cache_dir	= './templates/cache/';
?>
Le plus simple est de mettre ce code dans un fichier "Smarty.inc" que l'on incluera dans les autres pages PHP.

Une fois tout cela fait, nous allons donc nous retrouver avec une structure comme celle là :
repertoire de notre application
|__ Smarty
|	|___libs
|
|__ templates
|   |___cache
|   |___config
|   |___templates_c
|
|__ Smarty.inc
Nous allons déjà tester si notre installation est bien faîte.
Pour cela, il faut faire un template que nous appelerons par exemple "testInstall.tpl".
Il devra se trouver dans le répertoire "templates".
testInstall.tpl
<html>
	<head>
		<title> mon titre </title>
	</head>
	<body>
		<h1>Bonjour {$nom}</h1>
	</body>
</html>
Nous verrons plus tard ce qu'est un template mais vous pouvez déja constater que c'est une page HTML contenant des variables.

Il nous faut aussi un fichier PHP qui va utiliser ce template :
testInstall.php
<?php
	require_once("./Smarty.inc");
	$smarty->assign("nom","votre prénom");
	$smarty->display("testInstall.tpl");
?>
Il ne vous reste plus qu'a appeler cette page dans votre navigateur.



III. Comment utiliser les templates ?

Comme nous l'avons aperçu dans l'installation de Smarty, un template est une page HTML qui va contenir aussi les variables que l'on veut affecter depuis PHP.
De cette manière, il est donc très facile de faire faire les templates aux graphistes/designers puisqu'ils n'auront pas de code PHP à mettre dedans.
Un template peut en inclure d'autres.
Cela permet par entre autre d'avoir tout le temps les mêmes information en entête et en pied de page.

Nous allons d'ailleurs mettre en place un système de "pseudos frames" pour la suite de cet article.
Le but de cet article étant de voir l'utilisation de Smarty, je ne m'attarderais pas sur des considérations telles que "Comment sécuriser ses pseudos frames".

Le principe :
Une page (index.php) qui va centraliser les demandes de l'utilisateur et afficher ce qu'il demande.

Cela nécessite que tous les liens ou actions de nos pages pointent vers index.php en lui passant en paramètre l'action à effectuer.
Exemple de lien
<a href="index.php?todo=bonjour">Dire bonjour</a>
Pour un formulaire
<form method="post" action="index.php?todo=enregistrer">
.....
</form>
Structure du fichier index.php
<?php
	require_once("./Smarty.inc");

	/**
	* Ici, si il n'y à pas d'action de précisée, 
	* on définit "bonjour" comme étant l'action par défaut.
	*/
	$todo = isset($_GET["todo"]) ? $_GET["todo"] : "bonjour";

	/**
	* Maintenant on va tester l'action à effectuer
	* et agir en conséquence :
	*/
	switch($todo){
		case "bonjour":
			// Action a effectuer
			break;
		case "enregistrer":
			// Action a effectuer
			break;
		default:
			// Action a effectuer
			break;
	}
?>
Au niveau de nos templates, on va aussi faire des séparations :

  • un template pour l'entête
  • un pour le pied de page
Cela permettra d'avoir des pages uniformes et surtout, grace à ça, il suffira par exemple de ne modifier qu'un seul fichier pour rajouter une feuille de style à toutes nos pages.
header.tpl
<html>
	<head>
		<title>{$titre}</title>
	</head>
	<body>
footer.tpl
		<div>Eventuellement des informations comme le copyright ....</div>
	</body>
</html>
Ensuite, tous les autres templates auront cette structure :
Base pour les autres templates
{include file="header.tpl"}
<!-- ici on se trouve entre les balises body de notre page -->
{include file="footer.tpl"}
Vous avez pu voir dans l'installation de Smarty que pour affecter une valeur à une variable, on utilise la fonction "assign" et que pour afficher un template, il suffit d'appeler "display" en lui passant le nom du template.
Voici donc à quoi pourrais ressembler nos pages si l'on voulait au préalable demander son nom à l'utilisateur :
index.php
<?php
	require_once("./Smarty.inc");

	/**
	* Ici, si il n'y à pas d'action de précisée, 
	* on définit "demander" comme étant l'action par défaut.
	*/
	$todo = isset($_GET["todo"]) ? $_GET["todo"] : "demander";

	/**
	* Maintenant on va tester l'action à effectuer
	* et agir en conséquence :
	*/
	switch($todo){
		case "demander":
			$smarty->assign("titre","Demander le nom");
			$smarty->display("demander.tpl");
			break;
		case "bonjour":
			$smarty->assign("titre","Dire bonjour");
			$nom = isset($_POST["nom"]) ? $_POST["nom"] : "inconnu";
			$smarty->assign("nom",$nom);
			$smarty->display("bonjour.tpl");
			break;
		default:
			$smarty->assign("titre","Action inconnue");
			$smarty->assign("action",$todo);
			$smarty->display("error.tpl");
			break;
	}
?>
demander.tpl
{include file="header.tpl"}
	<form method="post" action="index.php?todo=bonjour">
		<label for="nom">Votre nom : </label>
		<input type="text" name="nom" id="nom" />
		<input type="submit" value="valider" />
	</form>
{include file="footer.tpl"}
bonjour.tpl
{include file="header.tpl"}
	<h1>Bonjour {$nom}</h1>
{include file="footer.tpl"}
error.tpl
{include file="header.tpl"}
	<h1>Bonjour, l'action {$action} n'existe pas.</h1>
	<a href="index.php">retour</a>
{include file="footer.tpl"}
J'ai rajouté une action par défaut dans le switch qui permettra de rediriger vers une page d'erreur les personnes qui voudraient essayer des actions qui n'existent pas.




Valid XHTML 1.1!Valid CSS!

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2006 siddh. 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.

Contacter le responsable de la rubrique PHP