III. La classe Template▲
Je vais vous expliquer pas à pas la réalisation d'une classe qui gère un système de templates.
III-A. Sa structure▲
Ne vous attardez pas trop sur cette structure, c'est juste pour vous donner un aperçu de la classe avec ses différentes méthodes.
III-B. Ses méthodes▲
Méthode __construct()▲
Cette méthode a pour but de :
- tester si le fichier .tpl joint au code PHP existe ;
- stocker le code HTML de la page test.tpl dans la variable $this->page :
function __construct($file) {
// Teste si le fichier existe et si il est autorisé en lecture
if(empty($file) or !file_exists($file) or !is_readable($file)) {
// Si le fichier est inexistant pas : erreur
die('Template error : file '.$file.' not found.');
} else {
// Ouverture du fichier
$handle = fopen($file, 'rb');
// Enregistrement du fichier dans $this->page
$this->page = fread($handle, filesize ($file));
// Fermeture du fichier
fclose ($handle);
}
}Méthode simpleVar()▲
Cette méthode a pour but de :
- récupérer les constantes/données du fichier test.php (exemple 2.1) des simples variables ;
- stocker les constantes/données dans le tableau $this->infoTpl selon le schéma défini précédemment pour ce tableau :
Méthode loopVar()▲
Cette méthode a pour but de :
- récupérer les constantes/données du fichier test.php (exemple 2.3) avec des variables placées dans une boucle ;
- stocker les constantes/données dans le tableau $this->infoTpl selon le schéma précédemment défini pour ce tableau.
function loopVar($type, $varArray = array()) {
// Si le tableau est vide, on stoppe le script
if (empty($varArray)) exit;
// Calcule le nombre de lignes dans le type courant
// Si 0 ligne => 0
// Si X lignes => X
// Pourquoi X et non (X + 1) ?
// ->, Car on compte à partir de 0 donc X retourne toujours
// le dernier id + 1
$lastID = (count($this->infoTpl[$type]) != 0) ? (count($this->infoTpl[$type])) : 0;
foreach ($varArray as $constant => $data) {
$this->infoTpl[$type][$lastID][$constant] = $data;
}
}Méthode constantReplace()▲
Cette méthode a pour but de :
- remplacer '{CONSTANTE}' du fichier .tpl par sa donnée contenue dans le fichier test.php :
function constantReplace() {
// Parcours de tout le taleau $this->infoTpl
foreach($this->infoTpl as $type => $info) {
// Si le type est '.' càd
// provient de la fonction simpleVar()
// ou encore de constantes placées hors-boucle
if ($type == '.') {
for ($i = 0, $imax = count($info); $i < $imax; $i++) {
foreach ($info[$i] as $constant => $data) {
// Remplace {CONSTANTE} par les données correspondantes
// et met à jour le code HTML du fichier test.tpl
// stocke dans $this->page
$data = (file_exists($data)) ? $this->includeFile($data) : $data;
$this->page = preg_replace('`{'.$constant.'}`', $data, $this->page);
}
}
// Sinon si le type est autre càd
// provient de la fonction loopVar()
// ou encore de constantes placées dans une boucle
} else {
// Calcule la taille du tableau $info
$infoSize = count($info);
// Variable qui contiendra le code à la place de
// <!-- BEGIN country -->
// {country.ID} => {country.COUNTRY}
// <!-- END country -->
$block = '';
// Parcourt le tableau $info
for ($i = 0; $i < $infoSize; $i++) {
// Encode les caractères spéciaux
$page = htmlentities($this->page);
// $page est une variable string
// Remplit le tableau $infoArray ligne par ligne
$infoArray = explode("\n", $page);
// Suppression des espaces blancs avant/après
// dus aux indentations du code
for ($k = 0, $kmax = count($infoArray); $k < $kmax; $k++) {
$infoArray[$k] = trim($infoArray[$k]);
}
// Récupération et formatage des tags
$startTag = '<!-- BEGIN '.$type.' -->';
$startTag = htmlentities($startTag);
$endTag = '<!-- END '.$type.' -->';
$endTag = htmlentities($endTag);
// Récupération de la clé des tags dans le tableau $infoArray
$startTag = (array_search($startTag, $infoArray)) + 1;
$endTag = (array_search($endTag, $infoArray)) - 1;
// Nombre de lignes entre les tags
$lengthTag = ($endTag - $startTag) + 1;
// Récupération de la portion du tableau
// délimitée par les tags (tags non compris)
$blockTag = array_slice($infoArray, $startTag, $lengthTag);
// Remise en type 'string' et non plus 'array'
// Facilitera le remplacement des constantes par leurs données
$blockTag = implode("\n", $blockTag);
// Remplacement des constantes par leurs données
foreach($info[$i] as $constant => $data) {
$data = (file_exists($data)) ? $this->includeFile($data) : $data;;
$blockTag = preg_replace('`{'.$type.'.'.$constant.'}`', $data, $blockTag);
}
// Ajout des données à la variable block globale pour la boucle
// Ajoute \n ou pas et ajoute les données
// de la nouvelle boucle à la suite de $block
$block = ($block == '') ? $blockTag : $block."\n".$blockTag;
}
// Mise en tableau de $block
// Facilitera l'opération de reconstitution des tableaux
$block = explode ("\n", $block);
// Coupe du tableau en 2
// $fisrtPart = début du tableau -----> <!-- BEGIN country -->
// $secondPart = <!-- BEGIN country --> -----> fin du tableau
$firstPart = array_slice($infoArray, 0, $startTag - 1);
$secondPart = array_slice($infoArray, $startTag + $lengthTag + 1);
// Reconstitution du code source
// en insérant au milieu les données
$page = array_merge($firstPart, $block, $secondPart);
// Décode les balises HTML qui étaient encodées avec htmlentities()
for ($i = 0, $imax = count($page); $i < $imax; $i++) {
$page[$i] = html_entity_decode($page[$i]);
}
// Met à jour le code HTML du fichier test.tpl
// stocke dans $this->page
$this->page = implode("\n", $page);
}
}
}


