我已将导航菜单的渲染设置为单独的树枝模板。原因是在应用程序的两个不同位置生成菜单。
现在我想给导航菜单一个参数,所以我从地方知道它产生的是这些一些小差异。
我尝试了以下代码,但导航菜单模板中不知道该变量:
{% set menuType = 'user' %}
{% include 'MyBundle:nav.html.twig' with menuType %}
也尝试过:
{% include 'MyBundle:nav.html.twig' with {'menuType': 'user'} %}
在这两种情况下,twig都会生成{{menuType}}不存在的错误?
答案 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:
你需要这样的东西:
{% 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