Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Validation symfony2中的非重叠选项列表_Validation_Symfony_Multiple Choice - Fatal编程技术网

Validation symfony2中的非重叠选项列表

Validation symfony2中的非重叠选项列表,validation,symfony,multiple-choice,Validation,Symfony,Multiple Choice,使用Symfony 2.2.4 我有一个表单,其中有两个选项列表(多个,未展开),显示相同的元素(类的实体)。当用户从两个选择列表中选择相同的元素时,我需要抛出一个错误(onsubmit)。是否有一种方法可以验证此选择,而不需要遍历两个列表检查每个元素,就像自动/内置验证一样 我需要捕获错误并将其绑定到一个选项列表中,以允许我将其显示为任何其他错误,这意味着通过form_错误(form) 任何提示都值得欣赏。最简单的方法是在AbstractType类的buildForm中添加一个侦听器,下面是一

使用Symfony 2.2.4

我有一个表单,其中有两个选项列表(多个,未展开),显示相同的元素(类的实体)。当用户从两个选择列表中选择相同的元素时,我需要抛出一个错误(onsubmit)。是否有一种方法可以验证此选择,而不需要遍历两个列表检查每个元素,就像自动/内置验证一样

我需要捕获错误并将其绑定到一个选项列表中,以允许我将其显示为任何其他错误,这意味着通过form_错误(form)


任何提示都值得欣赏。

最简单的方法是在AbstractType类的buildForm中添加一个侦听器,下面是一个示例

    $builder->addEventListener(
        FormEvents::POST_SUBMIT,
        function (FormEvent $event) {
            $form = $event->getForm();
            $coll1 = $form['field1']->getData();
            $coll2 = $form['field2']->getData();
            $ids1 = $coll1->map(function($entity) { return $entity->getId(); })->toArray();
            $ids2 = $coll1->map(function($entity) { return $entity->getId(); })->toArray();
            $intersect = array_intersect($ids1, $ids2);
            if (!empty($intersect)) {
                $form['field1']->addError(
                    new FormError('here the error')
                );
            }
        }
    );
请注意,我没有测试集合的交叉点,但我希望其含义是明确的

另一种(有点困难)方法是创建自定义验证约束


我最终在控制器中验证了它,关于您的答案,我实际上没有尝试,但我对此有疑问:当两个数组中的元素都相等时,还是当两个数组中至少有一个元素时,它会抛出错误?因为我需要latterwell,看起来你在我写的时候改变了答案,最后我也使用了array_intersect函数,只在控制器中使用,因为我从来没有与监听器一起工作过,新手,到目前为止它是有效的,但可以肯定的是,相交实体而不是ID会有问题吗?,将来会因为某种原因出错吗?可能直接与实体相交也同样有效,但我不确定,我更信任ID:)