2014-09-08 2 views
0

version Smarty 2 si je capture une chaîne statique:Smarty capture {foreach} résultats dans la variable vide

{capture name=test} 
a huge page or string can go here 
{/capture} 

je peux simplement utiliser {$ smarty.capture.test} pour vider ma chaîne capturée dans mes deux modèle en cours ou dans un modèle enfant sans problème

Si je tente une capture « {foreach} » boucle comme:

{capture name=test} 
    {foreach item=Row from=$DataGrid.Rows name=RowsGrid} 
    ,['{$Row.DataCells.project_name.Data}', {$Row.DataCells.approved_budget.Data}] 
{/foreach} 
{/capture} 

je peux l'utiliser facilement dans le modèle actuel comme:

{$smarty.capture.test} 

et il affiche les données correctes sous la forme d'une chaîne. cependant lorsque je tente l'utiliser dans un modèle de l'enfant:

{include file='/full/path/child.tpl'} 
{$smarty.capture.test} 

cela se traduira par des données capturées vides comme:

,['', ] ,['', ] ,['', ] 

si j'utilise {$ smarty.capture.test | var_dump} il montre comme "string (86)" qu'est-ce qui me manque ici?

Répondre

0

Je suppose dans votre dernier exemple que child.tpl remplit la variable de test, et vous essayez ensuite de l'utiliser dans le modèle inclus par la suite. Given how Smarty handles scope la sortie vide est complètement droite - la portée hérite seulement vers le bas. Un parent ne peut pas accéder aux variables définies par son enfant. Apparemment, l'utilisation directe de la variable dans un filtre contourne les contrôles d'étendue, ce qui serait certainement un bogue dans l'implémentation. Ensuite, Smarty 2 est âgé de plusieurs années, v3 has been with us for years et Twig est beaucoup plus pratique dans l'ère HTML5.

+0

Je suppose que ma ténacité est le résultat de cette déclaration: « Cela signifie que vous pouvez utiliser toutes les variables à partir du modèle, y compris à l'intérieur du modèle inclus » tiré de: http://www.smarty.net/docsv2/en /language.function.include.tpl Je n'ai pas vraiment le luxe d'échanger des moteurs de gabarits pour le moment, je suis donc bloqué en essayant d'obtenir des variables d'un gabarit à un autre. Donc, pour être clair: dites-vous que ce n'est pas possible et le fait que je peux obtenir une variable statique transmise à partir d'un enfant.tpl est un bug? – Lookfar

+0

La déclaration que vous avez citée est correcte: scope hérite * vers le bas *, vous pouvez utiliser les variables du template * incluant * (ie le parent) dans le template * inclus * (child.tpl). L'inverse n'est pas prévu et pourrait entraîner des effets dramatiques. Cela me semble être un bug. –

+0

Le problème auquel je suis confronté est que j'ai un "tableau de bord" qui, faute d'un meilleur terme, j'ai appelé un "parent". le tableau de bord affiche une série de graphiques google, il y a 6 graphiques chacun avec son propre modèle. J'essaie d'obtenir tous les 6 tableaux sur cette page "Dashboard". Donc, en utilisant la portée «vers le bas», comment pourrais-je aller à ce sujet, des pensées? – Lookfar

0

Il fonctionne pour moi sans problème:

fichier PHP:

$smarty->assign('data', array(
     array('name' => 'a1'), 
     array('name' => 'a2'), 
     array('name' => 'a3'), 
     array('name' => 'a4'), 
     array('name' => 'a5') 
    )); 
$smarty->display('normal.tpl'); 

fichier normal.tpl:

{include file='child.tpl'} 
{$smarty.capture.test} 

fichier child.tpl:

{capture name = test} {foreach item = Rangée depuis = $ data} , [ '{$ Row.name}'] {/ foreach} {/ capture}

sortie pour c'est comme prévu:

,['a1'] ,['a2'] ,['a3'] ,['a4'] ,['a5'] 

Vous devez vous assurer que vous avez vos variables affectées correctement et si ce n'est pas le cas, vous devriez fournir plus de détails.