Symfony2 复合表单,将错误与字段关联

Posted

技术标签:

【中文标题】Symfony2 复合表单,将错误与字段关联【英文标题】:Symfony2 compound form, associate errors with fields 【发布时间】:2013-12-13 09:58:18 【问题描述】:

我有一个嵌入表单,其中的 Compound 和 inherit_data 选项设置为 true。

public function buildForm(FormBuilderInterface $builder, array $options)

    $builder->setErrorBubbling(false);

    $builder->add('date_start', 'date', array(
        'label'             => 'form.date_start.label',
        'widget'            => 'single_text',
        'required'          => false,
        'group'             => ['event', 'dates']
    ));

    $builder->add('date_end', 'date', array(
        'label'             => 'form.date_end.label',
        'widget'            => 'single_text',
        'required'          => false,
        'group'             => ['event', 'dates']
    ));

    $builder->add('time_zone', 'alternate_timezone', [
        'label'             => 'form.timezone.label',
        'field_help'        => 'form.timezone.help',
        'empty_value'       => 'form.timezone.empty_value',
        'required'          => false,
        'group'             => ['event', 'dates']
    ]);


/**
 * @inheritdoc
 */
public function setDefaultOptions(OptionsResolverInterface $resolver)

    $resolver->setDefaults([
        'label'        => false,
        'compound'     => true,
        'inherit_data' => true
    ]);

我无法将错误与我的字段相关联。此表单的错误显示在父表单上,而不是字段上。我在文档中看到,除非表单是复合的,否则 error_bubbling 可能是错误的。

复合表单出现与字段相关的错误的解决方案是什么?

谢谢

【问题讨论】:

我的表单中有一个继承的字段存在这个问题。我无法在验证例程中定位继承表单的名称。错误总是冒泡到根表单。更改 error_bubbling 或其他设置对我来说没有任何效果。 【参考方案1】:

使用 Symfony 中的复合表单 - 您可以为复合关系中的每个实体定义验证约束,并且在验证期间产生的任何错误都将显示在发生错误的表单元素上方/附近。

例如 - 如果您发布的表单示例绑定到“ExampleEntity”实体 - 您可以在包的 validation.yml 中为该实体定义验证约束。任何验证错误都将与它们各自的子表单一起显示 - 即使在多个子表单上可能发生验证错误的集合中也是如此。

示例 src/MyBundle/Resources/Config/validation.yml

App\MyBundle\Entity\ExampleEntity:
        properties:
            date_start:
                - NotBlank:
                    message:  Date start cannot be blank.
            date_end:
                - NotBlank:
                    message:  Date end field cannot be blank.
            time_zone:
                - NotBlank:
                    message:  Timezone cannot be blank.

【讨论】:

以上是关于Symfony2 复合表单,将错误与字段关联的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 实体中除 id 以外的字段的关联在表单中未正确显示

Symfony2 Form + AngularJS for REST API = 表单验证额外字段错误

从 symfony2 中的控制器添加字段特定错误

Symfony2 基于两个字段的表单验证

复合标识符,但使用 ID 生成器而不是手动分配 + Symfony2

Symfony2 表单和 <input> 模式属性