提交表单时 Symfony 2 表单错误 "This form should not contain extra fields."
Symfony 2 Form error "This form should not contain extra fields." when submitting a form
我正在提交表单并在 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>
这里的"form"是一个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"
]
"extra data" 是 "sizes" 个字段。
我是不是做错了什么?
编辑 2017 年 6 月:您现在可以使用 'allow_extra_fields' 来抑制此错误。 http://symfony.com/doc/current/reference/forms/types/form.html#allow-extra-fields
抛出错误是因为您将每个 size
定义为 form_row
,例如:
{% for size in form.sizes %}
{{ form_row(size) }} // Extra field defined here
{% endfor %}
如评论中所述,您应该使用 CollectionType 或以与其相同的方式创建和使用您的自定义 FormType。
这将避免在您的表单中手动定义额外字段的需要,顺便说一下,错误将被删除。
编辑
@nakashu 提醒了目前要使用的解决方法。
只需在 CourseGuideRowType
中添加以下内容即可避免错误:
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'allow_extra_fields' => true,
));
}
但它并不能使您在 handling/binding 步骤中没有副作用。
我正在提交表单并在 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>
这里的"form"是一个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"
]
"extra data" 是 "sizes" 个字段。
我是不是做错了什么?
编辑 2017 年 6 月:您现在可以使用 'allow_extra_fields' 来抑制此错误。 http://symfony.com/doc/current/reference/forms/types/form.html#allow-extra-fields
抛出错误是因为您将每个 size
定义为 form_row
,例如:
{% for size in form.sizes %}
{{ form_row(size) }} // Extra field defined here
{% endfor %}
如评论中所述,您应该使用 CollectionType 或以与其相同的方式创建和使用您的自定义 FormType。
这将避免在您的表单中手动定义额外字段的需要,顺便说一下,错误将被删除。
编辑
@nakashu 提醒了目前要使用的解决方法。
只需在 CourseGuideRowType
中添加以下内容即可避免错误:
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'allow_extra_fields' => true,
));
}
但它并不能使您在 handling/binding 步骤中没有副作用。