Validation Symfony3+;Select2 AJAX-禁用选项验证
我有一个Symfony3表单,它有一个ChoiceType字段。它使用Select2和AJAX数据源。这个钻头很好用。但是,在提交表格时,Symfony验证会启动并投诉:Validation Symfony3+;Select2 AJAX-禁用选项验证,validation,symfony-forms,symfony,select2,Validation,Symfony Forms,Symfony,Select2,我有一个Symfony3表单,它有一个ChoiceType字段。它使用Select2和AJAX数据源。这个钻头很好用。但是,在提交表格时,Symfony验证会启动并投诉: This value is not valid 我想这是因为通过AJAX选择的选项不存在于表单类型的“choices”键中 我对Symfony比较陌生。有人能给我指出正确的方向来禁用字段上的验证吗?您不应该禁用验证。使用表单事件动态添加选项 您还可以查看此捆绑包:您必须始终使用字符串值向选项类型提交数据 考虑以下选择类型
This value is not valid
我想这是因为通过AJAX选择的选项不存在于表单类型的“choices”键中
我对Symfony比较陌生。有人能给我指出正确的方向来禁用字段上的验证吗?您不应该禁用验证。使用
表单事件动态添加选项
您还可以查看此捆绑包:您必须始终使用字符串值向选项类型提交数据
考虑以下选择类型
配置:
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,
),
));
默认情况下,您可能希望选项数组中的每个键都用作标签,每个选项值都转换为字符串并用作html值:
<option value="1">Choose 1</option>
<option value="A">Choose A</option>
<option value="1">Choose True</option>
当选择数组中的某些模型选择值不是标量(例如数组
,对象
,空
…)时,也会发生同样的情况
那么提交的数据应该是“0”
、“1”
或“2”
。通过选择类型
,每个选项都将映射到相应的选项
要保持对每个选项使用的字符串值的完全控制,可以使用选项choice\u 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
或两个相同的值,则将使用递增整数
您必须始终提交字符串选择值,以便通过选项类型
将其映射回
任何未知值或“额外”值都会导致错误
请参阅,谢谢你们的回复。我结束了使用表单事件,因为它对我正在做的其他事情很有用。我用一种新的表单类型解决了这个问题:
$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;
},
));