Symfony 避免小枝块输出

Symfony 避免小枝块输出,symfony,twig,Symfony,Twig,我有以下细枝模板 {%- block block1 -%} <div class="test"> {{ block('block2') }} </div> {%- endblock block1 -%} {%- block block2 -%} <div>Test2</div> {%- endblock block2 -%} {%-block block1-%} {{block('block2')} {%

我有以下细枝模板

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

{%- block block2 -%}
    <div>Test2</div>
{%- endblock block2 -%}
{%-block block1-%}
{{block('block2')}
{%-endblock block1-%}
{%-block block2-%}
测试2
{%-endblock block2-%}
结果是:

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

测试2
测试2
但应该是:

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

测试2
我想做一些类似于symfony中的表单模板的事情:

更新:

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

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

{% if false %}
    {%- block block2 -%}
        <div>Test2</div>
    {%- endblock block2 -%}
{% endif %}
{%-block block1-%}
{{block('block2')}
{%-endblock block1-%}
{%if false%}
{%-block block2-%}
测试2
{%-endblock block2-%}
{%endif%}

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

// block1 with block2 inserted
<div class="test">
        <div>Test2</div>
</div>
// block2
<div>Test2</div>
//插入块2的块1
测试2
//区块2
测试2

i、 e.当您定义block2时,它不仅插入block1中,还将在定义它的位置进行渲染。您可以尝试以其他方式构建此功能,可能通过使用
include
函数您必须添加表单主题以呈现这些自定义块,或者像Carlos Granados所说的,您必须在此处包含其他分支

您正在显示的链接是symfony2表单主题,它将在表单块调用时呈现,它正在执行此操作,因为您告诉symfony2执行此操作。在布局细枝中添加如下文件-

   {% form_theme form "UrBundle:Default:fields.html.twig" %}
这将是您的文件,它将呈现您的blocks-fields.html.twig, 您可以在此处定义块,然后访问当前中的块,如-

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

它将像您想要的那样退出

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

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

在twig中,呈现的主模板将始终呈现模板中“包含”的所有块,即使使用
扩展
。相反,您尝试创建水平重用块

为了产生您想要的结果,您需要实现

这种方法对于您想要完成的任务非常主观,在常规模板中通常不需要

例子 结果:

Data test test2

请记住,
使用有限制

use
标记仅在不扩展另一个模板时导入模板 模板,如果它没有定义宏,并且主体为空。但是 它可以使用其他模板

所以你不能这样做

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

我知道,但是他们是如何在symfony中实现的表单组件使用了一个特殊的细枝加载程序,它不同于标准的细枝渲染器从这个文件加载这些块。我如何使用这个特殊的细枝加载程序?如果我在第二个块周围添加一个if false,它会工作,但对我来说似乎有点不正常。thx对于您的答案对于none表单模板这是不可能的?是的,这是可能的,表单主题是基于调用的块呈现html代码,添加您的块,您可以在添加{%form_主题表单“UrBundle:Default:fields.html.twig”%}后调用它。如果我在第二个块周围添加一个if false,它可以工作,但对我来说有点麻烦。谢谢你的回答
Data test test2
{# 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 -%}