如何在symfony2表单集合中自定义数据原型?

时间:2012-02-06 11:41:04

标签: forms symfony prototype twig arraycollection

我的表格中有一些隐藏字段。

<ul id="user_roles">
  <li><hidden field value="role1"></li>
  <li><hidden field value="role2"></li>
  (...)
</ul>

我使用jQuery(和数据原型)来添加新角色。

问题是我想渲染这样的东西:

<ul id="user_roles">
  <li>role1 <hidden field value="role1"></li>
  <li>role2 <hidden field value="role2"></li>
  (...)
</ul>

初始渲染没问题:我只是把:

{% for role in roles %}
 <li> {{ role }} {{ form_row(role) }} </li>
{% endfor %}

但默认数据原型只会呈现{{form_row(role)}}(隐藏字段)。

我应该在哪里更改默认数据原型?

form_div_layout.html中没有{%block prototype%}我可以自定义....

3 个答案:

答案 0 :(得分:8)

集合小部件定义如下:

{% block collection_widget %}
{% spaceless %}
    {% if prototype is defined %}
        {% set attr = attr|merge({'data-prototype': form_row(prototype) }) %}
    {% endif %}
    {{ block('form_widget') }}
{% endspaceless %}
{% endblock collection_widget %}

因此,你可以覆盖它以控制你想要如何渲染原型。

答案 1 :(得分:1)

您还可以通过调用roles.vars.prototype从内部模板访问原型,并在以后的JS中使用它。如果你想把它放到div的data-prototype属性中(因为它通常被渲染)你必须记住逃避它:

<div data-prototype="{{ form_row(roles.vars.prototype) | escape }}">
  {% for role in roles %}
    <li> {{ role }} {{ form_row(role) }} </li>
  {% endfor %}
</div>

答案 2 :(得分:0)

docs中建议的方法允许您在应用内独立自定义每个集合,所有这些都在同一个文件中。

  • 创建文件prototype_layout.html.twig

    {% block _myform_mycollection_entry_row %}
        <div class="row">
            <div class="col-sm-6">{{ form_row(form.title) }}</div>
            <div class="col-sm-6">{{ form_row(form.author) }}</div>
        </div>
    {% endblock %}
    

块的名称很重要。如果您的父表单被称为_myform,则第一部分将是MyformType;如果您拥有该集合的表单字段被调用,则第一部分将是_mycollection。第三部分必须始终为_entry_row才能实现此目的。

例如,如果您的UserType表单的集合为'books',则块名称可能为_user_books_entry_row

要确保您的名称正确,请添加子表单(通过单击添加按钮以使用javascript添加子表单)并使用浏览器的检查器工具检查相应的select html元素的ID。

如果它看起来像user_books_0_title,则块名称将为_user_books_entry_row

  • config.yml的树枝部分中将此文件声明为全局表单主题:

    twig:
        form_themes:
            - 'AppBundle:Form:prototype_layout.html.twig' #adapt this path if you saved your file elsewhere
    
  • 您也可以直接在表单视图中使用该文件:

{% use "AppBundle:Form:prototype_layout.html.twig" %}