首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sonata-admin不能用继承修改类

Sonata-admin不能用继承修改类
EN

Stack Overflow用户
提问于 2014-01-31 20:07:09
回答 2查看 2.9K关注 0票数 3

我使用的是Symfony2,我有一个类的层次结构。层次结构非常简单,我有一个问题(父问题)和许多不同的子问题。使用奏鸣曲,我希望能够创建不同类型的问题,即子问题。为此,我创建了类的层次结构,如下所示:

代码语言:javascript
复制
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: {  }

我将向您展示一个子类的示例

代码语言:javascript
复制
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中,所以我在服务中添加了以下内容

代码语言:javascript
复制
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

代码语言:javascript
复制
<?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是

代码语言:javascript
复制
/admin/hippy/scavengerhunt/question/create?subclass=lettersInOrderQuestion

我的想法不多了..。

Edit1:

在问题AdminClass中,在configureFormFields方法中,我添加了

代码语言:javascript
复制
var_dump($this->getSubClasses());

其结果如下:

代码语言:javascript
复制
array (size=1)

'lettersInOrderQuestion' => string 'Hippy\ScavengerHuntBundle\Entity
ettersInOrderQuestion' (length=56)

因此,似乎在解析实体类时出现了错误,因为名称被混淆了.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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,如果不是,子类永远不会激活,请参见:

代码语言:javascript
复制
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

票数 6
EN

Stack Overflow用户

发布于 2014-01-31 21:55:54

Sonata将作为第二个构造函数参数实体类。该类保存在父SonataAdminClass的私有变量中,不能更改。在您的案例问题中,这个类使用模型管理器来创建这个实体类的新实例。

这个问题对象通过方法getSubject()返回admin;

管理员对您使用实体LettersInOderQuestion的意图一无所知。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21489094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档