繁体   English   中英

当sonata_type_admin调用时,如何在Sonata的Admin类中获取底层对象?

[英]How to get underlying object in Sonata's Admin class when called by sonata_type_admin?

因此,在Sonata Admin的编辑操作中,我试图根据创建编辑上下文显示不同的表单字段。

也许有些背景先..

我有一个Gallery实体和一个与OneToOne绑定的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'))
        ;
    }
}

“缩略图”是我的自定义表单字段,显示缩略图(shocker)。 但现在我希望这个字段只出现在“编辑”上下文中。

这应该是小菜一碟

$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的每个方法来确定表单的上下文但最终没有任何结果。

你们有什么想法以干净的方式解决这个问题吗?

我设法这样做:

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,这个Sonata的东西真的需要大量的文档和重构而不是进一步的开发。

我知道这是一个老问题,但我发现这样做最干净的方法是:

$this->id($this->getSubject())

如果返回true,则为编辑表单,如果为false,则为创建表单。

您可以使用$this->subjectExists()获取管理员内部的主题,并且可以使用函数$this->subjectExists()检查configureFormFields()管理函数的上下文。 如果这是真的,那么你正在编辑,否则你就是在创作!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM