Comme j'imagine que tu as fait ça par jeu pédagogique (les systèmes de templates sont déjà tellement nombreux qu'il est inutile d'en faire de nouveau), je vais te présenter une méthode de template qu'on oublie beaucoup trop souvent : PHP.
Pas besoin d'aller bien loin pour faire un moteur de template, PHP en est déjà un lui-même. Donc include() fera un très bon analyseur de template

Pour faire «propre», ou plutôt pour s'assurer de ne pas mélanger les contextes d'exécution, on va faire un «wrappeur» de l'include sous forme d'objet, qui ne transmettra au fichier inclus que les variables que l'on aura définies (à coups de set())..
L'exercice n'est pas mauvais pour faire de l'héritage, manipuler les fonctions magiques, et autres joyeusetés de l'objet PHP5.
BasicTemplateclass BasicTemplate {
private $__vars = array();
function __construct() {
}
function __set($varname, $value)
{
$this->__vars[$varname] = $value;
}
function __get($varname)
{
return $this->__vars[$varname];
}
function render($filename, $output = null)
{
if ($output !== null) {
ob_start();
}
include $filename;
if ($output !== null) {
$contents = ob_get_contents();
ob_end_clean();
}
}
}
Exemple de template :
Code : Tout sélectionner
Mon nom est : <?php echo $nom; ?>.
Mes passions : <?php foreach ($passions as $passion): ?>
- <?php echo $passion; ?><?php endforeach; ?>
Le code qui va avec :
$tpl = new BasicTemplate;
$tpl->nom = 'Jacques';
$tpl->passions = array('Bière', 'Vaches', 'Pouvoir');
$tpl->render('test.tpl');
On peut bien sûr ajouter la mise en cache et la compression gzip en étendant la classe pour ajouter les 2-3 fonctions qui feront ça, et en surchargeant render().
Ensuite tu peux définir un autre langage de template en étendant à nouveau ta classe, et tu feras la conversion dans ta fonction render() à nouveau surchargée.
Un bon exercice

Comme j'imagine que tu as fait ça par jeu pédagogique (les systèmes de templates sont déjà tellement nombreux qu'il est inutile d'en faire de nouveau), je vais te présenter une méthode de template qu'on oublie beaucoup trop souvent : PHP.
Pas besoin d'aller bien loin pour faire un moteur de template, PHP en est déjà un lui-même. Donc include() fera un très bon analyseur de template :lol: Pour faire «propre», ou plutôt pour s'assurer de ne pas mélanger les contextes d'exécution, on va faire un «wrappeur» de l'include sous forme d'objet, qui ne transmettra au fichier inclus que les variables que l'on aura définies (à coups de set())..
L'exercice n'est pas mauvais pour faire de l'héritage, manipuler les fonctions magiques, et autres joyeusetés de l'objet PHP5.
[b]BasicTemplate[/b][php]class BasicTemplate {
private $__vars = array();
function __construct() {
}
function __set($varname, $value)
{
$this->__vars[$varname] = $value;
}
function __get($varname)
{
return $this->__vars[$varname];
}
function render($filename, $output = null)
{
if ($output !== null) {
ob_start();
}
include $filename;
if ($output !== null) {
$contents = ob_get_contents();
ob_end_clean();
}
}
}[/php]
Exemple de template :[code]Mon nom est : <?php echo $nom; ?>.
Mes passions : <?php foreach ($passions as $passion): ?>
- <?php echo $passion; ?><?php endforeach; ?>[/code]
Le code qui va avec :[php]$tpl = new BasicTemplate;
$tpl->nom = 'Jacques';
$tpl->passions = array('Bière', 'Vaches', 'Pouvoir');
$tpl->render('test.tpl');[/php]
On peut bien sûr ajouter la mise en cache et la compression gzip en étendant la classe pour ajouter les 2-3 fonctions qui feront ça, et en surchargeant render().
Ensuite tu peux définir un autre langage de template en étendant à nouveau ta classe, et tu feras la conversion dans ta fonction render() à nouveau surchargée.
Un bon exercice :)