避免树枝块输出
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 -%}
我有以下树枝模板
{%- 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 -%}