我正在使用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: { } 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
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