Symfony 如何在奏鸣曲';当sonata_type_Admin调用时,是s Admin类?
所以,在Sonata Admin的编辑操作中,我试图根据创建或编辑上下文显示不同的表单字段 也许先了解一下背景吧 我有一个图库实体和一个封面照片实体与OneToOne绑定 图库: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
/**
* @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%}检查相同的解决方案。