我使用的是Symfony2,我有一个类的层次结构。层次结构非常简单,我有一个问题(父问题)和许多不同的子问题。使用奏鸣曲,我希望能够创建不同类型的问题,即子问题。为此,我创建了类的层次结构,如下所示:
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,其次是因为表单描述没有显示,传递的对象是一个问题而不是一个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)因此,似乎在解析实体类时出现了错误,因为名称被混淆了.
发布于 2014-02-04 20:43:37
首先,在QuestionAdmin**,中的名称空间中有一个错误--可能是**
use Hippy\ScavengerHuntBundle\Entity\LettersInOrderQuestion;
而不是(奥德而不是秩序)
use Hippy\ScavengerHuntBundle\Entity\LettersInOderQuestion;
其次,也是在QuestionAdmin**,中,您将Admin类和实体类混合起来。看这里,你有:**
if ($subject instanceof LettersInOrderQuestionAdmin) {
应该是,根据您的代码:
if ($subject instanceof LettersInOrderQuestion) {
最后,在中,在SonataAdmin中,如果只放置一个子类,类就永远不会激活。您必须至少放置两个subClasses,如果不是,子类永远不会激活,请参见:
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
发布于 2014-01-31 21:55:54
Sonata将作为第二个构造函数参数实体类。该类保存在父SonataAdminClass的私有变量中,不能更改。在您的案例问题中,这个类使用模型管理器来创建这个实体类的新实例。
这个问题对象通过方法getSubject()返回admin;
管理员对您使用实体LettersInOderQuestion的意图一无所知。
https://stackoverflow.com/questions/21489094
复制相似问题