当sonata_type_admin调用时如何在Sonata的Admin类中获取底层对象?
Posted
技术标签:
【中文标题】当sonata_type_admin调用时如何在Sonata的Admin类中获取底层对象?【英文标题】:How to get underlying object in Sonata's Admin class when called by sonata_type_admin? 【发布时间】:2012-11-10 02:10:03 【问题描述】:因此,在 Sonata Admin 的编辑操作中,我尝试根据 create 或 edit 上下文显示不同的表单字段。
也许先来一些背景知识..
我有一个与 OneToOne 绑定的 Gallery 实体和一个 CoverPhoto 实体。
图库:
/**
* @ORM\OneToOne(targetEntity="CoverImage", mappedBy="gallery", cascade="all", orphanRemoval=true)
**/
private $cover;
封面图片:
/**
* @ORM\OneToOne(targetEntity="Gallery", inversedBy="cover")
**/
private $gallery;
下面是对应的 GalleryAdmin 类:
class GalleriesAdmin extends Admin
protected function configureFormFields(FormMapper $formMapper)
$formMapper
-> add('name', null, array('label' => 'Nazwa'))
-> add('category', 'sonata_type_model', array('label' => 'Kategoria'), array('subject' => $this -> getSubject()))
-> add('cover', 'sonata_type_admin', array('label' => 'Okładka'))
-> add('images', 'sonata_type_collection', array('by_reference' => false, 'label' => 'Powiązane zdjęcia'), array(
'edit' => 'inline',
'sortable' => false,
'inline' => 'table',
))
;
//other stuff
现在我们使用 CoverImageAdmin:
class CoverImagesAdmin extends Admin
protected function configureFormFields(FormMapper $formMapper)
$formMapper
-> add('path', 'thumbnail', array('label' => 'Miniatura'))
-> add('file', 'file', array('required' => false, 'label' => 'Plik'))
;
“缩略图”是我的自定义表单字段,它显示缩略图(令人震惊)。但现在我希望这个字段只出现在“编辑”上下文中。
这应该是小菜一碟
$this -> getSubject()
Admin 类的方法和条件。不幸的是,当我在用于呈现嵌套表单的 CoverImagesAdmin 类中调用 getSubject() 时,它总是返回 null。与 getParent(); 相同;
调用 getForm() 结果
致命错误:已达到“500”的最大函数嵌套级别,正在中止!在 /home/flameheart/Projects/KolberPhotography/vendor/symfony/symfony/src/Symfony/Component /OptionsResolver/Options.php 在第 350 行
我尝试调用 Admin 和 FormMapper 的每个方法来确定表单的上下文,但最终一无所获。
你们知道如何以干净的方式解决这个问题吗?
【问题讨论】:
仅作记录,最大嵌套级别错误与 XDebug 有关,与 Sonata Admin 无关 【参考方案1】:我设法做到了:
protected function configureFormFields(FormMapper $formMapper)
if($this -> getRoot() -> getSubject() -> getCover() && $this -> getRoot() -> getSubject() -> getCover() -> getId() )
$formMapper -> add('path', 'thumbnail', array('label' => 'Miniatura', 'attr' => array('id' => 'gallery_cover_image'), 'label_attr' => array('id' => 'gallery_cover_label')));
$formMapper -> add('file', 'file', array('required' => false, 'label' => 'Plik'));
Imo,这首奏鸣曲确实需要大量的文档和重构,而不是进一步的开发。
【讨论】:
Flameheart 如果这解决了您的问题,您应该将此答案标记为有效。问候! 我同意重构。【参考方案2】:这是一个老问题,我知道,但我发现的最干净的方法是:
$this->id($this->getSubject())
如果返回true,则为编辑表单,如果为false,则为创建表单。
【讨论】:
谢谢。我将您的解决方案添加到我的博客:blog.webdevilopers.net/… - 此外,您可以使用 % if admin.id(object) is not null % 在模板中检查相同的内容。【参考方案3】:您可以使用$this->subjectExists()
获取管理员内部的主题,并且可以使用$this->subjectExists()
函数检查configureFormFields()
管理员函数的上下文。如果它是真的,你正在编辑,否则你正在创造!
【讨论】:
以上是关于当sonata_type_admin调用时如何在Sonata的Admin类中获取底层对象?的主要内容,如果未能解决你的问题,请参考以下文章
阻止 SonataAdmin / Symfony2 使用 sonata_type_admin 嵌入式管理员创建空对象
如何避免子 div 响应调用父母的`onDragLeave`事件
当用户放大 UIScrollView 时如何隐藏某些内容,然后在缩小时显示它?