Accueil > Forum > > > > Problème avec mon moteur de template - Blocs imbriqués
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
|
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écifié une chaîne de caractères<br />";
}
/*Ouvre un template*/
function open($filename, $directory = '')
{
if ( !is_string($filename) )
{
echo "Erreur Template::open - Vous n'avez pas entré 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é un fichier é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é 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é 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é un booléen comme second paramè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
|
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 :
J'ai :
Code :
|
|
samedi 19 février 2011 à 18:08:40 |
Re : Problème avec mon moteur de template - Blocs imbriqués

phpAnonyme
|
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
|
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
|
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
|
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.
|
|
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
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|