begin process at 2010 03 21 07:09:29
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > UN MOTEUR DE TEMPLATE (GÉRE LES SOUS-BLOCS À TOUS LES NIVEAUX)

UN MOTEUR DE TEMPLATE (GÉRE LES SOUS-BLOCS À TOUS LES NIVEAUX)


 Information sur la source

Note :
10 / 10 - par 6 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Class et Objet ( POO ) Classé sous :template, moteur, bloc, variable, remplacer Niveau :Initié Date de création :14/11/2005 Date de mise à jour :14/11/2005 19:25:49 Vu / téléchargé :6 054 / 928

Auteur : The_Template

Ecrire un message privé
Commentaire sur cette source (15)
Ajouter un commentaire et/ou une note

 Description

Voici un petit moteur de template. Je mets le code là, mais toutes les explications sont dans le zip ;)

Source

  • <?php
  • class template
  • {
  • //definition des variables
  • var $template;
  • var $debug_mode;
  • var $fichier;
  • var $blocs;
  • var $chrono;
  • var $debut;
  • /*constructeur : $mode permet de definir si les erreurs sont affichées,(pour $mode='debug'),
  • $chrono permet à TRUE de renvoyer le temps d'execution de la page depuis la definition de l'objet */
  • function template($template, $mode=0, $chrono=FALSE)
  • {
  • //on vérifie que le fichier template existe
  • if(is_file($template))
  • {
  • $this->template=file_get_contents($template);
  • $this->fichier=$template;
  • }
  • else if($mode!='debug')
  • {
  • echo 'Template introuvable';
  • }
  • else
  • {
  • echo 'Template - Erreur. L\'erreur retournée est :
  • template <strong>'.$this->fichier.'</strong> introuvable';
  • }
  • $this->debug_mode=$mode;
  • $this->chrono=$chrono;
  • //si $chrono est à TRUE, on enregistre le timestamp actuel
  • if($chrono==TRUE)
  • {
  • $temps = microtime();
  • $temps = explode(' ', $temps);
  • $this->debut = $temps[1] + $temps[0];
  • }
  • }
  • /*Assignation d'une variable $variable est la variable qui sera utilisée sous la forme
  • {variable} dans le fichier template, $valeur la valeur à laquelle elle correspond*/
  • function variable($variable, $valeur)
  • {
  • //on vérifie que le fichier template contient bien la variable à traiter
  • if(preg_match('!{'.$variable.'}!', $this->template))
  • {
  • //si oui, on la remplace par sa valeur
  • $this->template=preg_replace('!{'.$variable.'}!', $valeur, $this->template);
  • }
  • else if ($this->debug_mode=='debug')
  • {
  • echo '<br/>Template - Erreur. L\'erreur retournée est :
  • <strong>{'.$variable.'}</strong> est introuvable dans le fichier template
  • <strong>'.$this->fichier.'</strong>';
  • }
  • }
  • /*Pour les blocs, cela devient plsu compliqué. $bloc est le nom du bloc tel qu'il sera utilisé sous la forme
  • <!--BLOC-->
  • {VARIABLE1}
  • {VARIABLE2}
  • ...
  • <!--SOUS-BLOC-->
  • ...
  • <!--/SOUS-BLOC-->
  • <!--/BLOC-->
  • $array est un tableau contenant toutes les variables du bloc. La clef de $array correspond au nom de la variable
  • et la valeur de $array correspond à la valeur de la variable
  • */
  • function bloc($bloc, $array)
  • {
  • //On vérifie que le bloc existe dans le fichier template
  • if(preg_match('<!--'.$bloc.'-->', $this->template) and preg_match('<!--/'.$bloc.'-->', $this->template))
  • {
  • //on définit $contenu_bloc comme le contenu du bloc
  • ereg('<!--'.$bloc.'-->(.*)<!--/'.$bloc.'-->', $this->template, $contenu_bloc_tableau);
  • $contenu_bloc=$contenu_bloc_tableau[0];
  • $i=1;
  • /*on traite toutes les clefs et les valeurs de $array pour les mettre dans
  • deux tableaux associatifs distincts*/
  • while(list($key, $val) = each($array))
  • {
  • //on vérifie à chaque foi que la variable se trouve bien dans dans l'array
  • if(preg_match('{'.$key.'}', $this->template))
  • {
  • $cle[$i]='{'.$key.'}';
  • $valeur[$i]=$val;
  • $i++;
  • }
  • else if ($this->debug_mode=='debug')
  • {
  • echo '<br/>Template - Erreur. L\'erreur retournée est :
  • <strong>{'.$variable.'}</strong> est introuvable dans le fichier template
  • <strong>'.$this->fichier.'</strong> dans le bloc <strong>'.$bloc.'</strong>';
  • }
  • }
  • //On remplace toutes les variables du bloc par leur contenu
  • $bloc_final=str_replace($cle, $valeur, $contenu_bloc);
  • if (isset($this->blocs[$bloc]))
  • {
  • //Si le bloc existe, on insère la partie qu'on vient de traiter
  • $this->blocs[$bloc].=$bloc_final;
  • }
  • else
  • {
  • //Sinon, on en créé un nouveau
  • $this->blocs[$bloc]=$bloc_final;
  • }
  • }
  • else if ($this->debug_mode=='debug')
  • {
  • echo '<br/Template - Erreur. L\'erreur retournée est :
  • le bloc <strong>'.$bloc.'</strong> est introuvable dans le fichier template
  • <strong>'.$this->fichier.'/</strong>';
  • }
  • }
  • //Traitement final du template, sous_blocs permet à TRUE de trater les sous blocs
  • function traitement($sous_blocs=FALSE)
  • {
  • //On met toutes les clefs de l'array blocs dans un tableau
  • $fin_bloc=array_keys($this->blocs);
  • $i=0;
  • //La boucle est éxécutée tant qu'il reste des clees à trater dans l'array
  • while(array_key_exists($i, $fin_bloc))
  • {
  • $j=$i-1;
  • //Si $sous_blocs est à true et qu'il existe un sous-bloc, on le traite
  • if($j>-1 and $sous_blocs=TRUE)
  • {
  • $this->blocs[$fin_bloc[$i]]=
  • preg_replace('!<\!--'.$fin_bloc[$j].'-->(.+)<\!--/'.$fin_bloc[$j].'-->!isU',
  • $this->blocs[$fin_bloc[$j]], $this->blocs[$fin_bloc[$i]]);
  • }
  • //On traite le bloc lui-même
  • $this->template=
  • preg_replace('!<\!--'.$fin_bloc[$i].'-->(.+)<\!--/'.$fin_bloc[$i].'-->!isU',
  • $this->blocs[$fin_bloc[$i]], $this->template);
  • $i++;
  • }
  • //On renvoi le template traité.
  • return $this->template;
  • }
  • function temps_execution()
  • {
  • if($this->chrono==TRUE)
  • {
  • $temps = microtime();
  • $temps = explode(' ', $temps);
  • $fin = $temps[1] + $temps[0];
  • $vitesse=round(($fin - $this->debut),6);
  • return $vitesse;
  • }
  • else
  • {
  • return 'Template - Erreur. L\'erreur retournée est : la fonction temps_execution() a été
  • utilisée alors que le paramètre chrono est égal à false';
  • }
  • }
  • }
  • ?>
<?php
class template
{
//definition des variables
var $template;
var $debug_mode;
var $fichier;
var $blocs;
var $chrono;
var $debut;
	
	/*constructeur : $mode permet de definir si les erreurs sont affichées,(pour $mode='debug'),
	$chrono permet à TRUE de renvoyer le temps d'execution de la page depuis  la definition de l'objet */
	function template($template, $mode=0, $chrono=FALSE)
	{
		//on vérifie que le fichier template existe
		if(is_file($template))
		{
			$this->template=file_get_contents($template);
			$this->fichier=$template;
		}
		else if($mode!='debug')
		{
			echo 'Template introuvable';		
		}
		else
		{
			echo 'Template - Erreur. L\'erreur retournée est  : 
			template <strong>'.$this->fichier.'</strong> introuvable';		
		}
		
		
		$this->debug_mode=$mode;
		$this->chrono=$chrono;
		
		//si $chrono est à TRUE, on enregistre le timestamp actuel
		if($chrono==TRUE)
		{
			
			$temps = microtime();
			$temps = explode(' ', $temps);
			$this->debut = $temps[1] + $temps[0];
		}	
	}
	
	/*Assignation d'une variable $variable est la variable qui sera utilisée sous la forme
	{variable} dans le fichier template, $valeur la valeur à laquelle elle correspond*/
	function variable($variable, $valeur)
	{
		//on vérifie que le fichier template contient bien la variable à traiter
		if(preg_match('!{'.$variable.'}!', $this->template))
		{
			//si oui, on la remplace par sa valeur
			$this->template=preg_replace('!{'.$variable.'}!', $valeur, $this->template);
		}
		else if ($this->debug_mode=='debug')
		{
			echo '<br/>Template - Erreur. L\'erreur retournée est  : 
			<strong>{'.$variable.'}</strong> est introuvable dans le fichier template 
			<strong>'.$this->fichier.'</strong>';
		}
	}
	
	/*Pour les blocs, cela devient plsu compliqué. $bloc est le nom du bloc tel qu'il sera utilisé sous la forme
		<!--BLOC-->
			{VARIABLE1}
			{VARIABLE2}
			...
			<!--SOUS-BLOC-->
				...
			<!--/SOUS-BLOC-->
		<!--/BLOC-->
	$array est un tableau contenant toutes les variables du bloc. La clef de $array correspond au nom de la variable
	et la valeur de $array correspond à la valeur de la variable	
	*/
	function bloc($bloc, $array)
	{
		//On vérifie que le bloc existe dans le fichier template
		if(preg_match('<!--'.$bloc.'-->', $this->template) and preg_match('<!--/'.$bloc.'-->', $this->template))
		{
			//on définit $contenu_bloc comme le contenu du bloc
			ereg('<!--'.$bloc.'-->(.*)<!--/'.$bloc.'-->', $this->template, $contenu_bloc_tableau);
			$contenu_bloc=$contenu_bloc_tableau[0];
			
			
			$i=1;
			/*on traite toutes les clefs et les valeurs de $array pour les mettre dans 
			deux tableaux associatifs distincts*/
			while(list($key, $val) = each($array))
			{
				//on vérifie à chaque foi que la variable se trouve bien dans dans l'array
				if(preg_match('{'.$key.'}', $this->template))
				{
					$cle[$i]='{'.$key.'}';
					$valeur[$i]=$val;
					$i++;				
										
				}
				else if ($this->debug_mode=='debug')
				{
					echo '<br/>Template - Erreur. L\'erreur retournée est  :
					<strong>{'.$variable.'}</strong> est introuvable dans le fichier template 
					<strong>'.$this->fichier.'</strong> dans le bloc <strong>'.$bloc.'</strong>';
				}
				
			}
			
			//On remplace toutes les variables du bloc par leur contenu
			$bloc_final=str_replace($cle, $valeur, $contenu_bloc);
			
			if (isset($this->blocs[$bloc]))
			{
				//Si le bloc existe, on insère la partie qu'on vient de traiter
				$this->blocs[$bloc].=$bloc_final;
				
			}
			else
			{
				//Sinon, on en créé un nouveau
				$this->blocs[$bloc]=$bloc_final;
			}
						
		}
		else if ($this->debug_mode=='debug')
		{
			echo '<br/Template - Erreur. L\'erreur retournée est  : 
			le bloc <strong>'.$bloc.'</strong> est introuvable dans le fichier template 
			<strong>'.$this->fichier.'/</strong>';
		}
		
	
	}
	
	//Traitement final du template, sous_blocs permet à TRUE de trater les sous blocs
	function traitement($sous_blocs=FALSE)
	{
		//On met toutes les clefs de l'array blocs dans un tableau
		$fin_bloc=array_keys($this->blocs);
		
		$i=0;
		//La boucle est éxécutée tant qu'il reste des clees à trater dans l'array
		while(array_key_exists($i, $fin_bloc))
		{	
			$j=$i-1;
			//Si $sous_blocs est à true et qu'il existe un sous-bloc, on le traite
			if($j>-1 and $sous_blocs=TRUE)
			{
				$this->blocs[$fin_bloc[$i]]=
				preg_replace('!<\!--'.$fin_bloc[$j].'-->(.+)<\!--/'.$fin_bloc[$j].'-->!isU', 
								$this->blocs[$fin_bloc[$j]], $this->blocs[$fin_bloc[$i]]);
			}
			//On traite le bloc lui-même
			$this->template=
			preg_replace('!<\!--'.$fin_bloc[$i].'-->(.+)<\!--/'.$fin_bloc[$i].'-->!isU', 
							$this->blocs[$fin_bloc[$i]], $this->template); 
			$i++;
		}
		
		//On renvoi le template traité.
		return $this->template;
	
	}
	
	
	function temps_execution()
	{
		if($this->chrono==TRUE)
		{
			$temps = microtime();
			$temps = explode(' ', $temps);
			$fin = $temps[1] + $temps[0];
			$vitesse=round(($fin - $this->debut),6);
		
			return $vitesse;
		}
		else
		{
			return 'Template - Erreur. L\'erreur retournée est : la fonction temps_execution() a été
			utilisée alors que le paramètre chrono est égal à false';
		}
	
	}
	
}
?>

 Conclusion

Voilà. J'ai fais un petit manuel, qui est dans le zip, pour que tous puissent utiliser ce système de template.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

14 novembre 2005 19:25:49 :
Le zip avait buggé - > mise à jour

 Sources du même auteur

Source avec Zip CLASSE MYSQL AVEC JOURNAL D'ERREUR
Source avec Zip SCRIPT QUI GÉNÈRE UN FICHIER .HTPASSWD ET UN FICHIER .HTACCE...

 Sources de la même categorie

Source avec Zip CLASSE TABLE HTML DYNAMIQUE par LDDL
Source avec Zip GÉNÉRATEUR DE COUCHE DAO POUR SITE WEB À PARTIR D'UNE BASE D... par alexfool
Source avec Zip [PHP5.2] CLASSE PDO par hornetbzz
Source avec Zip POO - LOGGING PACKAGE par Waredan
POO - OBJECT CLASS par Waredan

 Sources en rapport avec celle ci

Source avec Zip MOTEUR DE TEMPLATE PHPBB3 SIMPLIFIÉ EN PHP5 par gagah1
CLASS MOTEUR DE TEMPLATE PHP5 par choy
Source avec Zip MOTEUR DE TEMPLATE par FaustXVI
Source avec Zip [PHP5] LIGHTEMPLATE - MOTEUR DE TEMPLATES ULTRA-LÉGER par neigedhiver
Source avec Zip Source avec une capture GALERIE PHOTO DYNAMIQUE GÉRÉE PAR MOTEUR TEMPLATE par darknessneo

Commentaires et avis

Commentaire de The_Template le 14/11/2005 19:22:55

Apperement le Zip a buggé c'est pas du tout ca qu'il y a ......

Commentaire de mozzito le 15/11/2005 04:41:48

Je viens de le télécharger et tout fonctionne...

Ta classe à l'air correcte mais je me suis pas encore plongé dedans. ;P

Le fichier "Code_source.htm" à été construit avec un log, un script php, ou tout à la main :/ ?...

Commentaire de shoghi le 15/11/2005 09:57:55

Bonjour, je suis débutant en php. Je remarque souvent que les templates sont utilisés. Pouvez-vous m'en dire en deux mots l'utilité?

Désolé si cette question vous semble peut-être bêbête.

Merci d'avance.

Shoghi

Commentaire de FhX le 15/11/2005 12:32:40

"# //si oui, on la remplace par sa valeur
#             $this->template=preg_replace('!{'.$variable.'}!', $valeur, $this->template);"

Beurk, question vitesse ca doit pas rouler sur l'or :p

La solution la plus simple est bien sur de tester si la pair clé/valeur est bon. Cependant, il ne faut pas tout de suite remplacé la clé par sa valeur.
Imagine que j'ai environ 60 variables. Tu imagines que je fasse 60 fois un preg_replace ?!
Nonon, le mieux à faire, est de garder ca en mémoire, dans le genre :
$this->var[$key] = $val;
Et ensuite, d'utiliser un simple $this->template = str_replace( array_keys($this->var), array_values($this->var), $this->template);

C'est plus rapide de faire un str_replace plutot que 60 fois un preg_replace, je me trompe ? ;)

Commentaire de The_Template le 15/11/2005 18:00:35

Bonjour.

Shosghi -> les templates servent à séparer le code php du html nottement dans le cadre d'un travail en équipe codeur/graphiste.
Si ca t'interresse j'ai détaillé un peu ca dans le manuel.htm (lol j'avais rien d'autre à faire^^)

Mozzito -> Non le code source html a été fait avec un script ^^

FhX -> Tu as raison poue le str_replace, j'avais commencé comme ca mais ca ne marchait pas (je n'ai toujours pas compris pourquoi, mon code avait l'air très correct) et ca m'as tellement pris la tête que j'ai mis un preg_replace. Pour la rapidité ca dépend en fait du nombre du foi que sera appelé le preg_replace car dans l'absolu un preg_replace est plus rapide qu'un str_replace.

Commentaire de stepibou le 15/11/2005 23:51:33

salut,
Je sais qu'on est là sur un site de php, mais quand je vois un fichier html de 42ko!,
je suis surpris! à quoi il sert?
pour augmenter les performance il faut utiliser des css :
padding, margin, clear, float, overflow, position, min-height, etc...
sinon pour le php, rien à redire,
a+

Commentaire de The_Template le 16/11/2005 13:38:00

Lol je connais le css merci, le fichier html de 42ko est le code coloré avec un script php, qui ne produit qu'un fichier html avec des choses pas jolies genre style="", alors forcement, c'est lourd.

Commentaire de shoghi le 16/11/2005 22:03:36

Merci "The_Template" pour ta réponse. Je vais jeter un coup d'oeil sur ton fichier manuel.htm

@+

Shoghi

Commentaire de cseagle le 22/11/2005 12:46:30

Bonjour,

Je suis en train d'essayer d'utiliser ta classe et j'ai l'erreur suivante :

Warning: array_keys(): The first argument should be an array in d:\www\auc\site\templates.inc.php on line 100

Warning: array_key_exists(): The second argument should be either an array or an object in d:\www\auc\site\templates.inc.php on line 103

Alors que je n'utilise pas $template->bloc

Une idée ?

Commentaire de The_Template le 22/11/2005 19:02:26

Je ne sais pas, c'est bizarre car moi ca marche très bien je m'en sers en ce moment même.
As tu fais $template->traitement(TRUE)  ?
Si oui, l'erreur vient peut-être de là.

Commentaire de Biboops le 29/11/2005 17:43:15

Je n'est pas compris l'utilisation des sous bloc
Pourrais tu fournir un exemple

Merci

Commentaire de crevettegreg le 29/01/2006 17:09:58

Bonjour,

J'ai également l'erreur :

Warning: array_keys(): The first argument should be an array in d:\www\auc\site\templates.inc.php on line 100

Warning: array_key_exists(): The second argument should be either an array or an object in d:\www\auc\site\templates.inc.php on line 103


Avez vous une idée ?
Merci, car sinon, c'est plutot pas mal comme petite source ^^

Commentaire de crevettegreg le 29/01/2006 17:10:47

Bonjour,

J'ai également l'erreur :

Warning: array_keys(): The first argument should be an array in d:\www\auc\site\templates.inc.php on line 100

Warning: array_key_exists(): The second argument should be either an array or an object in d:\www\auc\site\templates.inc.php on line 103


Avez vous une idée ?
Merci, car sinon, c'est plutot pas mal comme petite source

Commentaire de craso le 01/09/2006 19:04:15

j'ai la même erreur que les autres.
Sinon c'est un script comme celui-là sur lequel je travaille en ce moment.

Commentaire de craso le 01/09/2006 20:13:24

bon alors je crois qu'il suffit de rajouter une condition (if(isset($this->blocs)):
function traitement($sous_blocs='non')
{
if (isset($this->blocs))
{
$fin_bloc=array_keys($this->blocs);
$i=0;
while(array_key_exists($i, $fin_bloc))
{
$j=$i-1;
if($j>-1 and $sous_blocs='sous_blocs')
{
$this->blocs[$fin_bloc[$i]]=preg_replace('!<\!--'.$fin_bloc[$j].'-->(.+)<\!--/'.$fin_bloc[$j].'-->!isU', $this->blocs[$fin_bloc[$j]], $this->blocs[$fin_bloc[$i]]);
}
$this->template=preg_replace('!<\!--'.$fin_bloc[$i].'-->(.+)<\!--/'.$fin_bloc[$i].'-->!isU', $this->blocs[$fin_bloc[$i]], $this->template);
$i++;
}
}
return $this->template;
}

ca devrait suffir

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

template ?? [ par junior300 ] bonjourje cherche a reamplacer une varaible de ce type $lang['titre']contenu dans une autre variable :$text = "le truc a dire est $lang['titre']";j'ai Remplacer un mot d'une page de recherche issue d'une variable par un autre mot issu d'un variable [ par Nico52 ] BonjourJ'ai fait un moteur de recherche.Le mot recherche apparait plusieurs fois sur la page du fait de la recherche.J'ai trouvé une routine qui me pe Qui est le moteur de template de joomla ? [ par wassimbik ] Bonjour,à tousQui est le moteur de template de joomla ?Pouvez vous me donner le code source du moteur de template de joomla  et m'aider à comprendre c remplacer [ par simon0000 ] salut tous le mondecomment je pe cr&#233;er une variable $p_fin a partir de la variable $p_in en remplacen "&amp;10" par "1"&nbsp;&nbsp;merci d'avance Sécurité de $_SESSION [ par caviar ] Salut...je voudrai savoir si il est facile de remplacer le contenu d'une variable de session. SI je stocke par exemple l'id du client en cours dans un Cherche Aide pour template php nuke [ par paranight ] bonjour,Je suis actuelement a la recherche d'un codeur php pour m'aider a crée le template que j'ai réalisé et découpé pour le cms phpnuke .c'est pour Déclarer un Type de variable perso [ par MadM@tt ] Bonjour,Je voulais savoir s'il était possible de déclarer des types de variables personnalisé, comme en C++ ou en VB ou autre.Car j'aimerai pouvoir fa pb de variable de session [ par dvlcerbere ] bonjours à vous ! voilà j'ai un pb avec les variables de session , je ne comprendrai vraiment jamais les sessions. Sa marche 1 jour sur 2.Bref voilà l remplacer caractere affiché par une variable dans "echo" [ par pipouz ] bonsoir a tousalors voila, j'ai un code permettant l'envoi de fichier sur un serveur, et me donnant le lien de se fichier , une fois uploadermais je v javascript et PHP [ par magicsmacks ] Bonjour, j'utilise dans un fichier php un script javascript avec une variable number. J'aimerai récupérer à l'aide de mon php cette variable et l'écri


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,030 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales