Problème classe de template

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Problème classe de template

par momox » 31 mai 2006, 08:27

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

par momox » 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 :?
@+

par jojolapine » 30 mai 2006, 17:05

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

par momox » 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);
		}
	}
}

par momox » 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?
@+

par Cyrano » 28 mai 2006, 11:28

C'est effectivement une solution que tu pourrais explorer :-k

par momox » 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?
@+

par Cyrano » 28 mai 2006, 11:17

(il s'agit de PHP4, pas PHP5 :lol:)
Pas très complexe à convertir :-k

par momox » 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...
@+

par Vaedan » 28 mai 2006, 10:17

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

par Cyrano » 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 ?

Problème classe de template

par momox » 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