我正在尝试获取嵌入表单的错误消息,以显示在有错误的表单字段旁边。
我有 2 个与一对一关系相关的教义实体,如下所示:
class Contact
{
/**
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
protected $id
/**
* @ORMOneToOne(targetEntity="Name", mappedBy="contact", cascade={"persist"})
*/
protected $name;
}
class Name
{
/**
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
protected $id
/**
* @var string $givenName
*
* @ORMColumn(type="string", name="given_name", length=255)
* @AssertNotBlank(
* message="Given name must not be blank."
* )
* @AssertLength(
* min="2",
* max="255",
* minMessage="Given name is too short.",
* maxMessage="Given name is too long."
* )
*/
protected $givenName;
}
我创建了 2 个窗体,一个用于联系人实体,一个用于名称实体。然后,我将"名称"窗体嵌入到"联系人"窗体中。
class ContactType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('name', new NameType());
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => AcmeCoreBundleEntityContact,
'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' => AcmeCoreBundleEntityName,
'error_bubbling' => false,
));
}
public function getName()
{
return 'acme_name';
}
}
我已将cascade_validation
设置为"联系人"窗体(根窗体)上的true
,error_bubbling
设置为在所有级别false
。我已经测试了这些配置选项,并且正在设置它们。
但是,错误消息被附加到form.name
而不是form.name.given_name
,这就是我想要的。
我哪里出错了?
马修
解决了!
对于遇到类似问题的任何人来说,问题在于表单字段的命名。
在我的实体中,该属性使用 camelCase 命名,如下所示:
protected $givenName;
但是,在我的表单中,我使用下划线表示法命名该字段,因为我相信这是约定。
$builder->add('given_name', 'text');
这适用于除错误冒泡之外的所有内容。简单的解决方案是重命名我的字段,如下所示:
$builder->add('givenName', 'text');
我希望这对某人有所帮助:)
您根本不需要将error_bubbling设置为 false 或 true。首先尝试删除所有将error_bubbling设置为 false 的行。
此外,请尝试将'validation_groups' => array('yourValidationGroup')
添加到这两种类型,然后更新验证文件以引用yourValidationGroup
然后,也许作为最后一次尝试,将提交按钮添加到联系人类型,以确保联系人类型是要提交的联系人类型。
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' => AcmeCoreBundleEntityContact,
'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' => AcmeCoreBundleEntityName,
'validation_groups' => array('yourValidationGroup'),
));
}
public function getName()
{
return 'acme_name';
}
}
编辑:我还想到,您可能依赖于注释来进行验证,而不是在您的捆绑包中使用 validation.yml 文件?(即.../Resources/config/validation.yml)