【问题标题】:Symfony 2 + Twig global variablesSymfony 2 + Twig 全局变量
【发布时间】:2012-02-13 16:15:52
【问题描述】:

如何在使用包含更改后获得一个树枝全局变量以保持修改?尽管我得到了“原始设置”,但我想要的输出是“设置@更深”。

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" %}

【问题讨论】:

  • 你尝试过块内吗?我的意思是,用{%block global_test %} 包裹你所有的{% set testvar %}{{ testvar }}

标签: symfony twig


【解决方案1】:

来自容器感知对象:

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

【讨论】:

    【解决方案2】:

    有趣的问题,我不知道答案,但再多的玩弄积木和东西都行不通。我查看了生成的 php 缓存模板文件。当你回显一个变量时,它看起来像:

    // {{ 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";
    

    所以只有本地上下文被更新。当包含的模板返回时,更改的值会消失。

    所以默认情况下,至少看起来全局变量实际上是只读的。

    也许可以通过扩展来做到这一点。我对内部的了解还不够。

    【讨论】:

      【解决方案3】:

      您是否尝试过通过 Twig 定义全局变量?您可以在您的 config.yml 文件中执行以下操作:

      twig:
          globals:
              my_global_var : myvalue
      

      所以模板中的{{my_global_var}} 将打印myvalue

      更多信息请阅读official docs

      【讨论】:

      • 我该如何输入这两行:"$twig = new Twig_Environment($loader); $twig->addGlobal('text', new Text());"在我的 symfony2.1 项目中?
      • 好吧,我还没有使用 Symfony2.1,因为它是一个测试版。但是,我可以说,使用 Symfony2.016,您可以在 config.yml 文件中定义一个全局变量,如提供的here
      • 事实是这样的变量是只读的,我的意思是,在一个模板中你可以改变它的值,但是当你从另一个模板访问它时,你会发现它的值是现在config.yml 中的默认设置
      • 如果您有兴趣仅更改当前用户的值,您可以读取一次并将其存储在会话变量中。如果您需要更改所有用户的值,请使用数据库。
      【解决方案4】:

      可以通过Services定义一个Twig Extension,检查here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-10
        • 2017-08-15
        • 1970-01-01
        相关资源
        最近更新 更多