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: {  }
我将向您展示一个子类的示例
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类和实体类.看到这里,你有:
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;
} 
这里已经打开了一个问题:https://github.com/sonata-project/SonataAdminBundle/issues/1945
| 归档时间: | 
 | 
| 查看次数: | 2571 次 | 
| 最近记录: |