Moteur de Template et PHP

by dinosaure

L’article a déjà été fait mais cela n’a pas marqué les gens. En effet, le moteur de Template est inutile en PHP ! Il est vrai que c’est pratique, que c’est cool comme truc, pour l’intégrateur qui sait à peine utiliser le langage de balisage HTML, c’est pratique de pouvoir mettre en place un moteur de Template pour que lui est ses doigts douteux ne touche pas une seul ligne de code. Seulement, vous vous y prenez mal cher développeur et ce n’est pas en utilisant un moteur de Template que vous vous aiderez, que vous aiderez à la maintenance de votre site et que vous aiderez l’intégrateur HTML. Maintenant, expliquons pourquoi c’est inutile d’utiliser un moteur de Template.

Un moteur de Template permet de séparer la logique applicative de la présentation (typique de l’architecture MVC). Avant, on écrivait le code PHP directement dans la page HTML. Cependant, au fur et à mesure, on a découvert que cela devenait de plus en plus illisible. Il fallait trouver une solution et ce fût le moteur de Template. Une application PHP qui permet de faire le lien entre nos programmes et la présentation. C’est bien, ça marche ! Notre développement dépendait donc de ce moteur qui est à la limite intrusif. Cependant, comprendre la logique de cette application n’était pas dans nos objectifs et du moment que cela fonctionnait, c’était cool. Et pourtant, regarder de plus près son fonctionnement est très intéressant !

Un moteur de Template, c’est d’abord une application qui impose son langage qui permet de gérer l’affichage. On retrouve notamment ceci: {ma_variable}. Connaissez vous ce langage ? Moi pas … On constate que ce langage est propre au moteur de Template, c’est à dire que dès que vous voudriez changer de moteur de Template, vous devrez certainement changer vos fichier *.tpl (il y a même des extensions pour ça, tqvu). Il faut aussi comprendre que ce langage n’est pas reconnue par le serveur, alors comment le moteur affiche le contenu de ma_variable dans le fichier HTML ? C’est la magie des str_replace et preg_replace. Et oui, le moteur de Template utilise d’une façon prédominante ces fonctions. Alors, comme ça, c’est rien mais concrètement, le temps d’exécution de vos scripts peut être multiplier par 5. Autant revenir à notre code illisible dans le document HTML, c’est plus rapide …

Néanmoins, les moteurs l’ont bien compris, l’optimisation. Ils ont donc insérer nativement un système de cache pour que le temps d’exécution puisse devenir faible. Ça marche, c’est toujours cool.

Alors que doit t’on faire ? Ne plus utiliser les moteurs de Template, revenir à un code illisible ? Non, il suffit de dire une vérité qui va vous ouvrir les yeux: le PHP est déjà un moteur de Template. Vous utilisiez donc une imbrication de moteurs de Template quand vous utilisez Smarty par exemple et ceci est le cause de la dégradation de vitesse d’exécution de vos scripts.

Autant vous dire qu’avec un peu de logique et 2 fonctions, on peut très vite comprendre que PHP est déjà un moteur de Template. Êtes vous sérieux quand vous dites qu’il est moins compliqué d’écrire ceci: {ma_variable} que cela: <?php echo $ma_variable; ?> ? Il n’y a pas de réel différence et il suffit d’un mot pour changer nos habitudes: la tamporisation ! PHP nous mets déjà à disposition des fonctions pour traiter l’affichage de façon isolé par rapport à l’application, c’est notamment grâce à la fonction extract(). Vous pouvez regarder ce code PHP qui présente le fonctionnement global d’un moteur de Template intelligent:

<?php

class template
{
    private $attributs = array();
    private $properties = array();

    public function __construct( $file ) 
    { 
        $this->attributs['file'] = $file;

        if( file_exists( $file.'.cache' ) )
        {
            echo 'cache';
            echo file_get_contents( $file.'.cache' );
            die();
        }
    }

    public function assign( $property, $value )
    {
        $this->properties[ $property ] = $value;
    }
    public function parse()
    {
        extract( $this->properties );

        ob_start();

        require $this->attributs['file'];

        $result = ob_get_contents();

        ob_end_clean();

        file_put_contents( $this->attributs['file'].'.cache',
                           $result );

        return $result;
    }
}

?>

Voici la partie applicative:

<?php
    require 'template.class.php';

    $tpl = new template( 'index.tpl' );

    $tpl->assign( 'title', 'Le Titre du Document' );
    $tpl->assign( 'content', 'Le Contenu du Document' );

    $tpl->assign( 'tableau', array( 'test 1' => 'result 1',
                                    'test 2' => 'result 2',
                                    'test 3' => 'result 3' ) );

    echo $tpl->parse();
?>

Et le fichier TPL:

<h1><?php echo $title ?></h1>

<p><?php echo $content; ?></p>

<ul>
    <?php foreach( $tableau as $key => $value ) { ?>

    <li><?php echo $key; ?> | <?php echo $value; ?></li>

    <?php } ?>
</ul>

Il n’y a rien de bien complexe pour l’intégrateur HTML et par rapport à un moteur de Template comme Smarty je vous conseille vivement celui-ci qui est déjà plus rapide. Ce moteur intègre déjà un système de cache et même si la syntaxe dans le fichier TPL est toujours celle de PHP, elle n’est pas moins complexe que celle que utilise les moteurs de Template. En espérant que cette article vous a ouvert les yeux en ce qui concerne les moteurs de Template. En conclusion, on peut dire que le moteur de Template ce ressent quand l’intégrateur HTML a des problèmes avec le PHP, mais le véritablement problème ne serait pas la médiocrité de votre intégrateur HTML ?