Symfony表单集合作为表

时间:2014-02-25 20:11:54

标签: symfony twig symfony-forms formbuilder

我无法理解symfony2的formbuilder如何处理集合。

我有以下表单构建器

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name', 'text')
        ->add('datatypes', 'collection', array(
            'type'          => new DatatypeType(),
            'allow_add'     => true,
            'allow_delete'  => true,
            'prototype'     => true,
            'by_reference'  => false,
            'label'         => false
            ));

}

使用默认表单主题(form_div),这将创建以下构造

<div data-prototype="...">
  <div>
    <label>0</label>
    <div>
      <label>
      <input>
    <div>
      <label>
      <input>

首先,为什么要创建一个标有“0”作为内容的标签?我试过“label”=&gt;是的,但它仍然是生成的。

其次,我希望将集合更改为如下,但原型仍将由form_div主题生成,因此即使我手动创建formpart也无法使用。

<table>
  <tr>
    <th>Title
    <th>Title
  <tr>
    <td>
      <input>
    <td>
      <input>
  <tr>
    <td>
      <input>
    <td>
      <input>

我如何实现我想要的结果?

1 个答案:

答案 0 :(得分:1)

0表示集合中的子表单的索引。 我实现集合的方式是按字段打印表单。这样,所有那些我不需要的标签都不会被渲染。 这是一个例子:

<form class="form-horizontal" role="form" action="{{ path('path') }}" method="POST">
  {{form_row(form.name)}}
  <div class="collection-wrapper" data-prototype="{{ _self.datatype_prototype(form.datatypes.vars.prototype)|e }}">
      {% for datatype in form.datatypes %}
          {{ _self.datatype_prototype(datatype) }}
      {% endfor %} 
  </div>  
  {{ form_widget(form._token) }}
 </form>

在页面中,没有包含在任何块中,我创建了一个宏,用于显示原型:

{% macro datatype_prototype(childForm) %}
   {{ form_widget(childForm) }}
{% endmacro %}

不是由您来决定如何显示表单,您可以像对待任何其他表单一样自定义childForm的呈现方式(请参阅http://symfony.com/doc/current/cookbook/form/form_customization.html)。