2015-04-04 33 views
3

要处理我的表单集合,我有一个块集合小部件的自定义表单主题。该块集合小部件呈现为一个表格,因此取决于block_collection_header和block_collection_body。symfony2 /小枝:如何使用包含在表单主题中使用的块?

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

我的工作代码:

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

如何避免在我使用它的每一个表格模板重复该{%块collection_widget%}码?

+0

肯定,这是一个错字,问题仍然是一样的。我会添加他们的标记 – 2015-04-05 10:20:33

回答

5

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

水平重用是很少需要定期模板先进的嫩枝功能。它主要用于需要使模板块可重用而不使用继承的项目。

只包含主模板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 %} 
+1

,这实际上是工作,最后!非常感谢 :) – 2015-04-05 19:28:57

相关问题