Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.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
Forms 检查特定验证组在Symfony表格中是否有效?_Forms_Validation_Symfony - Fatal编程技术网

Forms 检查特定验证组在Symfony表格中是否有效?

Forms 检查特定验证组在Symfony表格中是否有效?,forms,validation,symfony,Forms,Validation,Symfony,我正在构建一个复杂的symfony表单,它有点长,并且包含其他嵌入表单。因此,表单在UI中以单独的选项卡显示,以使其更可读,更方便用户使用 因为表单很长并且在UI中是分开的,所以在填充表单时可能会遗漏一些内容,或者只是插入了一些不正确的内容。此时验证将启动并阻止表单保存。验证本身是配置好的,并且可以完美地工作 我这里的问题是,我有一个巨大的表单,分为多个选项卡,在某个地方有一个错误,我需要浏览每个选项卡,以准确地查看出了什么问题。我在考虑用另一种颜色制作包含有错误字段的特定选项卡,这样它就可以脱

我正在构建一个复杂的symfony表单,它有点长,并且包含其他嵌入表单。因此,表单在UI中以单独的选项卡显示,以使其更可读,更方便用户使用

因为表单很长并且在UI中是分开的,所以在填充表单时可能会遗漏一些内容,或者只是插入了一些不正确的内容。此时验证将启动并阻止表单保存。验证本身是配置好的,并且可以完美地工作

我这里的问题是,我有一个巨大的表单,分为多个选项卡,在某个地方有一个错误,我需要浏览每个选项卡,以准确地查看出了什么问题。我在考虑用另一种颜色制作包含有错误字段的特定选项卡,这样它就可以脱颖而出,省去你想知道哪里出了问题以及它在哪里的时间

据我所见,我有两个选择:

  • 手动检查每个选项卡上的所有字段,方法如下:
    {%if not form.children.FIELD_NAME.vars.valid%}
    这要花很长时间才能完成,只有在这是唯一可能的方式时我才会这么做
  • 尝试使用
    validation\u groups=>array('Default','my\u tab\u name')
    并对每个选项卡的字段进行逻辑分组 我真的希望使用第二种方法,但我似乎不知道如何检查验证组,即
    my_tab_1
    是否包含任何错误。我知道我可以这样做:

    $validator = $this->get('validator');
    $my_tab_1 = $validator->validate($entity, null, array('my_tab_1'));
    $my_tab_2 = $validator->validate($entity, null, array('my_tab_2'));
    $my_tab_3 = $validator->validate($entity, null, array('my_tab_3'));
    // so on
    
    但是表单已经通过
    $form->validate()
    进行了验证,使用这种方法将触发N次不必要的验证

    因此,这里的问题是如何从细枝模板检查特定的验证组是否有效?如果不可能,是否可以从
    控制器
    获取它,并将其作为变量传递,而不进行另一次验证

    我不认为我需要发布
    FormType
    s,因为它们是长的、嵌套的,可能只会让您感到困惑。但是,这是父窗体的一个过于简化的版本:

    class CompanyType extends AbstractType
    {
    
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('name')
                ->add('address')
                ->add('representedBy')
                ->add('category')
                ->add('phone')
                ->add('member', new MemberType())
                ->add('contacts', new ContactType())
                ->add('notes', new NoteType())
                // and a couple more embedded form types.
            ;
        }
    
        /**
         * @param OptionsResolverInterface $resolver
         */
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'App\FooBundle\Entity\Company',
                'cascade_validation' => true
            ));
        }
    
        /**
         * @return string
         */
        public function getName()
        {
            return 'app_company';
        }
    }
    

    如果有人有更好的想法或解决方案,我将不胜感激

    首先,您可以用两种不同的方式使用选项卡:

    a) 使用javascript。选项卡的所有内容都加载一次,可以在页面源中找到。除一个选项卡外,所有选项卡内容均隐藏

    b) 与链接和PHP。在这种情况下,每个选项卡都是另一个带有另一个URL的网页

    (希望你能理解其中的区别)

    我的高级表单总是使用第二种方法。因此,对于每个页面,我只添加formtype中所有formfields的一部分。对于每个页面,我也使用一个验证组。这已经足以编辑现有实体

    但问题是一个新的实体。您可能希望避免在数据库中使用部分填充的实体,因此您需要验证并存储会话中的每个“步骤”,并且在用户完成最后一个步骤(验证没有问题)后,您可能希望将所有表单字段一次性存储到数据库中

    craueformflowbundle使用此方法

    要获取formfields的一部分,只需在formType中使用一个开关或为每个步骤创建一个formType

    namespace AppBundle\Form;
    
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;
    
    class CompanyType extends AbstractType
    {
        /**
         * @param FormBuilderInterface $builder
         * @param array $options
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            switch ($options['flow_step']) {
                case 1:
                    $builder
                        ->add('company')
                        ->add('origin')
                   ;
                    break;
                case 2:
                    $builder
                        ->add('contactPerson', NULL, array('label' => 'Volledige naam'))
                        ->add('email', 'email', array('label' => 'Email'))
                        ->add('telephone', NULL, array('label' => 'Telefoonnummer'))
                    ;
                    break;
            }
        }
    
        /**
         * @param OptionsResolverInterface $resolver
         */
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'AppBundle\Entity\Company',
                'flow_step' => 1
            ));
        }
    
        /**
         * @return string
         */
        public function getName()
        {
            return 'appbundle_company';
        }
    }
    

    看看craueformflowbundle:谢谢你的建议。不幸的是,我不能将表单分成多个步骤,因为表单背后有一些业务逻辑,它根据业务规则执行一些额外的表单验证。