将树枝中的变量传递给包含的模板

时间:2017-01-12 22:53:15

标签: symfony twig

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

现在我想给导航菜单一个参数,所以我从地方知道它产生的是这些一些小差异。

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

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

也尝试过:

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

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

4 个答案:

答案 0 :(得分:4)

令人惊讶的是,虽然我认为可以像你一样传递一个简单的变量,但似乎只有数组被接受为传递值。 (虽然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 %#}

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

  

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

第二个可以按你的方式工作,你只需要把它变成一个数组。 (无论如何都很奇怪)

第三行是来自Twig doc的测试,第四行是另一个变量名的测试,只是为了确定。

答案 1 :(得分:0)

我在我的代码中使用它,它适用于我。变量foo直接用于baz.html.twig

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

在枝条文档中,它说:

  

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

答案 2 :(得分:0)

我在这里为你创建了一个样本twigfiddle:

https://twigfiddle.com/fpzv26

你需要这样的东西:

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

答案 3 :(得分:0)

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

例: 控制器:

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

&#39;表格&#39;来自控制器的变量可用于包含的模板form.html.twig