有条件地禁用嵌入表单的验证

时间:2014-04-28 15:44:30

标签: symfony

我有一个嵌入式表单(对于Address),它有各自属性的验证。我将这个表单嵌入到父表单中(对于Person),我在父表单上有一个复选框,上面写着" Person有地址?"

如果未选中此复选框,我想禁用嵌入式Address表单的所有验证。或者,更好的是,如果我可以完全删除嵌入的表单,那也没关系。

我查看了使用验证组,但用例并不匹配我自己的。

2 个答案:

答案 0 :(得分:2)

好的,想通了。在我的表单构建器中添加AddressType嵌入表单时,我只传递验证组的选项,如下所示:

    $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
        $form = $event->getForm();
        $form->add('address', new AddressType(), array(
            'label' => 'Address',
            'validation_groups' => function (FormInterface $form) {
                if ($form->getParent()->get('toggleAddress')->getData() === false) {
                    return array();
                }
                return array('Default');
            }
        ));
    });

在验证组功能中,进行检查以查看启用地址的切换是否已关闭。如果是这样,返回一个空白数组,删除所有验证组,包括"默认"之一。

答案 1 :(得分:0)

您尝试使用验证组修复您的问题,但不会涵盖您的用例(可能会因为空的Address对象将链接到您的Person对象而变得棘手)。

基本上,您每次都会嵌入Address表单,而只有在选中复选框时才会嵌入表单。恕我直言,你应该依赖于here解释的动态形式。

使用此解决方案,您需要额外的JS代码才能在单击复选框时更新表单,以便相应地更新整个表单。然后,没有关于验证的问题,因为只有在嵌入表单时才会创建Address对象。

此外(仅供参考),您可以根据提交的数据添加/编辑验证组,如here所述。

希望我的回答很有帮助!