Я пытаюсь создать тест для моего приложения с Symfony. На данный момент у меня есть 3 класса, Qcm, QcmQuestion и QcmAnswer. У меня есть несколько вопросов, которые содержат несколько ответов, и я хочу отображать ответы в виде переключателя.

Я только достигаю, чтобы отобразить их в качестве ввода. Как я могу отобразить их как переключатель?

< Сильный > 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
Dayze 24 Апр 2017 в 20:01

2 ответа

Лучший ответ

Мне удалось решить мои проблемы, я использовал 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
Dayze 1 Май 2017 в 14:17

Вы не хотите CollectionType + QcmAnswerType, но вы хотите просто EntityType с опциями multiple: false и expanded: true.

Так что вместо

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

Попробуйте что-то вроде:

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

Дополнительную информацию о EnttiyType можно найти в Документы Symfony.

0
Jakub Matczak 25 Апр 2017 в 06:36