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

 书友59418658 发布于 2023-01-30 09:11

我正在使用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)

因此,当名称混淆时,实体类的解析看起来有错误...

1 个回答
  • 首先,你的命名空间中有一个拼写错误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

    2023-01-30 09:13 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有