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

时间:2015-04-04 23:27:54

标签: php forms symfony twig

为了处理我的表单集合,我有一个用于块集合小部件的自定义表单主题。此块集合窗口小部件呈现为表,因此取决于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%}代码?

1 个答案:

答案 0 :(得分:5)

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

  

水平重用是一种高级的Twig功能,在常规模板中几乎不需要。它主要用于需要在不使用继承的情况下使模板块可重用的项目。

只需在主模板中加入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 %}