当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 的编辑操作中,我尝试根据 createedit 上下文显示不同的表单字段。

也许先来一些背景知识..

我有一个与 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 嵌入式管理员创建空对象

Eureka篇三Eureka如何管理服务调用

如何避免子 div 响应调用父母的`onDragLeave`事件

当用户放大 UIScrollView 时如何隐藏某些内容,然后在缩小时显示它?

在 react s-s-r 应用程序中调用 firebase 消息传递方法时,如何修复 self 未定义?

如何在其父窗口关闭时通知 TabCtrl?