Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

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


Information sur la source

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é: 5 791 / 912

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

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

Pour les "Membres Club", vous pouvez 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

Commentaires et avis

signaler à un administrateur
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 ......

signaler à un administrateur
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 :/ ?...

signaler à un administrateur
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

signaler à un administrateur
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 ? ;)

signaler à un administrateur
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.

signaler à un administrateur
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+

signaler à un administrateur
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.

signaler à un administrateur
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

signaler à un administrateur
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 ?

signaler à un administrateur
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à.

signaler à un administrateur
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

signaler à un administrateur
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 ^^

signaler à un administrateur
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

signaler à un administrateur
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.

signaler à un administrateur
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 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 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 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...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,842 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.