IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Gestion d'un système de templates en PHP


précédentsommairesuivant

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.

Schéma - structure de la classe
Schéma - structure de la classe

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 :
méthode __construct()
Sélectionnez
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 simpleVar()
Sélectionnez
function simpleVar($varArray = array()) {
    // Si le tableau est vide, on stoppe le script
    if (empty($varArray)) exit;

    // Parcours du tableau
    foreach ($varArray as $var => $data) {
        // Enregistrement dans le tableau $this->infoTpl
        $this->infoTpl['.'][][$var] = $data;
    }
}

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.
méthode loopVar()
Sélectionnez
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 :
méthode constantReplace()
Sélectionnez
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);
        }
    }
}

Méthode parse()

méthode parse()
Sélectionnez
function parse() {
    $this->constantReplace();
        
    echo $this->page;
}

précédentsommairesuivant

Copyright © 2006 Adrien Pellegrini. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.