避免树枝块输出

Avoid twig block output

我有以下树枝模板

{%- block block1 -%}
    <div class="test">
        {{ block('block2') }}
    </div>
{%- endblock block1 -%}

{%- block block2 -%}
    <div>Test2</div>
{%- endblock block2 -%}

结果是:

<div class="test">
        <div>Test2</div>
</div><div>Test2</div>

但应该是:

<div class="test">
        <div>Test2</div>
</div>

我想做一些类似 symfony 中的表单模板的事情:https://github.com/symfony/symfony/blob/2.7/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig

更新:

唯一的解决办法是添加一个看起来不太好的 if false:

{%- block block1 -%}
    <div class="test">
        {{ block('block2') }}
    </div>
{%- endblock block1 -%}

{% if false %}
    {%- block block2 -%}
        <div>Test2</div>
    {%- endblock block2 -%}
{% endif %}

如果您以不同的方式分离得到的结果,它将帮助您了解发生了什么:

// block1 with block2 inserted
<div class="test">
        <div>Test2</div>
</div>
// block2
<div>Test2</div>

即当您定义 block2 时,它不仅会插入到 block1 中,还会在定义它的地方呈现。您可以尝试以其他方式构建此功能,例如使用 include 函数

您必须添加表单主题才能呈现这些自定义块,或者像 Carlos Granados 所说的那样,您必须在此处包含其他树枝。

您显示的 link 是 symfony2 表单主题,它将在调用表单块时呈现,并且它正在这样做是因为您告诉 symfony2 这样做。在你的布局树枝中添加这样的文件 -

   {% form_theme form "UrBundle:Default:fields.html.twig" %}

您的文件将渲染您的块 - fields.html.twig, 在这里你可以定义你的块,然后可以访问当前的块 -

{% block block1 %}
   {{ parent() }}
{% endblock %}

出来就是你想要的样子link

你为什么要这样定义你的块?或者换句话说:您可以像这样简单地在第一个块内定义第二个块:

{%- block block1 -%}
    <div class="test">
        {%- block block2 -%}
            <div>Test2</div>
        {%- endblock block2 -%}
    </div>
{%- endblock block1 -%}

在 twig 中,呈现的主模板将始终呈现模板中的所有块 "included",即使 extends 也是如此。相反,您正在尝试创建水平重用块。

为了产生您想要的结果,您需要实施 {% use 'blocks.twig' %}

这种方法对于您打算完成的事情非常主观,并且在常规模板中通常不需要。

示例https://twigfiddle.com/fwjpl8

{# main.html.twig #}
{% use 'info.blocks.twig' %}

{%- block content -%}
    {%- set data = { name: 'Test', place: 'Test2' } -%}
    {{ block('data') }}
{%- endblock -%}
{# info.blocks.twig #}
{%- block data -%}Data {{ data.name }} {{ block('data_place') }}{%- endblock -%}

{%- block data_place -%}{{ data.place }}{%- endblock -%}

结果:

Data test test2

请记住 use.

有限制

The use tag only imports a template if it does not extend another template, if it does not define macros, and if the body is empty. But it can use other templates.

所以你做不到

{# main.html.twig #}
{% use 'info.blocks.twig' %}
{# info.blocks.twig #}
{% extends 'other.blocks.twig' %}

{%- block data -%}Data {{ data.name }} {{ block('data_place') }}{%- endblock -%}

{%- block data_place -%}{{ data.place }}{%- endblock -%}