Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony] Réalisation d'un quizz, FormType

    6 avril 2020 à 10:41:39

    Bonjour à toutes et à tous,

    Je suis actuellement en plein développement d'un quizz et je me heurte à un problème avec mon FormType.

    Voici le projet : j'ai dans ma BDD une table Quizz qui est reliée à une table Question, elle-même reliée à une tables Choix(les réponses).

    Ainsi, lorsque j'affiche mon quizz, je souhaite afficher toutes mes questions/réponses pour ensuite submit ce gros formulaire.

    Mon problème arrive ici : lorsque je créer mon Formulaire avec le FormBuilder, je passe en label_choice la description de la réponse comme ceci :

     public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('choices', EntityType::class,
                    [
                        'label'=> 'Propositions :',
                        'class'=>Choice::class,
                        'choice_label'=>'labelChoice',
                        'expanded'=>true
                    ]
                    )
            ;
        }

    Dans mon Twig, j'essaie d'afficher pour chaque réponse ses questions de cette façon (QuizzForm étant le formulaire créé au dessus que je renvoie par mon Controller,questions est un tableau de Questions de la BDD, pareil pourchoices) :

        {{ form_start(QuizzForm) }}
        {% for question in questions %}
            {{ question.labelQuestion }}
            {% for choice in choices %}
            {{ form_row(QuizzForm.choices) }}
                {% endfor %}
        {% endfor %}
        {{ form_end(QuizzForm) }}



    Voici enfin mon Controller qui s'occupe de renvoyer chaque Choix disponibles pour la Question :

    public function showQuizz(EntityManagerInterface $em)
        {
    
            $idQuizz = 1; //ici je mets en dur l'id du Quizz car je n'ai pas encore fait ma selection 
    
            $quizz = $em->getRepository(Quizz::class)->find($idQuizz);
            $questions = $quizz->getQuestion(); // Je récupère toutes les questions liées avec le Quizz 
    
            $choices = null;
            $tableauDeQuestion = null;
    
            foreach ($questions as $question)
            {
                echo('<p>'.$question->getLabelQuestion().'</p>');
                    $choices = $em->getRepository(Choice::class)->selectByIdQuestion($question->getId());
                    foreach ($choices as $choice)
                    {
                        echo($choice->getLabelChoice());
                    }
                }
    
            $quizzForm = $this->createForm(QuizzResponseType::class, $newAnswer);
    
    
            return $this->render('show_quizz/index.html.twig', [
                "QuizzForm"=>$quizzForm->createView(),
                "questions"=>$questions,
                "choices"=> $choices,
            ]);
        }

    La fonction selectByIdQuestion() me renvoie tous les choix relatifs à l'id de la Question.

    J'ai mis des echo pour voir le déroulé de ce que je récupère, et avec les echo, j'ai bien le bon affichage soit question/réponse-question/réponse etc. Mais dès que je passe sur mon Twig, j'ai juste pour chaque Question toutes les réponses disponibles en BDD.... C'est bien joli mais pas trop ce que je voudrais :-° Surtout que du coup, vu que j'ai une liste de RadioButton, je ne peux choisir qu'une réponse dans tout ça.

    Du coup, comment réaliser ce que je souhaite ? Dois-je abandonner l'idée d'utiliser le FormType de Symfony ? Est-ce simplement un mauvais passage d'informations ?

    Merci d'avance :)

    EDIT : J'ai peut-être une piste :

    public function buildForm(FormBuilderInterface $builder, array $options)
        {
    
            $idQuestion = $options['idQuestion'];
    
            $builder
                ->add('choices', EntityType::class, array
                    (
                        'label'=> 'question.labelQuestion',
                        'class'=>Question::class,
                        'choice_label'=>'choice.labelChoice',
                        'choice_value'=>'choice.id',
                        'query_builder'=> function(ChoiceRepository $cr) use ($idQuestion)
                                            {
                                                return $cr->selectByIdQuestion($idQuestion);
                                            },
                        'expanded'=>true
                    )
    
                    )
            ;
        }
    
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults([
                'data_class' => UserQuestionChoices::class,
    
            ]);
            $resolver->setRequired(['idQuestion']);
        }

    Mon Controller :

     public function showQuizz(EntityManagerInterface $em)
        {
    
            $idQuizz = 1;
    
            $quizz = $em->getRepository(Quizz::class)->find($idQuizz);
            $questions = $quizz->getQuestion();
    
            $options = null;
            $choices = null;
            $tableauDeQuestion = null;
    
            foreach ($questions as $question)
            {
                $options = array("idQuestion", $question->getId());
                echo('<p>'.$question->getLabelQuestion().'</p>');
                    $choices = $em->getRepository(Choice::class)->selectByIdQuestion($question->getId());
                    foreach ($choices as $choice)
                    {
                        echo($choice->getLabelChoice());
                    }
                }
    
    
            $answerAt = new DateTime();
            $newAnswer = new UserQuestionChoices();
            $newAnswer->setUser("bob");
            $newAnswer->setAnsweredAt($answerAt);
    
            foreach ($options as $option)
            {
                echo($option);
            }
    
    
            $quizzForm = $this->createForm(QuizzResponseType::class, $newAnswer, $options);
    
    
            return $this->render('show_quizz/index.html.twig', [
                "QuizzForm"=>$quizzForm->createView(),
                "questions"=>$questions,
                "choices"=> $choices,
            ]);
        }

    J'essaie de passer l'id de ma Question via un tableau d'options. Je reçois cette erreur :

    An error has occurred resolving the options of the form "App\Form\QuizzResponseType": The options "0", "1" do not exist. 






    -
    Edité par VictorianTeaPot 6 avril 2020 à 13:51:55

    • Partager sur Facebook
    • Partager sur Twitter
      9 avril 2020 à 15:19:17

      As tu tenté d'appliquer ta fonction selectByIdQuestion() dans ton contrôlleur plutôt que dans ton Repository afin de boucler sur tes question et les Set() en fonction de leur ID ?
      • Partager sur Facebook
      • Partager sur Twitter

      [Symfony] Réalisation d'un quizz, FormType

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown