Accueil » Tutoriaux » PHP / SQL » Le moteur de templates de phpBB
Le moteur de templates de phpBB

Introduction

Il existe des alternatives aux moteurs de templates assez contraignant tel que Smarty ou encore Savant. Ces moteurs étant assez pénible à prendre en mains, principalement à cause d'un nouveau langage à apprendre pour Smarty ou d'une structure pour Savant, il n'est pas tout le temps nécessaire d'utiliser de tels outils pour de petites applications, ou des applications n'ayant pas énormement de templates.

Voilà donc pourquoi j'ai décidé de vous parler de ce moteur, celui qui est, comme vous vous en étiez douté, le moteur utilisé dans le forum phpBB.

Le code PHP

Le principe du template est de séparer le contenu de la forme, mais je ne m'attarderais pas plus que ça sur la définition de template.
Si vous ne connaissez pas ce terme, je vous renvois sur wikipedia. Pour pouvoir utiliser ce moteur, téléchargez tout d'abord ce fichier. Dans toute les pages où vous souhaiterez utiliser les templates, vous devrez inclure ce fichier :

include_once 'template.php';

Pour mieux vous expliquer, rien ne vaut du code :

<?php
// inclusion du fichier
include('template.php');

// On créé une instance de la classe template, avec en paramètre le répertoire où se trouvent tous les fichiers templates
$template = new Template('./');

// On assigne à un alias le nom du fichier template qu'on souhaite utiliser (autant qu'on le souhaite)
$template->set_filenames(array(
                               'test' => 'test.tpl',
                               'test2' => 'test2.tpl'
                                ));

// On créé un tableau qui va contenir les variables accessibles du fichier template
// Le tableau est indicé par le nom des variables
$template->assign_vars(array(
                            'NAME' => 'Bond',
                            'IP'   => $_SERVER['REMOTE_ADDR'],
                        ));

// On fait une boucle et on stocke dans un tableau accessible par le fichier template une variable
// dans le fichier template, les variables seront accessible sous la forme {bloc.NUM}
for ($i=0; $i<4; $i++) {
    $template->assign_block_vars('bloc', array('NUM' => $i) );
}

// Boucle dans une boucle
for ($j=0; $j<5; $j++) {
    // Tout d'abord, on défini le premier bloc
    $template->assign_block_vars('bloc2', array());
    for ($k=0; $k<$j+1; $k++) {
        // Maintenant on défini le bloc interne au premier bloc
        $template->assign_block_vars('bloc2.dedans', array('NAME'=>('Je suis dedans, j = '.$j.' et k = '.$k)));
    }
}

// On parse le(s) fichier(s) HTML
// c'est à dire qu'on assigne aux fichier template toutes les données qu'on à créer dans le fichier php
$template->pparse('test');
$template->pparse('test2');
?>

Les templates 

Les fichiers templates ne sont pas compliqué à utiliser. Par exemple, pour afficher la variable qu'on a précédemment nommé NAME, il suffit de :

{NAME}

En ce qui concerne les blocs, ils doivent commencer par

<!-- BEGIN bloc -->

et se terminer par

<!-- END bloc -->

Vous pouvez imbriquer des blocs dans des blocs mais si vous devez utiliser des variables, spécifiez bien le nom de chaque bloc parent. Par exemple si vous êtes dans un bloc 'bloc2' dont son bloc père se nomme 'bloc1', les noms des variables seront de la forme :

{bloc1.bloc2.NOM_VAR}

Voici un exemple comprenant deux templates, en relation avec le script PHP vu précédemment :

Première partie : le script test.tpl 

<html>
    <head>
        <link rel="stylesheet" type="text/css" href="test.css" />
        <!-- Vous pouvez bien sur faire tout ce qui est possible dans un fichier HTML --> 
    </head>
   
    <body>

        <b>Hello World !</b><br />
        My name is {NAME} <br />
        Adresse IP : {IP}
        <br /><br />
        <!-- BEGIN bloc -->
        Voici le numero de la boucle {bloc.NUM}<br />
        <!-- END bloc -->

Et maintenant le script test2.tpl 

<br />
        <i>Yop !! je viens du fichier test2.tpl</i>
        <br />
        <!-- BEGIN bloc2 -->
            <!-- BEGIN dedans -->
                {bloc2.dedans.NAME} <br />
            <!-- END dedans -->
        <!-- END bloc2 -->
    </body>
</html>

Comme vous pouvez vous en rendre compte, il n'y a rien de bien compliqué. Toute fois, il est évident que nous pouvons compliquer la chose notamment en imbriquant plusieurs templates ou en multipliant le nombre de bloc.

Mais pour ce qui est des bases, je pense avoir tout abordé. A vous maintenant !

Et si vous avez des commentaires à faire, n'hésitez pas.