繁体   English   中英

Symfony 3:嵌入式表单完整或无验证错误显示

[英]Symfony 3: Embedded form whole or nothing validation error display

我有与此处描述的完全相同的问题: Symfony 2 中的可选嵌入表单

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

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

使用验证回调函数验证此解决方案对 Symfony 3 进行了一些修改:

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

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

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

但也许我的第一种方法可能会奏效,如果有可能以某种方式将现有Person对象的属性Phone设置为 null,如果Phone 的所有表单字段都已清除?

尝试在 formType 类中使用级联验证( 小心从 symfony3 中删除)和 error_bubbling

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

自己找到了答案:

我为尝试让它适用于 Symfony 3.3 而对另一篇文章中的解决方案进行的修改需要有所不同:

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

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

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 断言。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM