symfony 将twig中的变量传递到包含的模板

7xzttuei  于 2023-06-24  发布在  其他
关注(0)|答案(5)|浏览(103)

我已经设置了一个导航菜单的渲染在一个单独的小枝模板。原因是菜单在应用程序中的两个不同位置生成。
现在我想给予一个参数的导航菜单,所以我知道从与地方,它是产生这些小的差异。
我尝试了以下代码,但在导航菜单模板中不知道该变量:

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

还尝试:

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

在这两种情况下,wig都生成了{{ menuType }}不存在的错误。

k75qkfdt

k75qkfdt1#

令人惊讶的是,虽然我认为可以像您一样传递一个简单的变量,但似乎只有数组被接受为传递值。(虽然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文档的测试,第四行是使用另一个变量名的测试,只是为了确保。

jmp7cifd

jmp7cifd2#

只要变量可用,或包含在父模板中,它就可用于任何包含的模板或子模板。
例如:控制器:

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

然后,编辑. 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

dw1jzc5e

dw1jzc5e3#

我在这里为你创建了一个小提琴样本:
https://twigfiddle.com/fpzv26
你需要这样的东西:

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

soat7uwm4#

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

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

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

qq24tv8q

qq24tv8q5#

Twig 3建议使用include function而不是include tag,它看起来像这样:

{{ include('MyBundle:nav.html.twig', {menuType: user}, with_context = false) }}

with_context = false阻止传递除包含内的变量之外的任何其他变量。

相关问题