Poster une réponse  Créer un sujet 
Les moteurs de template
Auteur Message
CrazyCat
Administrator
*******


Messages : 130
Groupe : Administrateurs
Inscription : Feb 2007
Statut : Absent
Réputation : 0
Message : #1
Les moteurs de template

Vous en avez surement déjà entendu parlé mais vous ne savez pas ce que ça représente "en vrai"... et pourtant, si vous avez un blog, un forum ou n'importe quel CMS (Content Management System), vous en utilisez un.

Le principe est très simple, il s'agit de complètement séparer le traitement de l'affichage, et cela est réalisé très simplement une fois que l'on connait les bases du système.

Les bases
La séparation entre les différentes parties est réellement physique, c'est à dire que nous allons avoir:
1. La page "template" qui contient la structure visible de votre page. C'est quasimment un fichier html à un détail près: il contient des éléments (variables) qui seront remplacés lors de son utilisation.
Pour des raisons pratiques, on leur donne souvent une extension .tpl (comme TemPLate) mais on pourrait aussi bien les appeler .html ou .php, voire .abc.
Très souvent, on préfère aussi mettre les noms de variables entre accolades (par exemple {montitre}) que de "vrais" variables php (comme $montitre) car ça offre un peu plus de souplesse comme on le verra plus tard.
2. La page "traitement" qui va générer le contenu des variables utilisées dans le template. Elle peut contenir tout votre traitement, faire appel à d'autres éléments, la seule chose qui importe est qu'elle remplisse correctement les variables.
3. La page "moteur". C'est elle qui va permettre de faire le lien entre les deux précédentes pages en appelant correctement la page traitement puis en appelant la page template et en effectuant le remplacement des données.

Création
Nous allons faire un tout petit système pour afficher quelque chose de très basique: un "Hello world" personnalisé.
Ce système affichera "Hello world" en temps normal, mais contiendra un formulaire que l'internaute pourra remplir. Si le formulaire est posté, la page affichera "Hello {pseudonyme}" et le formulaire ne sera plus affiché.
1. Le template:

Code HTML :
<html>
<head>
   <title>Page de test</title>
</head>
<body>
<h2>Hello {visiteur}</h2>
{formulaire}
</body>
</html>

2. Le traitement interne:
Cette page va donc initialiser les variables visiteur et formulaire en fonction de ce qu'elle reçoit.
Code PHP :
<?
// On récupère le pseudonyme
$pseudonyme = trim($_POST['pseudonyme']);
if (empty($pseudonyme)) {
   // Cas où le pseudonyme est vide
   $visiteur = "World";
   $formulaire = "<form name=\"envoi\" method=\"post\">\n";
   $formulaire .= "<input type=\"text\" name=\"pseudonyme\" />\n";
   $formulaire .= "<input type=\"submit\" value=\"Je personnalise\" />\n";
   $formulaire .= "</form>\n";
} else {
   $visiteur = stripslashes($pseudonyme);
   $formulaire = "";
}
?>

3. Le moteur:
Il va donc faire un appel aux différents fichiers pour générer l'affichage. Pour cela, on utilise fréquemment la fonction preg_replace (ou preg_replace_callback) qui permet d'utiliser une expression régulière (un "masque" générique) et de remplacer les chaines correspondantes par d'autres chaines. De plus, on peut forcer l'évaluation d'une chaine, c'est à dire que si l'on remplace une chaine par une autre qui est une variable, on affichera le contenu de la variable et non son nom.
Code PHP :
<?
// Tout d'abord, nous allons appeler notre fichier de traitement
include_once "traitement.php";
// Nous avons donc nos deux variables de remplies

// Nous allons charger le template dans une variable
$template = file_get_contents("page.tpl");

// Et maintenant, le traitement
echo preg_replace('!{([^}])}!e', "'\$$1'", $template);
?>


Fonctionnement
Comme vous pouvez le constater, tout est fait par une simple expression régulière que nous allons détailler.

Code :
!{([^}])}!e

Ceci se découpe en 2 parties: le masque proprement dit contenu entre les "!" et les options de recherche qui sont à la fin.
Le masque signifie que nous allons rechercher toute suite de caractère (sauf le "}") qui est contenue entre "{" et "}".
L'utilisation des parenthèses nous permet de signaler que c'est la partie que nous voulons réutiliser.
L'option de recherche "e" est celle qui va forcer l'interprétation du remplacement comme étant du php et non pas du simple texte, ce que nous allons comprendre par la suite.

Code :
'\$$1'

Lorsqu'on travaille avec des expressions régulières, on utilise fréquemment les références arrières, qui en fait représentent les ensembles de parenthèses présent dans notre masque de recherche. Dans notre cas, cela signifie que $1 contiendra toute suite de caractère (sauf le "}") qui est contenue entre "{" et "}".
Le \$ placé avant signifie que nous allons préfixer cette chaîne d'un $ (le caractère \ servant à "échapper" le $, sans quoi il pourrait être interprété).
Cela veut donc dire que la chaîne de remplacement sera composée à un moment de '$visiteur' (sous forme de texte), or l'option de recherche "e" signifie que le remplacement doit être interprété comme du php. Donc nous allons afficher la variable $visiteur(et la variable $formulaire) là oùù nous avions initialement {visiteur} et {formulaire}.

Notre système fonctionne donc.


L'erreur est humaine, mais il faut un ordinateur pour provoquer une catastrophe
15/02/2007 10:33
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
CrazyCat
Administrator
*******


Messages : 130
Groupe : Administrateurs
Inscription : Feb 2007
Statut : Absent
Réputation : 0
Message : #2
RE: Les moteurs de template

On m'a rapporté que la regexp donnée ici fonctionnait mal.
Ce n'est pas la regexp mais les drapeaux (flags) qui ne sont pas bons, utilisez plutôt:

Code PHP :
echo preg_replace('!{([^}])}!Ue', "'\$$1'", $template);


Le U permet de rendre l'expression moins gourmande, c'est à dire qu'elle prendra la plus petite expression qui satisfait le masque de recherche.


L'erreur est humaine, mais il faut un ordinateur pour provoquer une catastrophe

Ce message a été modifié le: 15/10/2007 08:23 par CrazyCat.

15/10/2007 08:18
Visiter le site internet de cet utilisateur Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Poster une réponse  Créer un sujet 

Voir une version imprimable
Envoyer ce sujet à un ami
S'abonner au sujet | Ajouter le sujet aux favoris

Aller à :