Symfony Doctrine OneToOne嵌入式表单error_bubbling

时间:2014-02-10 20:59:01

标签: php forms symfony error-handling doctrine-orm

我正在尝试获取嵌入表单的错误消息,以显示有错误的表单字段旁边。

我有2个与OneToOne关系相关的Doctrine实体,如下所示:

class Contact
{
    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id

    /**
     * @ORM\OneToOne(targetEntity="Name", mappedBy="contact", cascade={"persist"})
     */
    protected $name;

}

class Name
{
    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id

    /**
     * @var string $givenName
     *
     * @ORM\Column(type="string", name="given_name", length=255)
     * @Assert\NotBlank(
     *     message="Given name must not be blank."
     * )
     * @Assert\Length(
     *     min="2",
     *     max="255",
     *     minMessage="Given name is too short.",
     *     maxMessage="Given name is too long."
     * )
     */
    protected $givenName;

}

我创建了2个表单,一个用于Contact实体,另一个用于Name实体。然后我将名称表格嵌入联系表格。

class ContactType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name', new NameType());
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class'         => AcmeCoreBundle\Entity\Contact,
            'cascade_validation' => true,
            'error_bubbling'     => false,
        ));
    }

    public function getName()
    {
        return 'acme_contact';
    }
}

class NameType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('given_name', 'text', array(
                'required'       => true,
                'error_bubbling' => false,
            ));
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class'     => AcmeCoreBundle\Entity\Name,
            'error_bubbling' => false,
        ));
    }

    public function getName()
    {
        return 'acme_name';
    }
}

我已将cascade_validation设置为联系表单上的true,这是根表单,并且error_bubbling设置为false。我已经测试了这些配置选项,它们正在设置中。

然而,错误消息附加到form.name而不是form.name.given_name,这就是我想要的。

我哪里错了?

马修

2 个答案:

答案 0 :(得分:1)

解决!

对于遇到类似问题的任何人来说,问题在于表单字段的命名。

在我的实体中,使用camelCase命名属性如下:

protected $givenName;

然而,在我的表单中,我使用下划线表示法命名该字段,因为我认为这是惯例。

$builder->add('given_name', 'text');

除错误冒泡外,其他所有功能都很好。简单的解决方案是重命名我的字段如下:

$builder->add('givenName', 'text');

我希望这有助于某人:)

答案 1 :(得分:0)

您根本不需要将error_bubbling设置为false或true。首先尝试删除将error_bubbling设置为false的所有行。

还尝试将'validation_groups' => array('yourValidationGroup')添加到两个类型中,然后更新验证文件以引用yourValidationGroup

然后,或许作为最后的尝试,将提交按钮添加到ContactType,以确保ContactType是正在提交的。

class ContactType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name', new NameType());
        $builder->add('save', 'submit'));
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class'         => AcmeCoreBundle\Entity\Contact,
            'cascade_validation' => true,
            'validation_groups' => array('yourValidationGroup'),

        ));
    }

    public function getName()
    {
        return 'acme_contact';
    }
}

class NameType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('given_name', 'text', array(
                'required'       => true,
            ));
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class'     => AcmeCoreBundle\Entity\Name,
            'validation_groups' => array('yourValidationGroup'),
        ));
    }

    public function getName()
    {
        return 'acme_name';
    }
}     

修改 我还发现,您可能依赖于注释来进行验证,而不是在捆绑中使用validation.yml文件? (即...... / Resources / config / validation.yml)