2017-04-24 41 views
0

我试图用Symfony为我的应用程序创建测验。 在这一点上,我有3类,Qcm,QcmQuestion和QcmAnswer。 我有多个问题,其中包含多个答案,我想显示答案作为单选按钮。从collectionType呈现单选按钮表单[Symfony]

我只能实现将它们显示为输入。我如何将它们显示为单选按钮?

BaseController.php

$em = $this->getDoctrine()->getManager()>getRepository('QcmBundle:QcmQuestion'); 
    $qcmQuestions = $em->findBy(array('qcm' => $id)); 
      $formBuilderQuestionnaire = $this->createFormBuilder(); 
      $i = 0; 
      foreach ($qcmQuestions as $qcmQuestion) { 
       $formBuilder = $this->get('form.factory')->createNamedBuilder($i, FormType::class, $qcmQuestion); 
       $formBuilder 
        ->add('question') 
        ->add('qcmAnswers', CollectionType::class, [ 
         'entry_type' => QcmAnswerType::class 
        ]) 
    ; 
       $formBuilderQuestionnaire->add($formBuilder); 
       $i++; 
      } 
      $form = $formBuilderQuestionnaire->getForm(); 
      $form->add('save', SubmitType::class, array('label' => 'Envoyer', 
       "attr" => array("class" => "btn btn-primary"))); 
      return $this->render('QcmBundle:qcm:qcmQuestions.html.twig', ["qcmQuestions" => $qcmQuestions, "form" => $form->createView()]); 

QcmAnswerType

class QcmAnswerType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('response'); 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'QcmBundle\Entity\QcmAnswer' 
     )); 
    } 

    public function getBlockPrefix() 
    { 
     return 'qcmbundle_qcmanswer'; 
    } 

回答

0

我设法解决了我的问题,我在里面用查询使用EntityType。

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

,因为我需要传递给createNamedBuilder的这样的问题,整个阵列我有这个错误:

$formBuilder = $this->get('form.factory')->createNamedBuilder($i, FormType::class, $qcmQuestions); 

最终结果:

$em = $this->getDoctrine()->getManager()->getRepository('QcmBundle:QcmQuestion'); 
     $qcmQuestions = $em->findBy(array('qcm' => $id)); 
     $formBuilderQuestionnaire = $this->createFormBuilder(); 
     $i = 0; 
     foreach ($qcmQuestions as $qcmQuestion) { 
      /* @var $qcmQuestion QcmQuestion */ 
      $formBuilder = $this->get('form.factory')->createNamedBuilder($i, FormType::class, $qcmQuestions); 
      $formBuilder 
       ->add('qcmAnswers', EntityType::class, [ 
        'class' => 'QcmBundle\Entity\QcmAnswer', 
        'expanded' => true, 
        'label' => $qcmQuestion->getQuestion(), 
        'query_builder' => function (EntityRepository $er) use ($qcmQuestion) { 
         return $er->createQueryBuilder('qcmAnswer') 
          ->join('qcmAnswer.qcmQuestion', 'qcmQuestion') 
          ->where('qcmAnswer.qcmQuestion = :qcmQuestionId') 
          ->setParameter('qcmQuestionId', $qcmQuestion->getId()); 
        }, 
       ]); 
      $formBuilderQuestionnaire->add($formBuilder); 
      $i++; 
     } 
     $form = $formBuilderQuestionnaire->getForm(); 
0

你不想CollectionType + QcmAnswerType但你只想EntityType的选项multiple: falseexpanded: true

所以不是

->add('qcmAnswers', CollectionType::class, [ 
     'entry_type' => QcmAnswerType::class 
    ]) 

尝试的东西,如:

->add('qcmAnswers', EntityType::class, [ 
     'multiple' => false, 
     'expanded' => true, 
    ]) 

更多EnttiyType信息可以在Symfony Docs找到。

+0

我想这早些时候,但我结束出现这个错误,我一直无法解决它“传递给选择域的实体必须被管理,也许坚持他们在实体管理器中? – Dayze

+0

如果你不使用实体,但没有管理对象,那么改用'ChoiceType'。 –