我正在提交一个表单并在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>
这里的“表单”是一个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"
- ]
“额外数据”是“大小”字段.
我在这里做了一些明显的错误吗?
编辑2017年6月:您现在可以使用’allow_extra_fields’来抑制此错误. http://symfony.com/doc/current/reference/forms/types/form.html#allow-extra-fields
抛出错误是因为您将每个大小定义为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,));
- }
但它不会让你在处理/绑定步骤中没有副作用.