[英]Symfony 3: Embedded form whole or nothing validation error display
我有与此处描述的完全相同的问题: Symfony 2 中的可选嵌入表单:
我有一个实体Person的表单,它有一个实体Phone的嵌入表单。 用户可以将电话的所有字段留空,表单将有效。 但是,如果填写了Phone的单个字段,则所有Phone字段都必须有效。
在我的第一种方法中,我只是用@Assert\\Valid()
注释了Person的Phone属性,而没有@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.