【问题标题】:Symfony Doctrine OneToOne embedded form error_bubblingSymfony Doctrine OneToOne 嵌入表单 error_bubbling
【发布时间】:2014-03-08 09:46:49
【问题描述】:

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

我有 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 实体。然后我将 Name 表单嵌入到 Contact 表单中。

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,这正是我想要的。

我哪里错了?

马修

【问题讨论】:

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


    【解决方案1】:

    您根本不需要将 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)

    【讨论】:

    • 感谢您的帮助德西。我已经尝试了您建议的所有方法,结果保持不变:(您是对的,我正在使用注释进行验证。这会有所作为吗?
    • 事实上,在任何地方删除error_bubbling 选项都会使given_name 错误出现在Contact 表单上,而不是出现在Name 表单上(和以前一样)。我希望错误出现在 Name 表单中的实际 given_name 字段中。
    • 有趣。我建议在包中尝试validation.yml,您可以在其中设置验证组,但我想知道您的表单视图代码是否有问题。你是如何呈现表格的?您是否正在使用自定义表单字段,并且可能忽略了表单行的表单错误?
    • 谢谢,我在一个项目中缺少'cascade_validation' => true,,以为是error_bubbling错误
    【解决方案2】:

    解决了!

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

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

    protected $givenName;
    

    但是在我的表单中,我使用下划线表示法来命名该字段,因为我相信这是惯例。

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

    这对除了错误冒泡之外的所有内容都很好。简单的解决方案是将我的字段重命名如下:

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

    我希望这对某人有帮助:)

    【讨论】:

      猜你喜欢
      • 2012-09-28
      • 1970-01-01
      • 2016-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多