我正在使用一个块函数来加载数据,而不会污染本地作用域:
<h1>{$title}</h1>
{loadstuff}
<h2>{$title}</h2>
<p>{$text}</p>
{/loadstuff}
<p>{$text}</p>有没有在块函数中启动新变量作用域的好方法?在Smarty2中,我使用了这个技巧:
function smarty_block_loadstuff($params, $content, $smarty, &$repeat) {
static $replace_stack = array();
if ($repeat) {
$replace_stack []= $smarty->get_template_vars();
$smarty->assign(loadstuff());
} else {
// Reload the original vars
$template_vars = &$smarty->get_template_vars();
$template_vars = array_pop($replace_stack);
}
return $content;
}对于Smarty3,$template_vars上的引用替换不起作用。Smarty3在作用域方面做了很大的改变,我希望可以开始一个嵌套的作用域。不幸的是,我找不到在API中添加作用域的方法。现在我正在做这件事:
$smarty->clearAllAssign();
$smarty->assign('smarty', $smarty); // It seems to be necessary
$smarty->assign(array_pop($replace_stack));这真的很丑陋。你知道有什么我可以改进的方法吗?
发布于 2014-12-19 04:02:05
下面是让getTemplateVars()像samrty2一样工作的方法。
“文件: smarty_internal_templatebase.php”,部分
if ($merge_tpl_vars){} , 在这里我们可以合并模板解析时分配的变量,
$_template->tpl_vars = $save_tpl_vars可以更改为:
$this->tpl_vars = array_merge($this->tpl_vars, $save_tpl_vars, $_template->tpl_vars);现在,像smarty2一样,smarty3 getTemplateVars()返回在模板中分配的变量
https://stackoverflow.com/questions/21762190
复制相似问题