繁体   English   中英

Sonata-admin无法修改具有继承的类

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM