Formbuilder:必须管理传递给选择字段的实体

时间:2016-04-15 12:30:25

标签: symfony formbuilder

我正在尝试用3个实体构建一个quizz: Quizz,Question和QuestionAnswer。

Quizz嵌入了一个问题集合,我需要显示所有可能的答案。

这是我的表单构建器:

QuizzType:

        $builder->add('questions', 'collection', array('type' => new QuestionType(),'options' => array('label' => false)));

QuestionType:

        $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
        $this->currentQuestion = $event->getData();
        $form = $event->getForm();

        $form->add('answers', 'entity', array(
            'label' => $this->currentQuestion->getValue(),
            'multiple' => false,
            'expanded' => true,
            'property' =>'value',
            'class' => 'MyQuizzBundle:QuestionAnswer',//*/
            'query_builder' => function (EntityRepository $er) {
                $tmp = $er->createQueryBuilder("a")
                    ->where("a.question = 1");
                return $tmp;
            },
        ));
    });

QUIZZ:

 /**
 * @ORM\OneToMany(targetEntity="Question", mappedBy="quizz")
 */
private $questions;

问题:

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

问题答案:

 /**
 * @ORM\ManyToOne(targetEntity="Question", inversedBy="answers", cascade={"persist"})
 */
private $question;

我收到以下错误

Entities passed to the choice field must be managed. Maybe persist them in the entity manager?

我一直试图找到一个小时的溶剂,我看到人们解决了这个问题,因为实体注释中有错误但我在这里找不到任何错误。

更新:以下是我实例化表单的方法:

$quizz = $this->getDoctrine()->getRepository("MyQuizzBundle:Quizz")->find(1);
    $this->getDoctrine()->getManager()->persist($quizz);
    $form = $this->createForm(new QuizzType(), $quizz);
经过一些测试后,我试图不实例化这个问题而只是回答一个问题,我仍然得到错误:

$question = $this->getDoctrine()->getRepository("QuizzBundle:Question")->find(1);
    $this->getDoctrine()->getManager()->persist($question);
    $form = $this->createForm(new QuestionType(), $question);

仅当我尝试将字段显示为单选按钮(expand = true且multiple = false)时才会引发错误。 如果我将其显示为复选框或选择,我没有错误。

这是一个已知的错误还是我做错了什么?

更新2: 看起来我可以将它显示为收音机,如果我设置了'映射'属性为false:

$form->add('answers', 'entity', array(
        'label' => $this->currentQuestion->getValue(),
        'multiple' => false,
        'expanded' => true,
        'property' =>'value',
        'mapped' => false, 
        'class' => 'MyQuizzBundle:QuestionAnswer',//*/
        'query_builder' => function (EntityRepository $er) {
            $tmp = $er->createQueryBuilder("a")
                ->where("a.question = 1");
            return $tmp;
        },
    ));
显然我想避免使用'映射' => false,所以我可以在用户提交表单后使用我的控制器中的值。

0 个答案:

没有答案