begin process at 2012 05 31 01:26:27
  Trouver un code source :
 
dans
 
Accueil > Forum > 

PHP

 > 

POO

 > 

Classes & Objets

 > 

Problème avec mon moteur de template - Blocs imbriqués


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Problème avec mon moteur de template - Blocs imbriqués

samedi 19 février 2011 à 09:18:01 | Problème avec mon moteur de template - Blocs imbriqués

christophedlr

Membre Club
Bonjour à tous,

Voila je suis entrain de programmer mon site internet et je suis tombé sur un gros bug avec mon moteur de template. Quand la fonction assign_block_vars remplace un bloc, aucun soucis mais dès que c'est le bloc parent (cas des blocs imbriqués), tout est bon SAUF le dernier remplacement à effectuer où là le moteur laisse la balise de fin de bloc.

Sur mon moteur, les blocs sont composés comme ceci : <!--BLOCK_NOM--> et pour la fin : <!--/BLOCK_NOM-->, les variables dedans sont composés comme ceci : {NOMBLOC.VAR}.

Voici le code du moteur :
Code PHP :
<?php

class Template
{
	private $directory; //Nom du répertoire de base des templates
	private $contentfile = array(); //Contenu des fichiers ouverts
	private $allcontentblock = array(); //Contenu complet (masque complet) des blocs

	/*Constructeur de la classe*/
	function __construct($directory)
	{
		if ( is_string($directory) )
		{
			$this->directory = $directory.'/';
			return;
		}

		echo "Erreur Template::__construct - Vous n'avez pas sp&eacute;cifi&eacute; une cha&icirc;ne de caract&egrave;res<br />";
	}

	/*Ouvre un template*/
	function open($filename, $directory = '')
	{
		if ( !is_string($filename) )
		{
			echo "Erreur Template::open - Vous n'avez pas entr&eacute; un nom de fichier<br />";
		}

		/*Si le fichier existe à l'emplacement par défaut*/
		if ( file_exists($this->directory.$filename) )
		{
			$this->contentfile[$filename] = file_get_contents($this->directory.$filename);
			return $filename;
		}

		else
		{
			/*Si le fichier est dans un répertoire différent, par exemple un module*/
			if ( file_exists($directory.$this->directory.$filename) )
			{
				$this->contentfile[$directory.$this->directory.$filename] = file_get_contents($directory.$this->directory.$filename);
				return $directory.$this->directory.$filename;
			}

			/*Si le fichier n'existe pas du tout*/
			else
			{
				echo "Erreur Template::open - Vous n'avez pas indiqu&eacute; un fichier &eacute;xistant<br />";
				return FALSE;
			}
		}
	}

	/*Remplace les {QUELQUECHOSE} par la valeur*/
	function assign_vars($template, $array)
	{
		if ( isset($this->contentfile[$template]) )
		{
			foreach ($array as $key => $value)
			{
				$this->contentfile[$template] = str_replace('{'.$key.'}', $value, $this->contentfile[$template]);
			}
		}

		else
		{
			echo "Erreur Template::assign_vars - Vous n'avez pas indiqu&eacute; le nom d'un template ouvert<br />";
		}
	}

	/*Remplace les blocs de code*/
	function assign_block_vars($template, $block, $array)
	{
		if ( isset($this->contentfile[$template]) )
		{
			if ( preg_match('#\<!--BLOCK_'.$block.'--\>(.+)\<!--/BLOCK_'.$block.'--\>#sU', $this->contentfile[$template], $matches) )
			{
				$this->allcontentblock[$block] = $matches[0];
				$contentblock = $matches[1];

				foreach ($array as $key => $value)
				{
					$contentblock = str_replace('{'.$block.'.'.$key.'}', $value, $contentblock);
				}
				$this->contentfile[$template] = preg_replace('#\<!--BLOCK_'.$block.'--\>(.+)\<!--/BLOCK_'.$block.'--\>#sU',
							$contentblock.$this->allcontentblock[$block], $this->contentfile[$template]);
			}
		}

		else
		{
			echo "Erreur Template:assign_block_vars - Vous n'avez pas indiqu&eacute; le nom d'un template ouvert<br />";
		}
	}

	/*Affiche le template*/
	function display($filename, $debug = FALSE)
	{
		if ( $debug === FALSE )
		{
			$this->removedebug($filename);
		}

		else if ($debug !== TRUE)
		{
		echo "Erreur Template::display - Vous n'avez pas indiqu&eacute; un bool&eacute;en comme second param&egrave;tre<br />";
		}

		echo $this->contentfile[$filename];
	}

	/*Supprime les variables et blocs non utilisés*/
	private function removedebug($filename)
	{
		$this->contentfile[$filename] = preg_replace('#\<!--BLOCK_(.+)--\>(.+)\<!--/BLOCK_(.+)--\>#sU',
				'', $this->contentfile[$filename]);

		$this->contentfile[$filename] = preg_replace('#\{(.+)\}#sU', '', $this->contentfile[$filename]);
	}
}

?>


Je ne comprend pas pourquoi il me laisse cette balise de fin, j'ai tout tenter mais sans résultat.


Merci d'avance pour votre aide.
samedi 19 février 2011 à 17:36:41 | Re : Problème avec mon moteur de template - Blocs imbriqués

phpAnonyme

Un exemple de cas serait le bien venu ! Et pas juste la classe car là euhhh...voilà quoi

______________________________________________________________________
samedi 19 février 2011 à 17:46:33 | Re : Problème avec mon moteur de template - Blocs imbriqués

christophedlr

Membre Club
Ben un exemple tout con :
Code HTML :
<!--BLOCK_TEST-->
{TEST.VAR1}<br />
<!--BLOCK_TEST2-->
{TEST2.VAR2}<br />
<!--/BLOCK_TEST2-->
<!--/BLOCK_TEST-->


Ca c'est pour la page html (on l'appelera index.html), et le traitement :
Code PHP :
<?php

include('template.class.php');

$tpl = new Template('./');

$file = $tpl->open('index.html');

for ($i = 0; $i < 2; $i++)
{
    $tpl->assign_block_vars($file, 'TEST', array(
        'VAR1' => $i ));
    for ($j = 0; $j < 2; $j++)
        {
            $tpl->assign_block_vars($file, 'TEST2', array(
                'VAR2' => $j ));
        }
}

$tpl->display($file);

?>

Et ça c'est le traitement (index.php pour l'exemple).

Au final au lieu de me retrouver avec ceci :
Code :
0
0
1
1


J'ai :
Code :
0
0
1
1

samedi 19 février 2011 à 18:08:40 | Re : Problème avec mon moteur de template - Blocs imbriqués

phpAnonyme

un exemple tout con :

Un wèè boff !

C'est surtout le résultat qui m'intéressait, mais c'est bon tu la donné(à la fin) mais je vois pas ce qui te gêne !

______________________________________________________________________
samedi 19 février 2011 à 18:11:08 | Re : Problème avec mon moteur de template - Blocs imbriqués

christophedlr

Membre Club
Ben c'est le tag de fin qui ne doit pas se trouver là, il n'est plus existant en temps normal.
samedi 19 février 2011 à 18:16:10 | Re : Problème avec mon moteur de template - Blocs imbriqués

phpAnonyme

Bon visiblement il semblerait que tu parle de ce qui a dans le code source à savoir <!--/BLOCK_NOM-->, ben c'est sous la forme d'un commentaire donc tu chipote un peu (je me base bien sûre sur le résultat que tu prétend obtenir : et dans ce que as dit je ne vois rien d'anormal).

______________________________________________________________________
samedi 19 février 2011 à 18:29:56 | Re : Problème avec mon moteur de template - Blocs imbriqués

christophedlr

Membre Club
Oups j'ai oublié une information, en fait le vrai problème est que dans les blocs imbriqués, le premier bloc, le second etc. ont exactement la même information alors que j'ai une requête pour chercher le bloc, une autre pour les liens présent à l'intérieur. J'ai donc supposé que le problème venait de ce tag qu'il laisse (je ne sais pas pourquoi d'ailleurs).

Je te file un fichier ZIP contenant le fichier PHP et HTML concernant mon problème à savoir que dans un bloc imbriqué, tout les blocs parents auront les mêmes données même si ils doivent avoir des données différentes. Je t'ai rajouté aussi le fichier SQL pour les tables, ce qui te permet de voir comment mes tables sont construites si tu veux faire un essai par rapport à mon code.

En fait, la table des blocs contient juste son nom, et le nom d'un module (vide si le bloc aura des liens et non un module). La table des menus elle, contient tout les liens avec le numéro ID du bloc auquel le lien appartient.
En tan normal, si un lien est affecté au second bloc, il sera affiché que sur le second, mais là en pratique il affiche aussi sur le premier bloc chose que je ne veux pas bien sur.

Et pourtant ma requête (celle dans la table des menus), va chercher uniquement les liens du bloc concerné par la précédente requête. J'en ai donc conclus à un bug dans le moteur et comme j'ai le tag qui est là alors qu'il devrait pas l'être, j'ai pensé que c'était ça.


P.S : Cela dit même si le tag n'est pas responsable du problème, il est pas sensé être là, mais la priorité est qu'il me mette pas les mêmes données dans tout les blocs, juste ceux qui doivent les avoir.


Merci pour ton aide.
samedi 19 février 2011 à 19:27:03 | Re : Problème avec mon moteur de template - Blocs imbriqués

phpAnonyme

Je te file un fichier ZIP contenant le fichier PHP et HTML


Je n'ai rien reçu et je préfère pas. La communauté doit pouvoir visualiser les avancés etc.

Ceci dit on va quand même essayer de t'aider dans ta tâche avec les infos que tu as fourni.
______________________________________________________________________
samedi 19 février 2011 à 19:56:17 | Re : Problème avec mon moteur de template - Blocs imbriqués

phpAnonyme

Bien, à la fin de la méthode assign_block_vars() pourquoi concataner $contentblock et $this->allcontentblock[$block]
$this->contentfile[$template] = preg_replace('#\<!--BLOCK_'.$block.'--\>(.+)\<!--/BLOCK_'.$block.'--\>#sU',
$contentblock.$this->allcontentblock[$block], $this->contentfile[$template]);

Car en faisant ça, tu fais modifications + sujet d'origine




______________________________________________________________________
samedi 19 février 2011 à 21:37:21 | Re : Problème avec mon moteur de template - Blocs imbriqués

christophedlr

Membre Club
En faisant cela je peux dans une boucle appeler de nouveau assign_block_vars pour parser de nouveau le bloc. C'est ce qui permet par exemple d'afficher la liste des membres (c'est un bloc qui à chaque passage dans la boucle, va remplacer les variables du bloc par leur valeur, dans l'exemple la liste des membres. Remettre donc le bloc permet à nouveau de le parser).


Je ne comprend pas ta phrase : Je n'ai rien reçu et je préfère pas. La communauté doit pouvoir visualiser les avancés etc.

Que veux-tu dire par là ? Le ZIP m'évite de devoir copier/coller tout le code des fichiers concernés, donc je ne vois pas où la communauté peut pas consulter puisque je fournis le lien.

1 2 3

Cette discussion est classée dans : filename, template, directory, if, contentfile


Répondre à ce message

Sujets en rapport avec ce message

upload [ par nbpro ] salu j'ai un problème avec se code j'aimerai savoir comment faire en sorte qu'il renomme pas les fichier une foi le fichier upload header("Expires: Ajouter une ligne de facture, stoquer les informations sasies dans la base de données [ par frayoubessem ] Bonjour tout le monde, Je suis entrain de préparer un formulaire de facture dont il y a des champs de saisi...et un bouton en bas nommé "Ajouter" lor delete checkbox multiple [ par speedylol ] bonjour ;-) Je suis devant un problème j'aimerai votre aide sur se point j'arrive a cocher tous les checkbox mais cela ne ce supprimer je recherche Systeme de template et CAPTCHA [ par zzzzzz ] Bonjour, Je commence à utiliser un système de template : http://phpcodeur.net/articles/php/templates J'arrive à l'utiliser pour assigner du texte m impossible de se connecter a la base sur mon systeme virtuel mais en ligne cela fonctionne [ par lorant59 ] bnnjour à tous et à toutes! jai mon fichier qui permet de valider mon formulaire mais impossible de se connecter à la base lorsque je suis sur mon sys Afficharge Vide [ par ALEXGETHAIME ] salut les amis quelque votre situation geographique. cette note est d'autant plus importante que jamais ce pourquoi je cours vers vous dans le but d'o Parse error: syntax error, unexpected T_STRING in essai.php on line 13 [ par lecocq17 ] Bonjour Je suis toujours aussi nul en PHP J'ai ajouté, au code ci-dessous, un dernier champs à remplir Il me trouve l'erreur suivante : "[i]Parse erro Comment inclure des fonctions [ par cac188 ] Bonjour tout le monde! Je suis entrain de développer une solution simplifier pour les développeurs. Et je bloque sur une petite con*****... Je vous Probleme pagination [ par tif27940 ] Bonjour, Voila j'ai un petit soucis avec ma pagination tout d'abord le code : include "connection.php"; include "fonction.php"; $nombre = 100; Variable de SESSION vide [ par kosovar49 ] Bonjour, Voilà déjà quelques heures que je suis sur mon problème et je ne trouve pas la solution, il me faut peu être un ½il extérieur. [^^happy13] A


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
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 : 4,321 sec (3)

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