首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从smarty块函数开始新的变量作用域

从smarty块函数开始新的变量作用域
EN

Stack Overflow用户
提问于 2014-02-14 02:10:33
回答 1查看 306关注 0票数 1

我正在使用一个块函数来加载数据,而不会污染本地作用域:

代码语言:javascript
复制
<h1>{$title}</h1>

{loadstuff}
     <h2>{$title}</h2>
     <p>{$text}</p>
{/loadstuff}

<p>{$text}</p>

有没有在块函数中启动新变量作用域的好方法?在Smarty2中,我使用了这个技巧:

代码语言:javascript
复制
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中添加作用域的方法。现在我正在做这件事:

代码语言:javascript
复制
$smarty->clearAllAssign();
$smarty->assign('smarty', $smarty); // It seems to be necessary
$smarty->assign(array_pop($replace_stack));

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

EN

回答 1

Stack Overflow用户

发布于 2014-12-19 04:02:05

下面是让getTemplateVars()像samrty2一样工作的方法。

“文件: smarty_internal_templatebase.php”,部分

代码语言:javascript
复制
 if ($merge_tpl_vars){} , 

在这里我们可以合并模板解析时分配的变量,

代码语言:javascript
复制
$_template->tpl_vars = $save_tpl_vars

可以更改为:

代码语言:javascript
复制
$this->tpl_vars = array_merge($this->tpl_vars, $save_tpl_vars, $_template->tpl_vars);

现在,像smarty2一样,smarty3 getTemplateVars()返回在模板中分配的变量

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21762190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档