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:
<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.
<?
// 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.
<?
// 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.
!{([^}])}!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.
'\$$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.