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)” 我在这里错过了什么?
答案 0 :(得分:0)
我假设您的上一个示例中child.tpl
填充了测试变量,然后您尝试在包含模板中使用它。 Given how Smarty handles scope空输出完全正确 - 范围仅向下继承。父级无法访问其子级设置的变量。
显然在过滤器中直接使用变量会绕过范围检查,这肯定是实现中的错误。再说一次,Smarty 2已经有好几年了,v3 has been with us for years和Twig在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']
您应该确保正确分配了变量,如果不是这样,您应该提供更多详细信息。