Le blog de ALF-Solution

Utilisation du moteur de template

On a vu dans le sommaire les raisons pour utiliser un moteur de template. Je ne reviendrai donc plus sur ce point. Pour pouvoir utiuliser notre moteur de template, la première chose à faire dans votre projet est d'inclure le fichier contenant la classe template qui nous permettra de mélanger les données dynamiques et la page HTML de présentation. Ajouter à votre projet la  ligne suivante :

/* Classe pour l'utilisation des templates */
include_once "./includes/templates.inc.php";

Avant de se mettre à utiliser cette classe, encore une petite chose, car la bonne gestion d'un développement est aussi synonime de bonne gestion de vos sources. Je propose donc de créer un nouveau sous-répertoire dans votre projet, appelons le template, mais bien sûr vous pouvez l'appler comme bon il vous semble, qui contiendra les templates qui seront utilisés dans votre projet.

Voilà, maintenant on peut y aller. La première chose à faire est de bien sûr écrire le template. Ok mais, heu quelles sont les règles à suivre ? On va les découvrir au travers d'un exemple qui consistera à afficher la liste des employés et par la suite, on permettra de filtrer cette liste sur base du département.

Donc pour commencer, ce que nous souhaitons obtenir est un affichage qui ressemble à celui-ci :

Nombre d'enregistrement : 9

Id First name Last name Job Salary Notes
1 Robin Jackman Software Engineer 5500  
2 Taylor Edward Software Architect 7200  
3 Vivian Dickens Database Administrator 6000  
4 Harry Clifford Database Administrator 6800  
5 Eliza Clifford Software Engineer 4750  
6 Nancy Newman Software Engineer 5100  
7 Melinda Clifford Project Manager 8500  
8 Harley Gilbert Software Architect 8000  
9 John Doe IT Manager 9000  

Bien sûr tout ceci peut être réaliser via le code suivant :

<?php
/**
 * @author: Pierre Delporte - pierre.delporte@alf-solution.be
 * Date: 1/02/15
 * Time: 13:17
 * @note : aucune garantie n'est données sur le code ci-après.
 * Ce code est donné à titre d'exemple.
 */
/* Inclure le fichier avec les variables globales au projet */
include_once "./db/DB.php";
include_once "./db/data.php";
include_once "./db/TableRow.php";
include_once "./db/Table.php";

/* Classe pour l'utilisation des templates */
include_once "./includes/templates.inc.php";

/* Inclure la classe de connexion à la base de données */
include_once './includes/global.php';

$dblink = new DB(HOST, USER, PASSWORD, DBNAME, TYPEDB);
if ( !$dblink->connect()){
    echo 'La connexion à la base de donnée a échouée';
    die();
} else {
    echo 'Connexion r&eacute;ussie<br><br>';
}

/* Rechercher tous les employés de la table employee*/
$employees = Table::Fetch('employee');
echo "
<table>
     <thead>
        <tr>
            <td>Id</td>
            <td>First name</td>
            <td>Last name</td>
            <td>Job</td>
            <td>Salary</td>
            <td>Notes</td>
        </tr>
    </thead>
    <tbody>";
foreach ($employees as $employee){
    echo '<tr>';
    echo '<td>'.$employee->Id.'</td><td>'.$employee->First_name.'</td><td>'.$employee->Last_name.'</td><td>'.$employee->Job_title.'</td><td>'.$employee->Salary.'</td><td>'.$employee->Notes.'</td>';
    echo '</tr>';
}
echo "</tbody>
</table>";

Mais reconnaissons le, cela peut très vite devenir illisible, surtout si la première partie de l'affichage est remis sur une seule ligne, comme ceci,

/* Rechercher tous les employés de la table employee*/
$employees = Table::Fetch('employee');
echo "<table><thead><tr><td>Id</td><td>First name</td><td>Last name</td><td>Job</td><td>Salary</td><td>Notes</td></tr></thead><tbody>";
foreach ($employees as $employee){
    echo '<tr>';
    echo '<td>'.$employee->Id.'</td><td>'.$employee->First_name.'</td><td>'.$employee->Last_name.'</td><td>'.$employee->Job_title.'</td><td>'.$employee->Salary.'</td><td>'.$employee->Notes.'</td>';
    echo '</tr>';
}
echo "</tbody>
</table>";

on risque vite de faire des erreurs si on doit modifier quelque chose.

Nous allons donc créer un fichier dans notre répertoire template, appelons-le employee_list.html et voici sont contenus, que nous allons bien sûr rendre dynamique

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    Nombre d'enregistrement : 9<br><br>
    <table>
        <thead>
        <tr>
            <td>Id</td>
            <td>First name</td>
            <td>Last name</td>
            <td>Job</td>
            <td>Salary</td>
            <td>Notes</td>
        </tr>
        </thead>
        <tbody>
        <tr>
            <td>1</td>
            <td>Robin</td>
            <td>Jackman</td>
            <td>Software Engineer</td>
            <td>5500</td>
            <td></td>
        </tr>
        <tr>
            <td>2</td>
            <td>Taylor</td>
            <td>Edward</td>
            <td>Software Architect</td>
            <td>7200</td>
            <td></td>
        </tr>
        <tr>
            <td>3</td>
            <td>Vivian</td>
            <td>Dickens</td>
            <td>Database Administrator</td>
            <td>6000</td>
            <td></td>
        </tr>
        <tr>
            <td>4</td>
            <td>Harry</td>
            <td>Clifford</td>
            <td>Database Administrator</td>
            <td>6800</td>
            <td></td>
        </tr>
        <tr>
            <td>5</td>
            <td>Eliza</td>
            <td>Clifford</td>
            <td>Software Engineer</td>
            <td>4750</td>
            <td></td>
        </tr>
        <tr>
            <td>6</td>
            <td>Nancy</td>
            <td>Newman</td>
            <td>Software Engineer</td>
            <td>5100</td>
            <td></td>
        </tr>
        <tr>
            <td>7</td>
            <td>Melinda</td>
            <td>Clifford</td>
            <td>Project Manager</td>
            <td>8500</td>
            <td></td>
        </tr>
        <tr>
            <td>8</td>
            <td>Harley</td>
            <td>Gilbert</td>
            <td>Software Architect</td>
            <td>8000</td>
            <td></td>
        </tr>
        <tr>
            <td>9</td>
            <td>John</td>
            <td>Doe</td>
            <td>IT Manager</td>
            <td>9000</td>
            <td></td>
        </tr>
        </tbody>
    </table>
</body>
</html>

Voyons déjà comment faire pour appeler cette page et l'afficher. Première chose à faire est de charger notre template en mémoire, ce qui sera fait lors de l'instanciation de la classe tempate :

/* Charger le fichier de template */
$myTemplate = new template('./template/employees_list.html');

/* Générer la page et l'afficher */
echo $myTemplate->generate();

L'exécution sera identique, il n'est donc pas besoin de le réaficher. Nous souhaitons maintenant remplacer le chiffre "9" dans la ligne Nombre d'enregistrement : 9 par la valeur retourné de notre query. La première chose à faire, est donc de remplacer ce chiffre 9 dans notre template par une variable. Cela se fait en mettant entre acolade "{" et "}"  le nom du variable qui sera substituée dans notre code par sa valeur. Nous modifions donc la ligne du template pour qu'elle reseemble à ceci :

Nombre d'enregistrement : {record_count}<br><br>

Ajoutons dans notre code, la requête pour retourver nos enregistrements et la commande permettant de subistuer cette variable {recourd_count} par sa valeur :

/* Charger le fichier de template */
$myTemplate = new template('./template/employees_list.html');

/* Rechercher tous les employés de la table employee*/

$employees = Table::Fetch('employee');

/* afficher le nombre d'enregistrement */
$myTemplate->record_count = $employees->count();

/* Générer la page et l'afficher */
echo $myTemplate->generate();

Vous aurez compris que c'est la ligne

$myTemplate->record_count = $employees->count();

qui réalise la substitution. Cette ligne aurait aussi pu s'écrire :

$myTemplate->replace('record_count', $employees->count());

Les deux méthodes s'équivalent, l'une étant plus orienté objet que l'autre.

Bien maintenant voyons comment on peut remplacer toutes les données dans notre fichier template par des variables. Ah mais oui, mais comment on fait pour remplacer plusieurs fois la même variable par différentes valeurs ? Et bien on cré un bloc. Un bloc pourra alors contenir des variables, comme celle-ci dessus et qui seront remplacée pour chaque enregistrement par leur valeur.

Comment délimiter un bloc ? Un bloc est délilmiter par

<!--bloc_name--> et <!--/bloc_name-->

Ou vous remplacerea bloc_name par le nom que vous souhaitez. Pour notre exemple on re nomera notre bloc en bloc_employees. Voici à quoi ressemble notre template

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    Nombre d'enregistrement : {record_count}<br><br>
    <table>
        <thead>
        <tr>
            <td>Id</td>
            <td>First name</td>
            <td>Last name</td>
            <td>Job</td>
            <td>Salary</td>
            <td>Notes</td>
        </tr>
        </thead>
        <tbody>
        <!--bloc_employees-->
        <tr>
            <td>1</td>
            <td>Robin</td>
            <td>Jackman</td>
            <td>Software Engineer</td>
            <td>5500</td>
            <td></td>
        </tr>
        <!--/bloc_employees-->
        </tbody>
    </table>
</body>
</html>

C'est déjà plus court. Remplacons maintenant les valeurs par des variables ainsi notre fichier de template sera prêt :

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    Nombre d'enregistrement : {record_count}<br><br>
    <table>
        <thead>
        <tr>
            <td>Id</td>
            <td>First name</td>
            <td>Last name</td>
            <td>Job</td>
            <td>Salary</td>
            <td>Notes</td>
        </tr>
        </thead>
        <tbody>
        <!--bloc_name-->
        <tr>
            <td>{id}</td>
            <td>{first_name}</td>
            <td>{last_name}</td>
            <td>{job}</td>
            <td>{salary}</td>
            <td>{notes}</td>
        </tr>
        <!--/bloc_name-->
        </tbody>
    </table>
</body>
</html>

Tiens, que se passe-t-il si on exécute notre code maintenant ? Et bien alons-y et voisi le résultat :

Nombre d'enregistrement : 9
Id
First name
Last name
Job
Salary
Notes
{id}
{first_name}
{last_name}
{job}
{salary}
{notes}

Pas très génial. Allez remplaçons ses variables cela se fait via la fonction bloc qui prendra comme argument, le nom du bloc dans lequel on veut remplacer nos variables et un tableau avec le nom des variables avec leur valeur respective assignée. Ce qui donne :

foreach ($employees as $employee){
    $myTemplate->bloc('bloc_employees', array(
        'id' => $employee->id,
        'first_name' => $employee->First_name,
        'last_name' => $employee->Last_name,
        'job' => $employee->Job_title,
        'salary' => $employee->Salary,
        'notes' => $employee->Notes
    ));
}

et nous redonnera le tableau suivant :

Id
First name
Last name
Job
Salary
Notes
1
Robin
Jackman
Software Engineer
5500
 
2
Taylor
Edward
Software Architect
7200
 
3
Vivian
Dickens
Database Administrator
6000
 
4
Harry
Clifford
Database Administrator
6800
 
5
Eliza
Clifford
Software Engineer
4750
 
6
Nancy
Newman
Software Engineer
5100
 
7
Melinda
Clifford
Project Manager
8500
 
8
Harley
Gilbert
Software Architect
8000
 
9
John
Doe
IT Manager
9000
 

Voici le code complet de notre exemple :

<?php
/**
 * @author: Pierre Delporte - pierre.delporte@alf-solution.be
 * Date: 1/02/15
 * Time: 13:17
 * @note : aucune garantie n'est données sur le code ci-après.
 * Ce code est donné à titre d'exemple.
 */
/* Inclure le fichier avec les variables globales au projet */
include_once "./db/DB.php";
include_once "./db/data.php";
include_once "./db/TableRow.php";
include_once "./db/Table.php";

/* Classe pour l'utilisation des templates */
include_once "./includes/templates.inc.php";

/* Inclure la classe de connexion à la base de données */
include_once './includes/global.php';

$dblink = new DB(HOST, USER, PASSWORD, DBNAME, TYPEDB);
if ( !$dblink->connect()){
    echo 'La connexion à la base de donnée a échouée';
    die();
}

/* Charger le fichier de template */
$myTemplate = new template('./template/employees_list.html');

/* Rechercher tous les employés de la table employee*/

$employees = Table::Fetch('employee');

/* afficher le nombre d'enregistrement */
$myTemplate->record_count = $employees->count();

foreach ($employees as $employee){
    $myTemplate->bloc('bloc_employees', array(
        'id' => $employee->id,
        'first_name' => $employee->First_name,
        'last_name' => $employee->Last_name,
        'job' => $employee->Job_title,
        'salary' => $employee->Salary,
        'notes' => $employee->Notes
    ));
}

/* Générer la page et l'afficher */
echo $myTemplate->generate();

 


par Admin ALF-Solution Publié le 09/02/2015 21:29:37 Modifié le 09/02/2015 22:27:21 Commentaires 0 0 J'aime