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

Gestion d'un système de templates en PHP

Gestion d'un système de template en PHP


précédentsommairesuivant

3. La classe Template

Je vais vous expliquer pas à pas la réalisation d'une classe qui gère un système de template.

3.1. 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

3.2. 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 comtpe à 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 places hors-boucle
		if ($type == '.') {
			for ($i = 0, $imax = count($info); $i < $imax; $i++) {
				foreach ($info[$i] as $constant => $data) {
					// Remplace {CONSTANTE} par les donneés correspondantes
					// et mets  jour le code HTML du fichier test.tpl
					// stock 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 places 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 caractres 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écupration et formatage des tags
				$startTag = '<!-- BEGIN '.$type.' -->';
				$startTag = htmlentities($startTag);
					
				$endTag = '<!-- END '.$type.' -->';
				$endTag = htmlentities($endTag);
				
				// Récupration 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écupration de la portion du tableau
				// délimite 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 donneés
				$blockTag = implode("\n", $blockTag);
					
				// Remplacement des constantes par leur 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 insrant au milieu les donnes
			$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]);
			}
			
			// Mets  jour le code HTML du fichier test.tpl
			// stock 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.