Eti*_*oël 3 php symfony sonata-admin
我正在使用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: { }
Run Code Online (Sandbox Code Playgroud)
我将向您展示一个子类的示例
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;
}
}
Run Code Online (Sandbox Code Playgroud)
此时,一切似乎都正确设置(数据库和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"}]]
Run Code Online (Sandbox Code Playgroud)
我创建了一个类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')
;
}
}
Run Code Online (Sandbox Code Playgroud)
在这一点上,一件很酷的事情是Sonata管理员似乎认识到我正在处理子类,看看: 
我的问题是,当我尝试创建lettersInOrderQuestion对象时,它不被识别为lettersInOrderQuestion,而只是作为一个问题.看这里 :
我们可以看到,首先是通过var_dump,第二个是因为表单描述没有显示,所传递的对象是一个Question而不是LettersInOrderQuestion,即使url是
/admin/hippy/scavengerhunt/question/create?subclass=lettersInOrderQuestion
Run Code Online (Sandbox Code Playgroud)
我的想法已经用完了......
EDIT1:
在问题AdminClass中,在configureFormFields方法中,我添加了
var_dump($this->getSubClasses());
Run Code Online (Sandbox Code Playgroud)
结果如下:
array (size=1)
'lettersInOrderQuestion' => string 'Hippy\ScavengerHuntBundle\Entity?ettersInOrderQuestion' (length=56)
Run Code Online (Sandbox Code Playgroud)
因此,当名称混淆时,实体类的解析看起来有错误...
首先,你的命名空间中有一个拼写错误QuestionAdmin,应该是
use Hippy\ScavengerHuntBundle\Entity\LettersInOrderQuestion;
而不是(奥德而不是订单"
use Hippy\ScavengerHuntBundle\Entity\LettersInOderQuestion;
其次,同样在QuestionAdmin,您将混合Admin类和实体类.看到这里,你有:
Run Code Online (Sandbox Code Playgroud)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;
}
Run Code Online (Sandbox Code Playgroud)
这里已经打开了一个问题:https://github.com/sonata-project/SonataAdminBundle/issues/1945
| 归档时间: |
|
| 查看次数: |
2571 次 |
| 最近记录: |