GAGA Template

XLetter

Variables dans un fichier inclus dans un bloc

Sujet résolu

Vous devez être inscrit et connecté pour pouvoir écrire dans les forums

Page : 1
Amadeus Posté le 11/10/2007 17:31 - #

Membre
9 messages
Bonjour,

Tout d'abord bravo pour ce moteur de template qui correspond parfaitement à mes besoins

Seulement j'ai un problème (ce serait trop beau ^^), les variables de blocs dans un fichier inclus dans ce même bloc ne sont pas parsés.

Voici le code pour que ce soit plus clair:

Template:

<!-- BEGIN modules_top -->
        {include file="modules_list.tpl"}
<!-- END modules_top -->


PHP:

$template->assign_block('modules_top', array(
        'moduleTitle'   => $blocTitre,
        'moduleName'    => $blocName,
        'moduleId'      => $blocId
));


Et donc les variables ({$moduleId}, etc...) dans le fichier modules_list.tpl ne sont pas parsés...
Comment faire?

Merci,
Amadeus

gaga26 Posté le 11/10/2007 18:31 - #



741 messages
18 ans
Salut,

Le problème vient du fait que quant tu inclut un fichier, mon moteur de templates le compile et le renvoie déjà parsé. Vu qu'il n'y a pas de boucle dans l'include, la boucle n'est pas ou est mal effectuée.

Essai voir de mettre la boucle dans le fichier inclut, peut-être que ça va marché, mais sans garantie. Ou sinon ne fait pas d'include.

A suivre...

Amadeus Posté le 11/10/2007 18:41 - #

Membre
9 messages
C'est possible une variable dans le nom de la boucle?
Parce que si j'ai fait ça c'est que j'ai un fichier assez long qui doit se répéter plusieurs fois et ceci dans plusieurs boucles différentes, donc je ne peux ni mettre une boucle avec un nom spécifique dans le fichier inclus et ni enlever l'include car ce serait impossible à gérer ^^

Il n'y a vraiment pas moyen de faire autrement?

Edité par Amadeus le 11/10/2007 18:41

gaga26 Posté le 11/10/2007 18:54 - #



741 messages
18 ans
Il y a toujours moyen, mais c'est une technique que je n'approuve pas.
<!-- BEGIN modules_top -->
        <?php include($this->this_dir.$this->template_dir.'modules_list.tpl'); ?>
<!-- END modules_top -->


Il y a de bonne chance que ça marche comme ça, mais on perd un peu l'utilité des templates en mettant du PHP dedans...

Amadeus Posté le 11/10/2007 19:10 - #

Membre
9 messages
Euh non même comme ça il n'y a aucun changement

Rien d'autre?
Merci ^^

gaga26 Posté le 11/10/2007 19:16 - #



741 messages
18 ans
Tu as une erreur ou quelque chose qui pourrait nous être utile ?

Amadeus Posté le 11/10/2007 19:47 - #

Membre
9 messages
Non pas d'erreur, mais je vais au cas où détailler plus les fichiers

modules.tpl :

<table style="margin-bottom: 5px;">
        <tr>
                <td colspan="2" class="dispo-position" id="modules_top">
                        <div class="titre" style="margin-bottom: 0px;"><img src="templates/admin/images/titres/haut.png" alt="Haut" /></div>
                       
                        <!-- BEGIN modules_top -->
                                <?php include($this->this_dir.$this->template_dir.'modules_list.tpl'); ?>
                        <!-- END modules_top -->
                </td>
        </tr>
        <tr>
                <td class="dispo-position" id="modules_left">
                        <div class="titre" style="margin-bottom: 0px;"><img src="templates/admin/images/titres/gauche.png" alt="Gauche" /></div>
                       
                        <!-- BEGIN modules_left -->
                                <?php include($this->this_dir.$this->template_dir.'modules_list.tpl'); ?>
                        <!-- END modules_left -->
                </td>
                <td class="dispo-position" id="modules_center">
                        <div class="titre" style="margin-bottom: 0px;"><img src="templates/admin/images/titres/droite.png" alt="Droite" /></div>
                       
                        <!-- BEGIN modules_center -->
                                <?php include($this->this_dir.$this->template_dir.'modules_list.tpl'); ?>
                        <!-- END modules_center -->
                </td>
        </tr>
        <tr>
                <td colspan="2" class="dispo-position" id="modules_bottom">
                        <div class="titre" style="margin-bottom: 0px;"><img src="templates/admin/images/titres/bas.png" alt="Bas" /></div>
                       
                        <!-- BEGIN modules_bottom -->
                                <?php include($this->this_dir.$this->template_dir.'modules_list.tpl'); ?>
                        <!-- END modules_bottom -->
                </td>
        </tr>
</table>


Cette partie une fois compilée:

        <table style="margin-bottom: 5px;">
                <tr>
                        <td colspan="2" class="dispo-position" id="modules_top">
                                <div class="titre" style="margin-bottom: 0px;"><img src="templates/admin/images/titres/haut.png" alt="Haut" /></div>
                               
                                <?php
$this->snapshot_push($this->blocks);
if(!empty($this->blocks["modules_top"]) ){ foreach($this->blocks["modules_top"] as $g_b_var){ ?>
                                        <?php include($this->this_dir.$this->template_dir.'modules_list.tpl'); ?>
                                <?php }}
$this->snapshot_pop($g_b_var);
?>
                        </td>
                </tr>
                <tr>
                        <td class="dispo-position" id="modules_left">
                                <div class="titre" style="margin-bottom: 0px;"><img src="templates/admin/images/titres/gauche.png" alt="Gauche" /></div>
                               
                                <?php
$this->snapshot_push($this->blocks);
if(!empty($this->blocks["modules_left"]) ){ foreach($this->blocks["modules_left"] as $g_b_var){ ?>
                                        <?php include($this->this_dir.$this->template_dir.'modules_list.tpl'); ?>
                                <?php }}
$this->snapshot_pop($g_b_var);
?>
                        </td>
                        <td class="dispo-position" id="modules_center">
                                <div class="titre" style="margin-bottom: 0px;"><img src="templates/admin/images/titres/droite.png" alt="Droite" /></div>
                               
                                <?php
$this->snapshot_push($this->blocks);
if(!empty($this->blocks["modules_center"]) ){ foreach($this->blocks["modules_center"] as $g_b_var){ ?>
                                        <?php include($this->this_dir.$this->template_dir.'modules_list.tpl'); ?>
                                <?php }}
$this->snapshot_pop($g_b_var);
?>
                        </td>
                </tr>
                <tr>
                        <td colspan="2" class="dispo-position" id="modules_bottom">
                                <div class="titre" style="margin-bottom: 0px;"><img src="templates/admin/images/titres/bas.png" alt="Bas" /></div>
                               
                                <?php
$this->snapshot_push($this->blocks);
if(!empty($this->blocks["modules_bottom"]) ){ foreach($this->blocks["modules_bottom"] as $g_b_var){ ?><?php }}
$this->snapshot_pop($g_b_var);
?>
                        </td>
                </tr>
        </table>


modules_list.tpl:

<table id="module_{$moduleName}-{$moduleId}" class="module">
        <tr>
                <td rowspan="2" style="width: 90px;"><img src="{$moduleIcon}" alt="{$moduleName}" /></td>
                <td style="vertical-align: bottom; text-align: left; padding-left: 21px;">{$moduleTitle}</td>
        </tr>
        <tr>
                <td style="text-align: left;">
                        <img src="templates/admin/images/add_small.png" alt="Configurer" style="vertical-align: middle;" />
                        <a href="admin.php?module={$moduleName}&moduleid={$moduleId}&pageid={$currentPageId}">Configurer</a>
                       
                       
                        <img src="templates/admin/images/remove_small.png" alt="Supprimer" style="vertical-align: middle;" />
                        <a href="#" onclick="javascript:deleteModule('module_{$moduleName}-{$moduleId}', '{$currentPageId}'); return false;">Supprimer</a>
                </td>
        </tr>
</table>


Et le résultat final tel que affiché par le naviguateur:

        <table style="margin-bottom: 5px;">

                <tr>
                        <td colspan="2" class="dispo-position" id="modules_top">
                                <div class="titre" style="margin-bottom: 0px;"><img src="templates/admin/images/titres/haut.png" alt="Haut" /></div>
                               
                                                                        <table id="module_{$moduleName}-{$moduleId}" class="module">
        <tr>
                <td rowspan="2" style="width: 90px;"><img src="{$moduleIcon}" alt="{$moduleName}" /></td>
                <td style="vertical-align: bottom; text-align: left; padding-left: 21px;">{$moduleTitle}</td>
        </tr>

        <tr>
                <td style="text-align: left;">
                        <img src="templates/admin/images/add_small.png" alt="Configurer" style="vertical-align: middle;" />
                        <a href="admin.php?module={$moduleName}&moduleid={$moduleId}&pageid={$currentPageId}">Configurer</a>
                       
                       
                        <img src="templates/admin/images/remove_small.png" alt="Supprimer" style="vertical-align: middle;" />
                        <a href="#" onclick="javascript:deleteModule('module_{$moduleName}-{$moduleId}', '{$currentPageId}'); return false;">Supprimer</a>
                </td>

        </tr>
</table>                                                        </td>
                </tr>
                <tr>
                        <td class="dispo-position" id="modules_left">
                                <div class="titre" style="margin-bottom: 0px;"><img src="templates/admin/images/titres/gauche.png" alt="Gauche" /></div>
                               
                                                                        <table id="module_{$moduleName}-{$moduleId}" class="module">
        <tr>
                <td rowspan="2" style="width: 90px;"><img src="{$moduleIcon}" alt="{$moduleName}" /></td>

                <td style="vertical-align: bottom; text-align: left; padding-left: 21px;">{$moduleTitle}</td>
        </tr>
        <tr>
                <td style="text-align: left;">
                        <img src="templates/admin/images/add_small.png" alt="Configurer" style="vertical-align: middle;" />
                        <a href="admin.php?module={$moduleName}&moduleid={$moduleId}&pageid={$currentPageId}">Configurer</a>
                       
                       
                        <img src="templates/admin/images/remove_small.png" alt="Supprimer" style="vertical-align: middle;" />

                        <a href="#" onclick="javascript:deleteModule('module_{$moduleName}-{$moduleId}', '{$currentPageId}'); return false;">Supprimer</a>
                </td>
        </tr>
</table>                                                        </td>
                        <td class="dispo-position" id="modules_center">
                                <div class="titre" style="margin-bottom: 0px;"><img src="templates/admin/images/titres/droite.png" alt="Droite" /></div>
                               
                                                                        <table id="module_{$moduleName}-{$moduleId}" class="module">
        <tr>

                <td rowspan="2" style="width: 90px;"><img src="{$moduleIcon}" alt="{$moduleName}" /></td>
                <td style="vertical-align: bottom; text-align: left; padding-left: 21px;">{$moduleTitle}</td>
        </tr>
        <tr>
                <td style="text-align: left;">
                        <img src="templates/admin/images/add_small.png" alt="Configurer" style="vertical-align: middle;" />
                        <a href="admin.php?module={$moduleName}&moduleid={$moduleId}&pageid={$currentPageId}">Configurer</a>
                       

                       
                        <img src="templates/admin/images/remove_small.png" alt="Supprimer" style="vertical-align: middle;" />
                        <a href="#" onclick="javascript:deleteModule('module_{$moduleName}-{$moduleId}', '{$currentPageId}'); return false;">Supprimer</a>
                </td>
        </tr>
</table>                                                        </td>
                </tr>
                <tr>
                        <td colspan="2" class="dispo-position" id="modules_bottom">

                                <div class="titre" style="margin-bottom: 0px;"><img src="templates/admin/images/titres/bas.png" alt="Bas" /></div>
                               
                                                        </td>
                </tr>
        </table>


Au passage on peut remarquer que la variable {$currentPageId} qui elle n'est pas déclarée dans un bloc est correctement parsée lorsque j'inclus le fichier avec {include} mais qu'elle ne l'est pas quand j'utilise ta technique de <?php include(...); ?>, donc quand on fait ça le fichier n'est pas parsé du tout

Amadeus Posté le 11/10/2007 21:53 - #

Membre
9 messages
Bon dans le fichier gaga.class.php ligne 202 j'ai remplacé

$rep = '<?php $this->parse("'.str_replace('\\','\\\\',$fichier).'"); ?>';


par

$rep = file_get_contents($this->this_dir.$this->template_dir.$fichier);


pour que tout soit parsé en un seul fichier et tout semble marcher correctement, donc à suivre mais pour l'instant il ne semble pas y a avoir de problèmes comme ça

Amadeus Posté le 11/10/2007 22:07 - #

Membre
9 messages
Et j'en profite pour rajouter (désolé pour le triple poste ^^) que ligne 237 il convient remplacer

$key = $this->blocks;
$for = $this->blocks[$match1[2]][0];
$search = $match1[2];


par

if(array_key_exists($match1[2], $this->blocks)) {
        $key = $this->blocks;
        $for = $this->blocks[$match1[2]][0];
        $search = $match1[2];
}


et ligne 275 il convient de rajouter

$sea = array();
$rep = array();


Sinon PHP affichera un Notice lorsqu'un bloc est vide (premier cas) et lorsque qu'aucune variable n'a été assignée (deuxième cas)

EDIT: Arf j'avais pas vu la technique pour les blocs vides ne marche pas, je regarde ça...
EDIT: Corrigé (voir début du poste) ^^

Edité par Amadeus le 11/10/2007 22:53

Amadeus Posté le 11/10/2007 22:52 - #

Membre
9 messages
Bon je continue avec mon histoire:

Maintenant j'essaye de faire une inclusion dynamique avec une variable assignée dans un bloc:

<!-- BEGIN modules_top -->
        {include file="$includeFile"}
<!-- END modules_top -->


$template->assign_block('modules_top', array('includeFile' => 'modules/menu/menu.tpl'));


Et bien sûr, ça ne marche pas!

Donc quelqu'un aurait-il une solution pour faire ceci?
Merci ^^

gaga26 Posté le 12/10/2007 20:40 - #



741 messages
18 ans
Ce n'était pas possible avant la dernière version, mais maintenant ça devrait être bon.

Amadeus Posté le 12/10/2007 20:53 - #

Membre
9 messages
C'est à dire? J'ai la 3.3 et ça ne marche pas

EDIT: Apparemment ça marche juste quand la variable est assignée avec assign(), pas quand c'est dans un bloc avec assign_block().

Edité par Amadeus le 12/10/2007 20:54

gaga26 Posté le 12/10/2007 21:08 - #



741 messages
18 ans
Citation : Amadeus
EDIT: Apparemment ça marche juste quand la variable est assignée avec assign(), pas quand c'est dans un bloc avec assign_block().

Ca doit être ça.

Amadeus Posté le 13/10/2007 21:30 - #

Membre
9 messages
C'est bon problème résolu!

Ze Thriller Posté le 24/10/2007 12:56 - #


Membre
105 messages
24 ans
On ne le dira jamais assez:

Les includes à répétition, en particulier dans les boucles, sont une atteinte monstrueuse à la stabilité d'un script (cad fort risque de plantage) et affecte fortement(en diminution ) la vitesse de traitement/d'affichage d'une page.

Donc:

Includes à répétition dans une boucle: à bannir.

Préfère la structure blocs/sous-blocs, d'autant plus que désormais le niveau de blocs est illimité ^^

Page : 1

Vous devez être inscrit et connecté pour pouvoir écrire dans les forums

Retour au forum Variables, à la liste des forums, ou au haut de page