Symfony 2 + Twig全局变量

8

如何使Twig全局变量在使用include标签后保持修改?我期望的输出是“set @ deeper”,但实际上得到的是“original setting”。

app/config/config.yml

twig:
    globals:
      testvar: "original setting"

root.html.twig

{% include "MyBundle::levelone.html.twig" %}
{{ testvar }}

levelone.html.twig

{% set testvar = "set @ levelone" %}
{% include "MyBundle::deeper.html.twig" %}

deeper.html.twig

{% set testvar = "set @ deeper" %}

你尝试过使用块吗?我的意思是,将所有的 {% set testvar %}{{ testvar }} 包裹在 {%block global_test %} 中。 - Florian Klein
4个回答

8

从容器感知对象开始:

$this->get('twig')->addGlobal('ThomasDecauxIsAwsome', 4);

6
有趣的问题,我不知道答案,但是任何与块和其他东西相关的折腾都不会起作用。我查看了生成的php缓存模板文件。当你echo一个变量时,它看起来像这样:
// {{ testvar }}
echo twig_escape_filter($this->env, $this->getContext($context, "testvar"), "html", null, true);

基本上它首先在您的本地上下文中查找testvar。如果没有找到,则会在全局上下文中查找。

当您设置test var的值时,您将获得:

// {% set testvar = 'level one' }}
$context["testvar"] = "level one";

因此,只有本地上下文得到更新。当包含的模板返回时,更改的值就会消失。

因此,默认情况下,全局变量看起来确实是只读的。

可能可以通过扩展来实现这一点。我对内部机制了解不足。


1

你尝试过通过Twig定义全局变量吗?你可以在config.yml文件中按照以下方式实现:

twig:
    globals:
        my_global_var : myvalue

因此,在您的模板中,{{my_global_var}} 将打印 myvalue

有关更多信息,请阅读官方文档


在我的Symfony2.1项目中,我该如何放置这两行代码:“$twig = new Twig_Environment($loader); $twig->addGlobal('text', new Text());”? - linuxatico
好的,我还没有使用Symfony2.1,因为它是一个beta版本。不过,我可以说在Symfony2.016中,你可以像这里提供的那样,在config.yml文件中定义全局变量。链接 - JeanValjean
1
事实上,这种方式下变量是只读的。我的意思是,在模板中你可以改变它的值,但是当你从另一个模板中访问它时,你会发现它的值现在是在config.yml中设置的默认值。 - linuxatico
1
如果您只想更改当前用户的值,可以读取一次并将其存储在会话变量中。如果您需要更改所有用户的值,则使用数据库。 - JeanValjean

0

可以通过使用服务定义一个Twig扩展来实现,详见这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接