Symfony 2表单错误"此表单不应包含额外字段。"提交表单时

时间:2016-02-25 18:07:17

标签: php forms symfony sylius php-5.6

我正在提交表格并在Sylius ResourceController处理表格,该表格提交表格并对其进行验证。

这是原位形式:

<tr>
   <form method="post" action="{{ path('backend_course_row_update', {
 'courseeId' : course.id, 'id' : row.id }) }}" novalidate>
     {{ form_widget(form.channel) }}
     {{ form_widget(form.name) }}
     {% for size in form.sizes %}
        {{ form_row(size) }}
     {% endfor %}
     {{ form_row(form._token) }}
     <td align="right" style="width: 140px;">
         <button class="btn btn-primary" type="submit">
            <i class="glyphicon glyphicon-save"></i>Save
         </button>
     </td>
  </form>
</tr>

&#34;表格&#34;这是一个CourseGuideRowType,看起来像这样:

/**
 * {@inheritdoc}
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('channel', 'channel_choice', array(
            'required'    => false
        ))
        ->add('name', 'text')
        ->add('sizes', 'course_guide_row_sizes', array('numColumns' => $options['numColumns']))
    ;
}

CourseGuideRowSizesType然后看起来像这样:

/**
 * {@inheritdoc}
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    for ($i = 0; $i < $options['numColumns']; $i++) {
        $builder->add($i, 'text', array('required' => 'false'));
    }
    $builder->addEventListener(
        FormEvents::PRE_SUBMIT,
        function (FormEvent $event) use ($options) {
            $form = $event->getForm();
            for ($i = 0; $i < $options['numColumns']; $i++) {
                if (empty($form->get($i)->getData())) {
                    $form->remove($i, 'text');
                }
            }
        }
    );
}

但是,当我提交表单并转出这样的错误时:

$form->submit($request, !$request->isMethod('PATCH'))->getErrors()

我明白了:

"This form should not contain extra fields."
      #messageParameters: array:1 [▼
        "{{ extra_fields }}" => "0", "1", "2", "3", "4", "5"
      ]
        -extraData: array:6 [▼
          0 => "36"
          1 => "38"
          2 => "40"
          3 => "42"
          4 => "44"
          5 => "46"
        ]

&#34;额外数据&#34;是&#34;尺寸&#34;字段。

我在这里做了一些明显的错误吗?

编辑2017年6月:您现在可以使用&#39; allow_extra_fields&#39;抑制此错误。 http://symfony.com/doc/current/reference/forms/types/form.html#allow-extra-fields

1 个答案:

答案 0 :(得分:9)

引发错误是因为您将每个size定义为form_row,例如:

{% for size in form.sizes %}
    {{ form_row(size) }}  // Extra field defined here
 {% endfor %}

如评论中所述,您应该使用CollectionType或以相同的方式创建和使用自定义FormType。

这将避免在表单中手动定义额外字段,并且BTW会删除错误。

修改

@nakashu已提醒目前使用的解决方法。

通过在CourseGuideRowType中添加以下内容来避免错误:

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'allow_extra_fields' => true,
    ));
}

但是在处理/绑定步骤中它不会让你没有副作用。