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



我的表单中有一组隐藏字段。

<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(角色)}}(一个隐藏字段)。

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

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

收集小部件的定义如下:

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

因此,您可以覆盖这一点,以控制如何重新构建原型。

您还可以通过调用roles.vars.prototype从模板内部访问原型,然后在JS中使用它。如果你想把它放在div的数据原型属性中(就像通常渲染的那样),你必须记住转义它:

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

文档中推荐的方法允许您在应用程序中轻松地独立定制每个集合,所有集合都在同一个文件中。

  • 创建文件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 %}
    

块的名称很重要。如果父窗体被称为MyformType,则第一部分将为_myform;如果拥有集合的窗体字段被如此调用,则第二部分为_mycollection。第三部分必须始终为_entry_row才能工作

例如,如果您有一个包含'books'集合的UserType表单,则块名称可能是_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" %}

相关内容

  • 没有找到相关文章

最新更新