从智能块功能启动新的变量范围

时间:2014-02-13 18:10:33

标签: scope smarty3

我正在使用块函数来加载数据而不会污染本地范围:

<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;
}

$ template_vars上的参考替换不适用于Smarty3。 Smarty3在范围界定方面做了很多改变,我希望可能只是启动一个嵌套范围。不幸的是,我发现无法在API中添加范围。现在我正在做这个黑客:

$smarty->clearAllAssign();
$smarty->assign('smarty', $smarty); // It seems to be necessary
$smarty->assign(array_pop($replace_stack));

哪个真的很难看。你知道我可以改进的方法吗?

1 个答案:

答案 0 :(得分:0)

我们可以做些什么来让getTemplateVars()像samrty2一样工作,

&#34; file:smarty_internal_templatebase.php&#34; , 部分&#34;

 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