Problème classe de template

Mammouth du PHP | 1511 Messages

28 mai 2006, 00:27

Bonsoir tout le monde.
Pour les besoins de mon site web, j'ai créer un classe de templates et certaines fonctions qui me permettent d'éviter d'avoir 15000 fichiers mais je suis confronté a un gros probleme.
J'ai une fonction erase_bloc dans ma classe qui me permet d'enlever un bloc commenté de la facon suivante.
<?php
//class de template (c)2006 ltcf.net
//[email protected]
	class template
	{
		var $template;
		var $blocs;
		var $contenu_blocs;
		function template($fichier)
		{
			if(file_exists($fichier))
			{
				$this->template=file_get_contents($fichier);
				$this->blocs=array();
				$this->contenu_blocs=array();
			}
			else
			{
				exit('Template introuvable');
			}
		}
		function assign($variable,$valeur)
		{
			$this->template=str_replace('{'.$variable.'}',$valeur,$this->template);
		}
		function erase_bloc($bloc_name)
		{
			if(preg_match('!<\!--'.$bloc_name.'-->(.+)<\!--/'.$bloc_name.'-->!isU', $this->template))
			{
				$this->template = preg_replace('!<\!--'.$bloc_name.'-->(.+)<\!--/'.$bloc_name.'-->!isU', '', $this->template);	
			}
			else
			{
				die('Le bloc "'.$bloc_name.'" n\'existe pas');
			}
		}
		function assign_bloc($nom_bloc,$tableau)
		{
			$array_recherche=array('<!--'.$nom_bloc.'-->','<!--/'.$nom_bloc.'-->');
			$array_remplace=array('','');
			if(!isset($this->blocs[$nom_bloc]))
			{
				$tableau_ereg=array();
				ereg('<!--'.$nom_bloc.'-->(.*)<!--/'.$nom_bloc.'-->',$this->template,$tableau_ereg);
				$this->blocs[$nom_bloc]=$tableau_ereg[0];
			}			while(list($cle,$valeur)=each($tableau))
			{
				$array_recherche[]='{'.$cle.'}';
				$array_remplace[]=$valeur;
			}
			if(!isset($this->contenu_blocs[$nom_bloc]))
			{
				$this->contenu_blocs[$nom_bloc]=str_replace($array_recherche,$array_remplace,$this->blocs[$nom_bloc]);
			}
			else
			{
				$this->contenu_blocs[$nom_bloc].=str_replace($array_recherche,$array_remplace,$this->blocs[$nom_bloc]);
			}
		}
		function afficher_blocs()
		{
			while(list($cle,$valeur)=each($this->contenu_blocs))
			{
				$this->template=str_replace($this->blocs[$cle],$valeur,$this->template);
			}
		}
		function afficher()
		{
			$this->afficher_blocs();
			if(isset($_SESSION['logged_in']) && $_SESSION['logged_in'] == true)
			{
				$this->template = preg_replace('!<\!--connnexion_box-->(.+)<\!--/connnexion_box-->!isU', '', $this->template);
			}
			if(isset($_SESSION['logged_in']) && $_SESSION['logged_in'] == true)
			{
				$this->template = preg_replace('!<\!--link_connexion-->(.+)<\!--/link_connexion-->!isU', '', $this->template);
			}
			if(isset($_SESSION['logged_in']) && $_SESSION['logged_in'] == false || isset($_SESSION['user_level']) && $_SESSION['user_level'] != 2)
			{
				$this->template = preg_replace('!<\!--if_is_admin-->(.+)<\!--/if_is_admin-->!isU', '', $this->template);
			}
			if(isset($_SESSION['logged_in']) && $_SESSION['logged_in'] == false)
			{
				$this->template = preg_replace('!<\!--if_is_member--\>(.+)<\!--/if_is_member--\>!isU', '', $this->template);
			}
			if(!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] == true)
			{
				$this->template = preg_replace('!<\!--if_is_not_member--\>(.+)<\!--/if_is_not_member--\>!isU', '', $this->template);
			}
			echo $this->template;
		}
		function return_content()
		{
			$this->afficher_blocs();
			return $this->template;
		}
	}
?>
Maintenant, mon probleme est que j'en ai un peu marre a chaque fois que j'ajoute un affichage dans le tpl des news de remettre a jour tous les erase_bloc()...
Ma question est: Est il possible de faire une fonction qui me permettrait de ne récuperer dans $this->template que le contenu d'un bloc selectionné dans une fonction telle que $this->select_bloc ?
@+ et merci d'avance pour votre aide

Mammouth du PHP | 19672 Messages

28 mai 2006, 09:19

Au lieu de ré-inventer la roue, as-tu songé à utiliser une classe de template existante ? Je songe en particulier à la classe template.inc.php de la phpLib qui est utilisable indépendament de la phpLib ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 493 Messages

28 mai 2006, 10:17

(il s'agit de PHP4, pas PHP5 :lol:)

Mammouth du PHP | 1511 Messages

28 mai 2006, 10:36

En fait, certaines parties de phplib me posent problême...
De plus, je ne me rapelle pas qu'il y avait une fonction qui permettait ceci dans phplib...
@+

Mammouth du PHP | 19672 Messages

28 mai 2006, 11:17

(il s'agit de PHP4, pas PHP5 :lol:)
Pas très complexe à convertir :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 1511 Messages

28 mai 2006, 11:24

Je viens de penser a un truc, avec un preg match, on retourne le nom de chaque bloc dans un tableau et ensuite, a l'aide du boucle, on supprime tous les blocs sauf celui qui nous interesse a l'aide de preg_replace non?
@+

Mammouth du PHP | 19672 Messages

28 mai 2006, 11:28

C'est effectivement une solution que tu pourrais explorer :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 1511 Messages

28 mai 2006, 14:21

J'ai eu cette idée en réflechissant un peu...
function get_block($bloc_name)
{
	preg_match_all('!<\!--bloc_(.+)-->(.+)<\!--/bloc_(.+)-->!isU', $this->template, $result, PREG_SET_ORDER);
	$count_result = count($result);
	for($i = 0; $i != $count_result; $i++)
	{
		if($result[$i][0] != $bloc_name)
		{
			preg_replace('!<\!--'.$result[$i][0].'-->(.+)<\!--/'.$result[$i][0].'-->!isU', '', $this->template);
		}
	}
}
Si quelqu'un pouvait me donner son avis?
@+

Mammouth du PHP | 1511 Messages

30 mai 2006, 15:50

Je viens de commencer a tester le bouzin mais je me trouve avec une erreur que je n'avais jamais rencontré jusque la...

Code : Tout sélectionner

Warning: Unknown modifier '-' in f:\webdev\dev\www\includes\template.php on line 30
La ligne incriminée, a savoir la ligne 30 est
preg_replace('!<\!--bloc_'.$result[$i][0].'-->(.+)<\!--/bloc_'.$result[$i][0].'-->!isU', '', $this->template);
Donc si quelqu'un pouvait m'éclairer sur le problème... :cry:
Pour rappel, voici le code source de ma fonction:
function select_bloc($bloc_name)
{
	preg_match_all('!<\!--bloc_(.+)-->(.+)<\!--/bloc_(.+)-->!isU', $this->template, $result, PREG_SET_ORDER);
	$count_result = count($result);
	for($i = 0; $i != $count_result; $i++)
	{
		if($result[$i][0] != $bloc_name)
		{
			preg_replace('!<\!--bloc_'.$result[$i][0].'-->(.+)<\!--/bloc_'.$result[$i][0].'-->!isU', '', $this->template);
		}
	}
}

ViPHP
ViPHP | 3607 Messages

30 mai 2006, 17:05

il faudrait que tu échappes les "-" dans ton masque...

Mammouth du PHP | 1511 Messages

30 mai 2006, 19:47

pourtant j'ai utilisé le même masque a ce niveau...
function erase_bloc($bloc_name)
{
	if(preg_match('!<\!--'.$bloc_name.'-->(.+)<\!--/'.$bloc_name.'-->!isU', $this->template))
	{
		$this->template = preg_replace('!<\!--'.$bloc_name.'-->(.+)<\!--/'.$bloc_name.'-->!isU', '', $this->template);	
	}
	else
	{
		die('Le bloc "'.$bloc_name.'" n\'existe pas');
	}
}
Je ne comprends pas pourquoi je devrais échapper le tout :?
@+

Mammouth du PHP | 1511 Messages

31 mai 2006, 08:27

Euh, en relisant la doc php, me serais-je planté dans la chaine dans mon preg_match_all ... :?
@+