我使用块函数来加载数据而不污染本地范围:
<h1>{$title}</h1>
{loadstuff}
<h2>{$title}</h2>
<p>{$text}</p>
{/loadstuff}
<p>{$text}</p>
有没有一种好方法可以在块函数中启动新的变量作用域?在 Smarty2 中,我使用了这个 hack:
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;
}
$template_vars 上的参考替换不适用于 Smarty3。 Smarty3 在作用域方面做了很多改变,我希望可以启动一个嵌套作用域。不幸的是,我找不到在 API 中添加作用域的方法。现在我正在做这个黑客:
$smarty->clearAllAssign();
$smarty->assign('smarty', $smarty); // It seems to be necessary
$smarty->assign(array_pop($replace_stack));
这真的很丑。你知道我有什么方法可以改进吗?
我们可以做些什么来让 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);
现在 smarty3 getTemplateVars() 返回模板中分配的变量,就像 smarty2