我有一些复杂的表单,带有多个子表单,并且我希望能够根据主表单中选择的单选按钮单独验证每个子表单。我想通过验证组来实现这一目标。
注:我没有data_class
模型,我使用数组。
这是我的简化表格:
class MyType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('xxx', 'text', array(
'constraints' => array(
new Constraints\NotBlank(),
),
'validation_groups' => array(
'xxx',
)
))
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'validation_groups' => function(FormInterface $form) {
return array('xxx');
},
));
}
}
问题是未触发该字段的验证。
当这有效时,我可以轻松改变setDefaultOptions
根据提交的数据验证所需的组:
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'validation_groups' => function(FormInterface $form) {
$data = $form->getData();
return array($data['type']);
},
));
}
任何想法?
您必须将验证组名称传递给约束,而不是在表单本身中。通过将组名称分配给表单,您可以指定在验证中使用哪些约束。
Replace
$builder->add('xxx', 'text', array(
'constraints' => array(
new Constraints\NotBlank(),
),
'validation_groups' => array(
'xxx',
)
))
;
With
$builder->add('xxx', 'text', array(
'constraints' => array(
new Constraints\NotBlank(array(
'groups' => 'xxx'
)),
),
))
;
默认情况下,约束具有 'Default'(大写)组和表单使用该组来验证是否未指定。如果您希望验证没有显式组的其他约束,请与指定的组一起传递 'Default' one.
$resolver->setDefaults(array(
'validation_groups' => function(FormInterface $form) {
$data = $form->getData();
return array($data['type'], 'Default');
},
));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)