1

我对奏鸣曲管理包很陌生,我可以使用一些帮助。

问题:

我有一个测验实体、一个问题实体、一个答案实体。

测验和问题之间的关系:一对多。

测验实体

/**
* @ORM\OneToMany(targetEntity="Question", mappedBy="quiz", cascade={"persist", "remove"})
*/
protected $questions;

问题实体

/**
* @ORM\ManyToOne(targetEntity="Quiz", inversedBy="questions", cascade={"persist"})
* @ORM\JoinColumn(name="quiz_id", referencedColumnName="id", nullable = false)
*/
protected $quiz;

关系问答:一对多。

问题实体

/**
* @ORM\OneToMany(targetEntity="Answer", mappedBy="question", cascade={"persist", "remove"})
*/
protected $answers;

回答实体

/**
* @ORM\ManyToOne(targetEntity="Question", inversedBy="answers")
* @ORM\JoinColumn(name="question_id", referencedColumnName="id")
*/
protected $question;

我需要一个表格,我可以在其中添加多个问题到一个课程中,每个问题可以有一个或多个答案,这些答案也应该有一个真假标志。

所以基本上我需要这样的东西: 模型

到目前为止,我设法只添加了来自管理员的多个问题。实际上,在几个版本之前(奏鸣曲管理和学说),我的问题和答案都在工作。但是现在我只能添加多个问题,而无法添加任何答案。

这是我的 QuestionType 类:

<?php

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class QuestionType extends AbstractType {

    public function buildForm( FormBuilderInterface $builder, array $options )
    {
        $builder
            ->add('text', 'text', array( 'required' => false, 'label' => 'question' ) )
            ->add('answers', 'collection', array(
                    'type'               => new AnswerType(),
                    'allow_add'          => true,
                    'allow_delete'       => true,
                    'by_reference'       => false,
                    'delete_empty'       => true,
                    'cascade_validation' => false,
                    'label'              => 'Answers',
                    'options'            => array( 'label' => false ),
                    'label_attr'         => array( 'class' => 'answers' ),
            ));
    }


    public function getName()
    {
        return 'questions';
    }

    public function setDefaultOptions( OptionsResolverInterface $resolver )
    {
        $resolver->setDefaults( array(
            'data_class' => MyBundle\CoreBundle\Entity\Question',
        ));
    }

}

这是我的 AnswerType 类:

<?php

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class AnswerType extends AbstractType {

    public function buildForm( FormBuilderInterface $builder, array $options )
    {
        $builder
            ->add('text', 'text', array( 'required' => true, 'label' => 'answer' ) )
            ->add('correct', 'checkbox', array( 'required' => false ) );
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'answers';
    }

    public function setDefaultOptions( OptionsResolverInterface $resolver )
    {
        $resolver->setDefaults( array(
            'data_class' => 'MyBundle\CoreBundle\Entity\Answer',
        ));
    }

}

这是我的 QuizAdmin 课程:

<?php 

use MyBundle\CoreBundle\Form\QuestionType;
use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Route\RouteCollection;

class QuizAdmin extends Admin
{

    // Fields to be shown on create/edit forms
    protected function configureFormFields( FormMapper $formMapper )
    {
        $formMapper
            ->add('title', 'text', array( 'label' => 'Quiz Title' ) )
            ->add('description', 'textarea', array( 'label' => 'Quiz Description' ) )
            ->add('private', 'checkbox', array('required' => false ) )
            ->add('questions', 'collection', array(
                    'type'               => new QuestionType(),
                    'allow_add'          => true,
                    'allow_delete'       => true,
                    'cascade_validation' => false,
                    'by_reference'       => false,
                    'delete_empty'       => true,
                    'options'            => array( 'label' => false ),
            ));
    }

    // 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_type_collection 但它不起作用它返回此错误:“当前字段“问题”未链接到管理员。请为目标实体创建一个“我已经查找并尝试了所有建议在stackoverflow上,但我无法让它工作。我非常感谢您对此事的任何建议。

这就是测验的管理页面目前看起来像问题和答案:

样本

正如我在运行 composer.phar update 之前的几个版本之前提到的那样,我可以同时添加问题和答案(我不记得版本,但后来我遇到了一些独特字段的其他问题,我很高兴得到了修复,但现在我有这个问题)。

如果您有任何建议,我很乐意遵循。

谢谢!

4

2 回答 2

1

我的项目中还有一个测验系统,我拥有与您相同的实体。

您必须为每个实体创建控制器和管理员:

  • 测验:QuizzAdmin / QuizzController
  • 问题: QuestionAdmin / QuestionController
  • 答案:AnswerAdmin / AnswerController

这将解决您的错误:当前字段“问题”未链接到管理员。请为目标实体创建一个。

我使用 sonata_type_collection 作为字段类型,您必须使用此要点:https ://github.com/sonata-project/SonataAdminBundle/pull/1971/files ,否则您将无法添加答案。

您只需要更改您的字段答案以匹配我课程中的答案。

测验管理员:

class QuizzAdmin extends Admin
{
    protected function configureListFields(ListMapper $listMapper)
    {
         $formMapper->add('questions', 'sonata_type_collection',
             array(
                 'by_reference' => false
             ),
             array(
                 'edit' => 'inline',
                 'inline' => 'table'
            )
        );
    }
}

问题管理员:

class QuestionAdmin
{
    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper->add('answers', 'sonata_type_collection',
            array(
                'by_reference' => false
             ),
             array(
                 'edit' => 'inline',
                 'inline' => 'table'
            )
        );
    }
}

此外,您应该考虑在管理类中添加以下代码,以便在管理中添加测验时触发对问题和答案的断言验证:

class QuizzAdmin extends Admin 
{
    protected $formOptions = array(
        'cascade_validation' => true
    );
}
于 2014-11-06T13:42:08.107 回答
0

嗨,我的朋友,这是我的第一个答案,我希望它有用。
我怎样才能为几个 lewel 进行嵌套收集:
1)创建 AnswerType
2)不要创建 QuestionType
3)在 QuestionAdmin 中使用集合 AnswerType
4)在 QuizAdmin 中使用 sonata_type_collection 作为问题实体

于 2016-12-08T22:03:39.160 回答