smarty capture {foreach}导致空变量

时间:2014-09-08 21:35:49

标签: php smarty smarty2

Smarty版本2 如果我捕获一个静态字符串:

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

我可以简单地使用{$ smarty.capture.test}将我捕获的字符串转储到我当前的模板或子模板中没问题

如果我尝试捕获“{foreach}”循环,如:

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

我可以在当前模板中轻松使用它,如:

   {$smarty.capture.test}

并以字符串形式显示正确的数据。 但是当我尝试在儿童模板中使用它时:

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

它将导致空的捕获数据,如:

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

如果我使用{$ smarty.capture.test | var_dump}它显示为“string(86)” 我在这里错过了什么?

2 个答案:

答案 0 :(得分:0)

我假设您的上一个示例中child.tpl填充了测试变量,然后您尝试在包含模板中使用它。 Given how Smarty handles scope空输出完全正确 - 范围仅向下继承。父级无法访问其子级设置的变量。

显然在过滤器中直接使用变量会绕过范围检查,这肯定是实现中的错误。再说一次,Smarty 2已经有好几年了,v3 has been with us for yearsTwig在HTML5时代更加实用。

答案 1 :(得分:0)

它对我没有问题:

PHP文件:

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

normal.tpl档案:

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

child.tpl档案:

{capture name=test}
    {foreach item=Row from=$data}
        ,['{$Row.name}']
    {/foreach}
{/capture}

此输出符合预期:

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

您应该确保正确分配了变量,如果不是这样,您应该提供更多详细信息。