【问题标题】:set validation group to embedded forms in symfony 2在 symfony 2 中将验证组设置为嵌入表单
【发布时间】:2013-09-15 09:13:18
【问题描述】:

如何在嵌入式表单中设置验证组? 我有两个实体 A 和 B 以及每个实体的表单(FormA,FormB) 我将 FormA 嵌入 FormB 中

class FormB extends AbstractType {
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder->add('A', new FormA());
    }
    public function setDefaultOptions(OptionsResolverInterface $resolver) {
        $resolver->setDefaults(array(
            'data_class' => 'Acme\TestBundle\Entity\B',
            'validation_groups'=>function(FormInterface $form) {
                // set validation group for FormA here
             },
            'cascade_validation'=>true
        ));
    }
}

FormB如何设置FormA的验证组?

【问题讨论】:

    标签: symfony symfony-2.1 symfony-forms symfony-2.3


    【解决方案1】:

    对我有用

    class FormB extends AbstractType {
        public function buildForm(FormBuilderInterface $builder, array $options) {
            $builder->add('A', new FormA(), array('validation_groups' => array('yourValidationGroup')));
        }
        public function setDefaultOptions(OptionsResolverInterface $resolver) {
            $resolver->setDefaults(array(
                'data_class' => 'Acme\TestBundle\Entity\B',
                'cascade_validation'=>true
            ));
        }
    }
    

    还可以在 FormB->setDefaultOptions 中定义验证组。它将验证组应用于所有子表单。

        public function setDefaultOptions(OptionsResolverInterface $resolver) {
            $resolver->setDefaults(array(
                'data_class' => 'Acme\TestBundle\Entity\B',
                'cascade_validation'=>true,
                'validation_groups' => array('yourValidationGroup')
            ));
        }
    

    要根据基础数据使用它,您可以将该代码放在事件侦听器上:

    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder->addEventListener(
                FormEvents::POST_SET_DATA,
                function(FormEvent $event) {
                    $form=$event->getForm();
                    /**
                     * @var ContactDetail $detail
                     */
                    $entity=$form->getData();
                    if($entity->getA()->isRequired()){
                        $form->add('A', new FormA(), array('validation_groups' => array('yourValidationGroup')));
                    } else {
                        $form->add('A', new FormA(), array());
                    }
                }
        );
    }
    

    【讨论】:

    • 我希望在关闭验证组时这样做,因为我需要根据某些表单元素值添加验证组
    • 我添加了一个示例,该示例使用 EventListeners 根据基础数据添加组验证。
    • 我正在尝试$builder->add('A', new FormA(), array('validation_groups' => array('yourValidationGroup')));,但对我不起作用...但是将validation_groups 放入默认选项有效...您知道为什么第一次尝试不起作用吗?
    【解决方案2】:

    属性cascade_validationdeprecated in Symfony 2.8,将在 Symfony 3.0 中删除。要使用cascade_validation,您应该使用@Assert\Valid constraint

    class Profile
    {
      /**
       * @var Address
       * 
       * @Assert\Valid()
       */
      private $address;
    }
    

    附:注意:链接提供给 Symfony 2.8 版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-19
      • 2014-04-30
      • 1970-01-01
      相关资源
      最近更新 更多