避免树枝块输出

时间:2015-10-12 15:15:14

标签: symfony twig

我有以下树枝模板

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

4 个答案:

答案 0 :(得分:2)

为什么要以这种方式定义块?换句话说:你可以简单地在第一个块中定义第二个块,如下所示:

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

答案 1 :(得分:1)

如果您以不同的方式分离结果,它将帮助您了解正在发生的事情:

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

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

答案 2 :(得分:1)

你必须添加你的表单主题来渲染这些自定义块,或者像Carlos Granados这样说你必须在这里添加其他树枝。

你要显示的是哪个链接是symfony2表单主题,它将在表单块调用时呈现,并且它正在执行它,因为你告诉symfony2这样做。在你的布局树枝上添加这样的文件 -

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

它将是您的文件,它将呈现您的块 - fields.html.twig, 在这里,您可以定义您的块,然后可以访问当前的块 -

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

它会像你想要的那样link

答案 3 :(得分:0)

在树枝中,即使使用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上有一些限制。

  

use标签仅在不扩展另一个模板的情况下才导入   模板(如果未定义宏)以及主体为空。但   它可以使用其他模板。

所以你不能做

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