【问题标题】:Symfony 3: Embedded form whole or nothing validation error displaySymfony 3:嵌入式表单全部或全部验证错误显示
【发布时间】:2017-09-24 00:44:11
【问题描述】:

我遇到的问题与此处描述的完全相同:Optional embed form in Symfony 2:

我有一个实体 Person 的表单,其中嵌入了实体 Phone 的表单。用户可以将 Phone 的所有字段留空,表单将有效。但如果填写了Phone 的单个字段,则所有Phone 字段都必须有效。

在我的第一个方法中,我只是用@Assert\Valid() 而不用@Assert\NotNull() 来注释PersonPhone 属性。只有在输入一个新的 Person 时才能正常工作。在编辑现有 Person 并且 Phone 属性已被填写时,删除所有 Phone 字段(应该是有效的)不会结果转化为有效的提交。

带有验证回调函数的this solution 验证适用于 Symfony 3 的一些修改:

/**
 *
 * @Assert\Callback()
 */
public function validatePhone(ExecutionContextInterface $context)
{
    if (/* Fields are not empty */)
    {
       $context->getValidator()->inContext($context)->validate($this->phone);
    }
}

但提交表单后,电话字段的验证错误不会显示在页面上。我只能在调试工具栏中看到它们。

也许,这个解决方案需要修改一下,让表单提交后显示错误?

但是,如果可以将现有 Person 对象的属性 Phone 设置为 null,如果 Person 的所有表单字段em>手机清空了吗?

【问题讨论】:

    标签: php forms symfony validation


    【解决方案1】:

    尝试在您的 formType 类中使用 cascade_validation (be carefull removed from symfony3) 和 error_bubbling

    ->add('phone', 'collection', array(
                'type' => 'text',
                'allow_add' => true,
                'error_bubbling' => false,
                'cascade_validation' => true,
            ));
    

    【讨论】:

      【解决方案2】:

      自己找到了答案:

      我为了尝试让它适用于 Symfony 3.3 而对 other post 的解决方案进行了修改,需要有所不同:

      /**
       *
       * @Assert\Callback()
       */
      public function validatePhone(ExecutionContextInterface $context)
      {
          if (/* Fields are not empty */)
          {
             $context->getValidator()->validate($this->phone);
          }
      }
      

      【讨论】:

        【解决方案3】:

        我需要一个非类表单的解决方案,我所做的是:

        public function buildForm(FormBuilderInterface $builder, array $options)
        {        
            parent::buildForm($builder, $options);
        
            $builder
                ->add('status', TextType::class)
                ->add('invoice', SomeSubForm::class, [
                    'required' => false
                ]);
            ;
        
            $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
                $data = $event->getData();
                if (!isset($data['invoice'])) {
                    $event->getForm()->add('invoice', HiddenType::class, [
                        'required' => false
                    ]);
                }
        
            });
        }
        

        SubForm 在属性上有 NotBlank 断言。

        【讨论】:

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