gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 00:21:21 25 4
gpt4 key购买 nike

我正在使用 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 管理员似乎认识到我正在处理子类,看看:enter image description here

我的问题是,当我尝试创建一个 lettersInOrderQuestion 对象时,它没有被识别为 lettersInOrderQuestion,而仅被识别为一个问题。看这里:enter image description here

我们可以看到,首先通过 var_dump,其次因为没有显示表单描述,传递的对象是一个问题而不是 LettersInOrderQuestion,即使 url 是

/admin/hippy/scavengerhunt/question/create?subclass=lettersInOrderQuestion

我的想法用完了......

编辑1:

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

var_dump($this->getSubClasses());

结果如下:

array (size=1)

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

因此,由于名称混淆,看起来实体类的解析存在错误...

最佳答案

首先,你在QuestionAdmin中的命名空间有错字,应该是

use Hippy\ScavengerHuntBundle\Entity\LettersInOrderQuestion;

而不是(Oder 而不是 Order)

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

关于php - Sonata-admin 无法修改具有继承的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21489094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com