Hyla Tpl
#tpl #template #phplib

Version actuelle
0.7.0

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 :

  1. Sa complexité de mise en oeuvre du côté php, on arrive très vite à du code relativement lourd : il est très verbeux.
  2. 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 ?

  1. Je souhaite garder un maximum de compatibilité avec les modèles existants déjà dans Hyla
  2. 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.

Remonter

La syntaxe

La syntaxe est relativement simple, pour les variables, on utilise les accolades {}, à cela, vient s'ajouter 4 opérateurs :

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.

Remonter

Les 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 :

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) :

Comparatif de Php / Hyla Tpl et PhpLib

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
Logo Hyla Tpl, une rainette Valid XHTML 1.0! Valid CSS!