【问题标题】:Pass variable in twig to included template将树枝中的变量传递给包含的模板
【发布时间】:2017-01-12 22:53:15
【问题描述】:

我已将导航菜单的呈现设置为单独的树枝模板。原因是菜单是在应用程序的两个不同位置生成的。

现在我想为导航菜单提供一个参数,这样我就可以从生成它的地方知道这些是一些小的差异。

我尝试了以下代码,但导航菜单模板中的变量不知道:

{% set menuType = 'user' %}
{% include 'MyBundle:nav.html.twig' with menuType %}

也试过了:

{% include 'MyBundle:nav.html.twig' with {'menuType': 'user'} %}

在这两种情况下,twig 都产生了 {{ menuType }} 不存在的错误?

【问题讨论】:

    标签: symfony twig


    【解决方案1】:

    令人惊讶的是,虽然我认为可以像您一样传递一个简单的变量,但似乎只接受数组作为传递值。 (虽然include doc 的两个示例是数组,但没有特别精确。)

    在你的情况下,你必须这样写:

    {% set menuType = 'user' %}
    {% include 'MyBundle:nav.html.twig' with {menuType:menuType} only %}
    

    注意:我添加了only 关键字来禁用对上下文的访问。 没有它,您不需要将变量传递给包含的模板,因为它们可以访问它们。 (最好禁用它。)

    这是一个带有一些测试和转储的 Twigfiddle:https://twigfiddle.com/gtnqvv

    {% set menuType = 'user' %}
    {% set vars = {'foo': 'bar'} %}
    {% set z = 'bob' %}
    
    {# vars dumps ommitted here, see the fiddle. #}
    
    {#% include '1.html.twig' with menuType only %#}
    {% include '1.html.twig' with {menuType:menuType} only %}
    {% include '2.html.twig' with vars only %}
    {% include '3.html.twig' with {z:z} only %}
    {#% include '3.html.twig' with z only %#}
    

    第一个和最后一个注释行不起作用,如您所知,这是错误:

    未捕获的类型错误:传递给 Twig_Template::display() 的参数 1 必须 是数组类型,给定字符串

    第二个按你的意愿工作,你只需要把它变成一个数组。 (反正很奇怪)

    第三行是 Twig 文档中的测试,第四行是另一个变量名的测试,只是为了确定。

    【讨论】:

      【解决方案2】:

      只要变量可用,或包含在父模板中,它就可用于任何包含或子模板。

      例如: 控制器:

      return $this->render('CmsBundle:EmailBulk:edit.html.twig', array(
                  'entity' => $entity,
                  'form'   => $editForm->createView(),
                  'tokens' => $tokens
              ));
      

      然后,edit.html.twig:

      {% block body -%}
          <div class="panel panel-default animated fadeIn delay-400">
              <div class="panel-heading">
                  blah blah blah
              </div>
              <div class="panel-body">
                  {{ include('CmsBundle:EmailBulk:form.html.twig') }}
              </div>
          </div>
      {% endblock %}
      

      控制器中的“form”变量可用于包含的模板 form.html.twig

      【讨论】:

      • 这适用于控制器。但是当我在父树枝中定义一个新变量 {% set menuType = 'user' %} 时,它不会传递给子树枝。
      【解决方案3】:

      我在这里为您创建了一个示例 twigfiddle:

      https://twigfiddle.com/fpzv26

      你需要这样的东西:

      {% set vars = { 'menuType' : 'user'} %}
      {% include 'MyBundle:nav.html.twig' with vars %}
      

      【讨论】:

      • 在 twigfiddle 中,我不得不缩短模板文件名称的长度。我抱怨 21 个字符的限制,所以我使用了“nav.html.twig”。
      • 它不允许传递一个不是数组的变量,比如@Tom 的 menuType。
      • 对@Veve,我看到了你的帖子。实际上,当我制作我的twigfiddle时,我也注意到了这一点。我认为 OP 的原始帖子也应该有效,这就是我去 twigfiddle 的原因。我发现和你做的一样。它必须是一个数组。希望 OP 明白这一点。
      【解决方案4】:

      我在我的代码中使用它,它对我有用。 var foo 直接用在baz.html.twig 中:

      {% set foo = 'foo' %}
      {{ include ('MyBundle:bar:baz.html.twig') }}
      

      在树枝文档中它说:

      包含的模板可以访问活动上下文的变量。 [...] 上下文默认传递给模板,但您也可以传递其他变量

      【讨论】:

      • 请注意,最好使用 only 关键字禁用对上下文的访问。
      • @DarkBee 通常,将访问代码限制在其周围范围内是一种很好的做法,原因与全局变量(大多数)是不好的做法的原因相同。 Twig 默认将整个父上下文传递给子包含,如果子模板只需要一个特定变量,则这是不必要的。
      猜你喜欢
      • 2013-04-05
      • 2016-05-11
      • 2016-02-20
      • 2016-07-17
      • 2020-01-06
      • 2015-03-21
      • 2011-05-30
      • 2017-07-22
      相关资源
      最近更新 更多