从 smarty 块函数启动新的变量作用域

问题描述 投票:0回答:1

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

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

这真的很丑。你知道我有什么方法可以改进吗?

php scope smarty3
1个回答
0
投票

我们可以做些什么来让 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

© www.soinside.com 2019 - 2024. All rights reserved.