php – symfony2 / twig:如何在表单主题中使用的块中使用include?

为了处理我的表单集合,我有一个用于块集合小部件的自定义表单主题.此块集合窗口小部件呈现为表,因此取决于block_collection_header和block_collection_body.

块集合小部件始终保持不变,但有时我自定义其他两个块,块集合头和块集合体

我的工作代码

{# From file myview.html.twig #}
{% form_theme form ':Model:prototype_table_collection.html.twig' %}
{% form(form) %}

Ant这个表单主题如下:

{# From file ':Model:prototype_table_collection.html.twig' #}
{% block collection_widget %}
    {% spaceless %}
        <div class="collection">
            {% if prototype is defined %}
                {% set body = prototype %}
                {% set attr = attr|merge({'data-prototype': block('collection_body') }) %}
                {% set header = prototype %}
                {% set attr = attr|merge({'data-header': block('collection_header') }) %}
            {% endif %}

            {% if form.vars.allow_delete is defined and form.vars.allow_delete %}
                {% set allow_delete = true %}
            {% else %}
                {% set allow_delete = false %}
            {% endif %}


            <div {{ block('widget_container_attributes') }} class="protoype">
                {{ form_errors(form) }}
                <table class="subtable table">
                    <thead>
                        <tr class="headers" style="display: none;">
                            {% if form.children|length > 0 %}
                                {% if form.children[0]|length > 0 %}
                                    {% set header = form.children[0] %}
                                    {{ block('collection_header') }}
                                {% endif %}
                            {% endif %}
                        </tr>
                    </thead>
                    <tbody class="container_rows">

                    {% for rows in form %}
                    {% spaceless %}
                        {% if rows.children|length > 0 %}
                                {% set body = rows %}
                                {{ block('collection_body') }}
                        {% endif %}
                    {% endspaceless %}
                    {% endfor %}

                    </tbody>
                </table>
                {% if prototype is defined %}
                    {% if form.vars.attr['data-add_label'] is defined %}
                        {% set add_label = form.vars.attr['data-add_label'] ~ ' ' %}
                    {% else %}
                        {% set add_label = 'Ajouter  ' %}
                    {% endif %}
                    <a href="#/" class="add_button btn btn-default btn-sm pull-right">{{ add_label }}<i class="fa fa-plus"></i></a>
                {% endif %}
                <br>
            </div>
        </div>
    {% endspaceless %}
{% endblock collection_widget %}

{% block collection_header %}
    {% for field in header %}
        <th>
            {% if 'checkBox' not in field.vars.block_prefixes %}
                {{ form_label(field)|raw }}
            {% else %}
                {% if field.vars.attr['data-label'] is defined %}
                    {{ field.vars.attr['data-label'] }}
                {% else %}
                    Options
                {% endif %}
            {% endif %}
        </th>
    {% endfor %}
    {% if allow_delete %}
        <th class="align_center">Supprimer</th>
    {% endif %}
{% endblock %}

{% block collection_body %}
    {% spaceless %}
    {% set fieldNum = 1 %}
    <tr class="row_to_delete child_collection">
        {{ form_errors(body) }}
        {% for field in body %}
            <td class="field{{ fieldNum }} data-label">
                {{ form_widget(field) }}
                {{ form_errors(field) }}
            </td>
            {% set fieldNum = fieldNum + 1 %}
        {% endfor %}
        {% if allow_delete %}
            <td class="align_center align_middle"><a href="#/" class="fmu_delete_button btn btn-default btn-xs"><i class="fa fa-times"></i></a></td>
        {% endif %}
    </tr>
    {% endspaceless %}
{% endblock %}

我想使用的代码不起作用:

视图保持不变

{# From file myview.html.twig #}
{% form_theme form ':Model:prototype_table_collection.html.twig' %}
{% form(form) %}

在这里,我试图从第一个块内部化代码

{# From file ':Model:prototype_table_collection.html.twig' #}
{% block collection_widget %}
    {{include(':Model:collection_widget.html.twig')}}
{%end block%}

{% block collection_header %}
{#stays the same as the prevIoUs code for this block. It is called by the block collection_widget #}
{%end block%}

{% block collection_body %}
{#stays the same as the prevIoUs code for this block. It is called by the block collection_widget #}
{%end block%}

新的外化文件

{#From file ':Model:collection_widget.html.twig' #}
{# Here I put the same exact code as I had before inside the block collection_widget, I'm not changing the code, I'm just trying to externalize this part #}

包含不起作用,我的收藏不加载.

我试过扩展布局,它也不起作用.
示例:

{# From file ':Model:prototype_table_collection.html.twig' #}
{% extends :Model:parent.html.twig' %}

{% block content %}

{% block collection_header %}
{#stays the same as the prevIoUs code for this block. It is called by the block collection_widget #}
{%end block%}

{% block collection_body %}
{#stays the same as the prevIoUs code for this block. It is called by the block collection_widget #}
{%end block%}

{%end block%}

和父母:

{# From file ':Model:parent.html.twig' #}

{% block collection_widget %}
    {# same code as brefore #}
{%end block%}

{% block content %}
{% endblock %}

如何避免在我使用它的每个表单模板中重复此{%block collection_widget%}代码

解决方法:

我相信您正在寻找horizontal reuse功能

Horizontal reuse is an advanced Twig feature that is hardly ever needed in regular templates. It is mainly used by projects that need to make template blocks reusable without using inheritance.

只需在主模板中包含use标记

{# :Model:prototype_table_collection.html.twig #}

{% use ':Model:collection_widget.html.twig' %}

{% block collection_header %}
    {# code #}
{%end block%}

{% block collection_body %}
    {# code #}
{%end block%}

然后定义collection_widget块,就好像它首先位于prototype_table_collection.html.twig文件中一样:

{# :Model:collection_widget.html.twig #}
{% block collection_widget %}
    {# code #}
{% endblock %}

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...