让管理表单监听子管理员的验证
Make an admin form listen for validation from child admins
我正在向基于 Symfony 2.8 和 Sonata 的应用程序添加功能。
该应用程序已经有一个 Page 实体和一个 PageAdmin class。我想在每个页面上添加一组嵌套的 Synonym 实体,所以我使我的 PageAdmin 的 configureFormFields()
方法如下所示:
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('title')
->add('synonym', 'sonata_type_collection', array(
'label' => "Synonyme",
'cascade_validation' => true,
'required' => false,
'error_bubbling' => true,
), array(
'edit' => 'inline',
'inline' => 'table'
))
->add('contentBlock', 'sonata_type_collection', array(
'label' => "Inhalt",
'cascade_validation' => true,
'required' => false
), array(
'edit' => 'inline',
'inline' => 'table'
))
;
}
... 通常效果很好。唯一的问题是,当我将 Synonym 实体中的一个必填字段留空时,应用程序不会给我一条漂亮的红色 "flash" 消息来责备我的疏忽。相反,它抛出异常和 returns 500 状态,这不是我想看到的:
Failed to update object: Application\Sonata\PageBundle\Entity\Page 500
Internal Server Error - ModelManagerException 3 linked Exceptions:
NotNullConstraintViolationException » PDOException » PDOException »
...
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'name'
cannot be null
有没有办法为用户很好地标记同义词字段中的遗漏,而不是抛出异常并返回 500 状态?
=====
更新 1:这是我的 SynonymAdmin class 中 configureFormFields() 方法的内容:
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('name', null, ['label' => 'Name *', 'required' => true, 'error_bubbling' => true,])
->add('title', null, ['label' => 'Titel', 'required' => false, 'error_bubbling' => true,])
->add('visible', null, ['label'=>'Sichtbarkeit', 'required' => false, 'error_bubbling' => true,])
;
}
更新 2:这是我实体中的同义词定义 class。
/**
* @var ArrayCollection
*
* @Assert\NotBlank
*
*/
private $synonyms;
... 从 Synonym.php:
/**
* @var string
*
* @Assert\NotBlank
*
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;
对于初学者,我认为您可以将 'required' => true
添加到 SynonymAdmin 中的字段以触发 html5 验证。
除此之外,您还可以向您的实体添加验证规则,Sonata 应该会接受这一点。
class Page
{
/**
* @Assert\Valid
*/
protected $synonyms;
}
class Synonym
{
/**
* @Assert\NotBlank
*/
private $name;
}
我正在向基于 Symfony 2.8 和 Sonata 的应用程序添加功能。
该应用程序已经有一个 Page 实体和一个 PageAdmin class。我想在每个页面上添加一组嵌套的 Synonym 实体,所以我使我的 PageAdmin 的 configureFormFields()
方法如下所示:
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('title')
->add('synonym', 'sonata_type_collection', array(
'label' => "Synonyme",
'cascade_validation' => true,
'required' => false,
'error_bubbling' => true,
), array(
'edit' => 'inline',
'inline' => 'table'
))
->add('contentBlock', 'sonata_type_collection', array(
'label' => "Inhalt",
'cascade_validation' => true,
'required' => false
), array(
'edit' => 'inline',
'inline' => 'table'
))
;
}
... 通常效果很好。唯一的问题是,当我将 Synonym 实体中的一个必填字段留空时,应用程序不会给我一条漂亮的红色 "flash" 消息来责备我的疏忽。相反,它抛出异常和 returns 500 状态,这不是我想看到的:
Failed to update object: Application\Sonata\PageBundle\Entity\Page 500 Internal Server Error - ModelManagerException 3 linked Exceptions: NotNullConstraintViolationException » PDOException » PDOException »
...
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'name' cannot be null
有没有办法为用户很好地标记同义词字段中的遗漏,而不是抛出异常并返回 500 状态?
=====
更新 1:这是我的 SynonymAdmin class 中 configureFormFields() 方法的内容:
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('name', null, ['label' => 'Name *', 'required' => true, 'error_bubbling' => true,])
->add('title', null, ['label' => 'Titel', 'required' => false, 'error_bubbling' => true,])
->add('visible', null, ['label'=>'Sichtbarkeit', 'required' => false, 'error_bubbling' => true,])
;
}
更新 2:这是我实体中的同义词定义 class。
/**
* @var ArrayCollection
*
* @Assert\NotBlank
*
*/
private $synonyms;
... 从 Synonym.php:
/**
* @var string
*
* @Assert\NotBlank
*
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;
对于初学者,我认为您可以将 'required' => true
添加到 SynonymAdmin 中的字段以触发 html5 验证。
除此之外,您还可以向您的实体添加验证规则,Sonata 应该会接受这一点。
class Page
{
/**
* @Assert\Valid
*/
protected $synonyms;
}
class Synonym
{
/**
* @Assert\NotBlank
*/
private $name;
}