我正在尝试获取嵌入表单的错误消息,以显示有错误的表单字段旁边。
我有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
,这就是我想要的。
我哪里错了?
马修
答案 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)