Introduction
Pourquoi encore un nouveau moteur de modèle ?
Pour les besoins de la nouvelle version du gestionnaire de fichiers en ligne Hyla, j'ai cherché des solutions pour remplacer le veillissant moteur de template (de gabarit ou de modèle en bon français) de la PhpLib qui lui à rendu, tout de même, de bons services et ce, depuis les toutes premières versions de Hyla...
Le moteur de la PhpLib dispose de nombreux avantages, simplicité des modèles : pas de code (foreach, if, etc...) respectant ainsi la logique qui veut que les graphistes ne touchent pas une brindille de code, les blocs sont en fait des commentaires, ils apparaissent donc cachés aux graphistes travaillant sur le modèle.
Mais ce moteur de template souffre de 2 grosses lacunes :
- Sa complexité de mise en oeuvre du côté php, on arrive très vite à du code relativement lourd : il est très verbeux.
- Plus aucun support depuis bien longtemps, il lui manque donc des fonctionnalités qui sont, pourtant, devenues courantes.
Mais pourquoi réécrire un nouveau moteur de modèle alors qu'il en existe beaucoup qui fonctionnent parfaitement bien ?
- Je souhaite garder un maximum de compatibilité avec les modèles existants déjà dans Hyla
- Aucun des moteurs de gabarits que j'ai vu ne me convient, en général, ils sont beaucoup trop lourd pour ce qu'Hyla en fera.
En gros, garder la simplicité de la vue avec quelques nouveautés et améliorer le contrôleur.
RemonterLa syntaxe
La syntaxe est relativement simple, pour les variables, on utilise les accolades {}, à cela, vient s'ajouter 4 opérateurs :
- {$mavariable} : Défini la variable nommée « mavariable », Chapitre sur les variables
- {_myvariable} : Défini une chaine de traduction, Chapitre sur la traduction
- {&mavariable:Cette valeur} : Permet de donner une valeur à une variable, Chapitre sur la modification de variables dans la vue
- {#Mon commentaire} : Défini un commentaire
Concernant les blocs, leur utilisation est elle aussi très simple, voici un exemple basique :
<!-- BEGIN monbloc -->
<strong>Coucou</strong>
<!-- END monbloc -->
Plus d'informations sur l'utilisation des blocs.
RemonterLes différences avec la PhpLib
Pour quelqu'un ayant utilisé le moteur de template de la PhpLib, il sera aisé de migré vers Hyla Tpl, en effet, les même concepts sont repris avec quelques nouveautés et un énorme gain en terme de vitesse et de simplicité d'utilisation.
Voici la liste des nouveautés face à la PhpLib :
- Gain de performance
- Concept de variables par défaut
- Modification de variable depuis la vue
- Appel de fonction pour les variables
- Méthode de traduction intégrée
- Bloc else
- Importation de fichier depuis la vue
- Appel de fonctions
- Déclaration des blocs au préalable inutile
Voici un comparatif de code affichant plusieurs lignes d'un tableau, l'un étant écrit avec le moteur de la PhpLib, l'autre avec celui de Hyla Tpl.
Moteur de la PhpLib
<?php
require_once 'phplib/template.inc';
$t = new Template('.');
$t->set_file('tpl', 'phplib.tpl');
$t->set_block('tpl', 'table.line.1', 'Tbloc1');
$t->set_block('tpl', 'table.line.2', 'Tbloc2');
$t->set_block('tpl', 'table.line', 'Tbloc');
$t->set_block('tpl', 'table', 'Table');
for ($o = 0; $o < 100; $o++) {
$t->set_var('Tbloc');
for ($i = 0; $i < 10; $i++) {
$t->set_var('Tbloc1');
$t->set_var('Tbloc2');
$t->set_var(array('NAME' => 'toto' . $o, 'AGE' => $i) );
if ($i % 2) {
$t->parse('Tbloc1', 'table.line.1', true);
} else {
$t->parse('Tbloc2', 'table.line.2', true);
}
$t->parse('Tbloc', 'table.line', true);
}
$t->parse('Table', 'table', true);
}
echo $t->parse('out', 'tpl');
?>
<h1>Essai tpl</h1>
<!-- BEGIN table -->
<table>
<tr>
<th>Name</th>
<th>Age</th>
</tr>
<!-- BEGIN table.line -->
<!-- BEGIN table.line.1 -->
<tr style="background-color: #CCC;">
<td>
<strong>{NAME}</strong>
</td>
<td>
<em>{AGE}</em>
</td>
</tr>
<!-- END table.line.1 -->
<!-- BEGIN table.line.2 -->
<tr style="background-color: #EEE;">
<td>
<strong>{NAME}</strong>
</td>
<td>
<em>{AGE}</em>
</td>
</tr>
<!-- END table.line.2 -->
<!-- END table.line -->
</table>
<!-- END table -->
Moteur Hyla Tpl
Voici le code php faisant fonctionner Hyla Tpl, comme vous pouvez le voir, il n'y a aucune déclaration des blocs, on gagne en
lisibilité.
De plus, il est inutile d'appeler les blocs à chaque itération afin de les vider.
<?php
require_once 'hyla_tpl.class.php';
$t = new Tpl('.');
$t->importFile('hyla.0.tpl');
for ($o = 0; $o < 100; $o++) {
for ($i = 0; $i < 10; $i++) {
$t->setVar(array('NAME' => 'toto' . $o, 'AGE' => $i};
if ($i % 2) {
$t->render('table.line.1');
}
$t->render('table.line');
}
$t->render('table');
}
echo $t->render();
?>
Le bloc ELSE est utilisé dans cet exemple.
<h1>Essai tpl</h1>
<!-- BEGIN table -->
<table>
<tr>
<th>Name</th>
<th>Age</th>
</tr>
<!-- BEGIN table.line -->
<!-- BEGIN table.line.1 -->
<tr style="background-color: #CCC;">
<td>
<strong>{$NAME}</strong>
</td>
<td>
<em>{$AGE}</em>
</td>
</tr>
<!-- ELSE table.line.1 -->
<tr style="background-color: #EEE;">
<td>
<strong>{$NAME}</strong>
</td>
<td>
<em>{$AGE}</em>
</td>
</tr>
<!-- END table.line.1 -->
<!-- END table.line -->
</table>
<!-- END table -->
Performances
Voici un comparatif de vitesse entre Hyla Tpl et le moteur de template de la PhpLib, j'ai également rajouté un comparatif avec du code Php brut servant de référence.
Pour réaliser ce test de comparaison de performance, j'ai créé 3 fichiers Php contenant du code générant un tableau de
500 lignes.
J'ai ensuite créé un fichier Php (runtest.php) qui appelle ces 3 bouts de code en chronométrant leur vitesse de rendu, ce dernier
est alors appelé plusieurs fois, je fais une moyenne des résultats et j'obtiens un classement.
Voici les moyennes des temps d'exécution de chaque script :
| Php | Hyla Tpl | PhpLib |
|---|---|---|
| 0.05 sec | 0.8 sec | 15 secondes |
Sous forme de graphe (le meilleur est le plus petit) :
Le temps d'exécution du script Php étant tellement faible que j'ai dû tricher un peu afin qu'il apparaisse sur le graphique, les 2 autres temps sont à l'échelle.
La conclusion est sans appel, Hyla Tpl est bien plus rapide que le moteur de template de la PhpLib réputé lui même, comme étant le plus rapide des moteurs de template non compilé.
Note : Bien entendu, aucun système de cache n'a été utilisé pour ces tests.
Remonter