我已经开始使用Sonata Admin
软件包,我正在关注如何使用软件包映射实体以创建管理界面的示例。
我创建了一个名为Post
的实体,这是配置yml文件:
Emiliano\PostsBundle\Entity\Post:
type: entity
table: null
repositoryClass: Emiliano\PostsBundle\Entity\PostRepository
id:
id:
type: integer
id: true
generator:
strategy: AUTO
fields:
title:
type: string
column: Title
lenght: 100
published:
type: boolean
column: Published
publishingDate:
type: datetime
column: Publishing_Date
nullable: TRUE
lifecycleCallbacks: { }
然后在我的Admin
课程中,我有configureFormFields
方法:
protected function configureFormFields(FormMapper $formMapper) {
$formMapper->add('title', 'text')
->add('published', 'checkbox', array('required' => false))
->add('publishingDate', 'sonata_type_model_hidden');
}
我在奏鸣曲管理员documentation上找到了sonata_type_model_hidden
。我想要实现的是以编程方式处理发布日期(例如,仅在选中复选框published
时设置日期)将实现隐藏到用户。
一切都适用于创建,删除和读取,当涉及到修改实体时,我在stacktrace中收到此消息:
No entity manager defined for class DateTime
In sonata-project/doctrine-orm-admin-bundle/Sonata/DoctrineORMAdminBundle/Model/ModelManager.php at line 214
如果我显示该字段一切正常,我也尝试使用:
->add('publishingDate', 'hidden');
没有成功。
这里究竟出现了什么问题?是因为Sonata Admin
尝试使用实体值填充表单而发布日期是DateTime
,而在表单规范中我写了sonata_type_model_hidden
?如果是这样,我怎么能绕过这个?
答案 0 :(得分:1)
sonata_type_model_hidden
不仅仅是hidden
字段创建者,根据文档:
sonata_type_model_hidden
将使用ModelHiddenType的实例来渲染隐藏字段。隐藏字段的值是相关实体的标识符。
如果我了解您的问题,您只想在字段published
== true
您可以将实体preSave/preUpdate
生命周期回调用于eaxmple
public function preSave()
{
/**
* Check if item is published
*/
if($this->getPublished()) {
$this->setPublishingDate(new \DateTime());
} else {
$this->setPublishingDate(null);
}
}
并从SonataAdmin表单中删除publishingDate
字段。