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.