Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 如何在奏鸣曲';当sonata_type_Admin调用时,是s Admin类?_Symfony_Symfony Sonata_Sonata Admin - Fatal编程技术网

Symfony 如何在奏鸣曲';当sonata_type_Admin调用时,是s Admin类?

Symfony 如何在奏鸣曲';当sonata_type_Admin调用时,是s Admin类?,symfony,symfony-sonata,sonata-admin,Symfony,Symfony Sonata,Sonata Admin,所以,在Sonata Admin的编辑操作中,我试图根据创建或编辑上下文显示不同的表单字段 也许先了解一下背景吧 我有一个图库实体和一个封面照片实体与OneToOne绑定 图库: /** * @ORM\OneToOne(targetEntity="CoverImage", mappedBy="gallery", cascade={"all"}, orphanRemoval=true) **/ private $cover; /** * @ORM\OneToOne(targetEntity

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

也许先了解一下背景吧

我有一个图库实体和一个封面照片实体与OneToOne绑定

图库:

/**
 * @ORM\OneToOne(targetEntity="CoverImage", mappedBy="gallery", cascade={"all"}, orphanRemoval=true)
 **/
private $cover;
/**
 * @ORM\OneToOne(targetEntity="Gallery", inversedBy="cover")
 **/
private $gallery; 
封面图片:

/**
 * @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()
管理类和条件的方法。不幸的是,当我在CoverImagesAdmin类中调用getSubject()时,该类用于呈现嵌套表单,它总是返回null。getParent()也是如此

调用getForm()会导致

致命错误:已达到最大函数嵌套级别“500”,正在中止!在里面 /home/flameheart/Projects/KolberPhotography/vendor/symfony/symfony/src/symfony/Component /选项第350行的resolver/Options.php

我试着调用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'));
}

依我看,索纳塔这个东西确实需要大量的文档和重构,而不是进一步的开发

我知道这是一个老问题,但我找到的最干净的方法是:

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

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

可以使用
$this->subjectExists()
在管理员内部获取主题,还可以使用
函数
$this->subjectExists()
检查
配置表单字段()
管理函数的上下文。如果这是真的,你在编辑,否则你在创造

作为记录,最大嵌套级别错误与XDebug有关,与Sonata无关。如果这解决了您的问题,您应该将此答案标记为有效。问候语!我同意重构,谢谢。我在我的博客中添加了您的解决方案:-此外,您可以在模板中使用{%if admin.id(object)not null%}检查相同的解决方案。