我有一个具有ChoiceType字段的Symfony3表单。它使用带有AJAX数据源的Select2。这个位工作正常。但是,当提交表单时,Symfony验证会启动并抱怨:
This value is not valid
我想这是因为通过AJAX选择的选择并不存在于'选择'键入表单类型。
我对Symfony来说比较新。有人能指出我正确的方向来禁用现场验证吗?
答案 0 :(得分:3)
您不应该禁用验证。使用Form Events
- http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html
答案 1 :(得分:2)
您必须始终使用字符串值将数据提交到ChoiceType
。
考虑以下ChoiceType
配置:
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
$builder->add('some_choice', ChoiceType::class, array(
'choices' => array(
'Choose 1' => 1,
'Choose A' => 'A',
'Choose True' => true,
),
));
默认情况下,您可能希望将choice数组中的每个键用作标签,并将每个选项值转换为字符串并用作html值:
<option value="1">Choose 1</option>
<option value="A">Choose A</option>
<option value="1">Choose True</option>
上面的例子是错误的。
如您所见,将true
投射到字符串会产生"1"
,并且它已用于整数1选项。
所有选择值必须始终是唯一的,因此默认情况下,在这种情况下,ChoiceType
使用数字增量:
<option value="0">Choose 1</option>
<option value="1">Choose A</option>
<option value="2">Choose True</option>
当选择数组中的某些模型选择值不是标量时(例如array
,object
,null
...),会发生同样的情况。
然后,提交的数据应为"0"
,"1"
或"2"
。每个都将通过ChoiceType
映射到相应的选项。
要保持对每个选项使用的字符串值的完全控制,可以使用选项choice_value
作为闭包,将每个选项作为唯一参数传递,并且必须返回其字符串值。
如果您选择的是对象或数组,则可以将其设置为属性路径:
'choice_value' => 'property'
// will be equivalent to
'choice_value' => function ($choice) {
if (is_array($choice)) {
return $choice['property'];
}
if (is_object($choice)) {
return $choice->getProperty();
// or even $choice->isProperty()
}
throw new UnexpectedTypeException();
}
默认行为与:
相同$builder->add('some_choice', ChoiceType::class, array(
'choices' => array(
'Choose 1' => 1,
'Choose A' => 'A',
'Choose True' => true,
),
'choice_value' => function ($choice) {
if (!is_scalar($choice) {
return null;
}
return false === $choice ? '0' : (string) $choice;
},
));
如果返回null
或两个相同的值,则将使用递增整数。
您始终必须提交字符串选择值,以便通过ChoiceType
将其映射回来。
任何未知值或&#34;额外&#34;值将以您的错误结束。
请参阅official doc