[英]Sonata-admin cannot modify classes with inheritance
我正在使用Symfony2,我有一个类的层次结构。 层次结构非常简单,我有一个问题(父母)和许多不同的子问题。 使用Sonata,我希望能够创建不同类型的问题,即子问题。 为此,我创建了一个类的层次结构,如下所示:
Hippy\ScavengerHuntBundle\Entity\Question:
type: entity
table: null
inheritanceType: JOINED
discriminatorColumn:
name: subClass
type: string
discriminatorMap:
blurredMultipleChoiceQuestion: BlurredMultipleChoiceQuestion
blurredTextQuestion: BlurredTextQuestion
slidingPuzzleQuestion: SlidingPuzzleQuestion
associationQuestion: AssociationQuestion
trueOrFalseQuestion: TrueOrFalseQuestion
lettersInOrderQuestion: LettersInOrderQuestion
shortTextQuestion: ShortTextQuestion
multipleChoiceQuestion: MultipleChoiceQuestion
sentenceGapQuestion: SentenceGapQuestion
fields:
id:
type: integer
id: true
generator:
strategy: AUTO
title:
type: string
length: 255
position:
type: integer
lifecycleCallbacks: { }
我将向您展示一个子类的示例
Hippy\ScavengerHuntBundle\Entity\LettersInOrderQuestion:
type: entity
table: null
fields:
description:
type: text
lifecycleCallbacks: { }
<?php
namespace Hippy\ScavengerHuntBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* LettersInOrderQuestion
*/
class LettersInOrderQuestion extends Question
{
/**
* @var string
*/
private $description;
/**
* Set description
*
* @param string $description
* @return LettersInOrderQuestion
*/
public function setDescription($description)
{
$this->description = $description;
return $this;
}
/**
* Get description
*
* @return string
*/
public function getDescription()
{
return $this->description;
}
}
此时,一切似乎都正确设置(数据库和php类)。
现在,我想将它集成到SonataAdmin,所以我在服务中添加了以下内容
sonata.admin.question:
class: Hippy\ScavengerHuntBundle\Admin\QuestionAdmin
tags:
- { name: sonata.admin, manager_type: orm, group: "Questions", label: "Question" }
arguments:
- ~
- Hippy\ScavengerHuntBundle\Entity\Question
- ~
calls:
- [ setTranslationDomain, [HippyScavengerHuntBundle]]
- [ setSubClasses, [{lettersInOrderQuestion : "Hippy\ScavengerHuntBundle\Entity\LettersInOrderQuestion"}]]
我创建了一个类QuestionAdmin.php
<?php
// src/Acme/DemoBundle/Admin/PostAdmin.php
namespace Hippy\ScavengerHuntBundle\Admin;
use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Hippy\ScavengerHuntBundle\Entity\LettersInOderQuestion;
class QuestionAdmin extends Admin
{
// Fields to be shown on create/edit forms
protected function configureFormFields(FormMapper $formMapper)
{
$subject = $this->getSubject();
var_dump($subject);
//exit();
if ($subject instanceof LettersInOrderQuestionAdmin) {
$formMapper->add('description', 'text');
}
}
// Fields to be shown on filter forms
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$datagridMapper
->add('title')
;
}
// Fields to be shown on lists
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('title')
;
}
}
在这一点上,一件很酷的事情是Sonata管理员似乎认识到我正在处理子类,看看:
我的问题是,当我尝试创建lettersInOrderQuestion对象时,它不被识别为lettersInOrderQuestion而只是作为一个问题。 看这里 :
我们可以看到,首先是通过var_dump,第二个是因为表单描述没有显示,所传递的对象是一个Question而不是LettersInOrderQuestion,即使url是
/admin/hippy/scavengerhunt/question/create?subclass=lettersInOrderQuestion
我的想法已经用完了......
EDIT1:
在问题AdminClass中,在configureFormFields方法中,我添加了
var_dump($this->getSubClasses());
结果如下:
array (size=1)
'lettersInOrderQuestion' => string 'Hippy\ScavengerHuntBundle\Entity
ettersInOrderQuestion' (length=56)
因此,当名称混淆时,实体类的解析看起来有错误...
首先,在QuestionAdmin
中你的命名空间中有一个拼写错误,应该是
use Hippy\\ScavengerHuntBundle\\Entity\\LettersInOrderQuestion;
而不是(奥德而不是订单“
use Hippy\\ScavengerHuntBundle\\Entity\\LettersInOderQuestion;
其次,同样在QuestionAdmin
,您将混合Admin类和实体类。 看到这里,你有:
if ($subject instanceof LettersInOrderQuestionAdmin) {
它应该是,根据你的代码:
if($ subject instanceof LettersInOrderQuestion){
最后,在SonataAdmin中,看起来如果只放置一个子类,该类永远不会被激活。 您必须至少放置两个子类,否则,子类永远不会处于活动状态,请参见此处:
public function hasActiveSubClass()
{
if (count($this->subClasses) > 1 && $this->request) {
return null !== $this->getRequest()->query->get('subclass');
}
return false;
}
这里已经打开了一个问题: https : //github.com/sonata-project/SonataAdminBundle/issues/1945
Sonata admin作为第二个构造函数参数实体类。 此类保存在父SonataAdminClass的私有变量中,无法更改。 这个类使用Model manager来创建这个实体类的新实例,在你的例子中是Question。
此Question对象通过方法getSubject()返回admin;
管理员对您使用实体LettersInOderQuestion的意图一无所知。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.