Partage
  • Partager sur Facebook
  • Partager sur Twitter

Symfony 4 : jeu Quizz

Quizz : problème pour récupérer réponses aux Questions

Sujet résolu
    23 septembre 2018 à 15:05:18

    Bonjour,
    Me revoilà avec un autre problème dans notre projet de jeu de Quizz avec les Questions.
    Nous en sommes à l'étape de construction de la partie "game", c'est à dire pourvoir faire une partie de jeu de notre Quizz. Dans chaque Quizz, il y a 10 Questions avec 4 choix de réponses.

    L'idée est donc d'afficher à chaque fois la Question avec les 4 choix de réponses, l'utilisateur choisi et soumet le formulaire qui l'amène ensuite à la Question suivante.
    Dans notre QuizzController nous avons donc pu récupérer le Quizz et les 10 Questions avec les différents choix de réponses :


    /**
           * TODO replacer id par slug
           * a voir pour bloqué l
           * @Route("quizz_{id}/question_{nbr}", name="quizz_play")
           *
           */
        public function play($id, Quizz $quizz, Request $request, $nbr, QuestionRepository $questionRepo)
        {
            $question = $questionRepo->findOneBy(['quizz'=>$id, 'nbr'=>$nbr]);
    
            $user = $this->getUser();
    
            $responses = [
            $question->getProp1() => 'reponse 1',
            $question->getProp2() => 'reponse 2',
            $question->getProp3() => 'reponse 3',
            $question->getProp4() => 'reponse 4'
            ];
            
            //dump($responses);
            //shuffle($responses);
            //dump($responses);
            
            $form = $this->createFormBuilder()
            ->add('response', ChoiceType::class, [
                'label'=>$question->getBody(),
                'choices'=> $responses,
                'expanded' => true,
                'multiple' => false,
                
                ])
                ->getForm();
    
            $form->handleRequest($request);
            if ($form->isSubmitted() && $form->isValid()) {
                $data = $form->getData();
                $nbr++;
    
                if ($nbr <=10) {
                    return $this->redirectToRoute('quizz_play', [
                        'form' => $form->createView(),
                        'question' => $question,
                        'nbr' => $nbr,
                        'id' => $id,
                        ]);
                }
                dump($data);
            }
            
            return $this->render('quizz/play.html.twig', [
                'form' => $form->createView(),
                'question' => $question,
                
    
            ]);
        }


    Et voici l'entité Question qui comporte les propositions de réponses :


    <?php
    
    namespace App\Entity;
    
    use Webmozart\Assert\Assert;
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * @ORM\Entity(repositoryClass="App\Repository\QuestionRepository")
     */
    class Question
    {
        /**
         * @ORM\Id()
         * @ORM\GeneratedValue()
         * @ORM\Column(type="integer")
         */
        private $id;
    
        /**
         * @ORM\Column(type="string", length=255)
         */
        private $body;
    
        /**
         * @ORM\Column(type="string", length=128)
         */
        private $prop1;
    
        /**
         * @ORM\Column(type="string", length=128)
         */
        private $prop2;
    
        /**
         * @ORM\Column(type="string", length=128)
         */
        private $prop3;
    
        /**
         * @ORM\Column(type="string", length=128)
         */
        private $prop4;
    
        /**
         * @ORM\Column(type="string", length=255, nullable=true)
         */
        private $anecdote;
    
        /**
         * @ORM\Column(type="string", length=255, nullable=true)
         */
        private $source;
    
        /**
         * @ORM\Column(type="boolean")
         */
        private $errore;
    
        /**
         * @ORM\ManyToOne(targetEntity="App\Entity\Quizz", inversedBy="questions", cascade={"persist"})
         * @ORM\JoinColumn(nullable=false)
         */
        private $quizz;
    
        /**
         * @ORM\ManyToOne(targetEntity="App\Entity\Level", inversedBy="questions")
         * @ORM\JoinColumn(nullable=false)
         */
        private $level;
    
        /**
         * @ORM\Column(type="integer")
         */
        private $nbr;
    
        public function getId() : ? int
        {
            return $this->id;
        }
    
        public function getBody() : ? string
        {
            return $this->body;
        }
    
        public function setBody(string $body) : self
        {
            $this->body = $body;
    
            return $this;
        }
    
        public function getProp1() : ? string
        {
            return $this->prop1;
        }
    
        public function setProp1(string $prop1) : self
        {
            $this->prop1 = $prop1;
    
            return $this;
        }
    
        public function getProp2() : ? string
        {
            return $this->prop2;
        }
    
        public function setProp2(string $prop2) : self
        {
            $this->prop2 = $prop2;
    
            return $this;
        }
    
        public function getProp3() : ? string
        {
            return $this->prop3;
        }
    
        public function setProp3(string $prop3) : self
        {
            $this->prop3 = $prop3;
    
            return $this;
        }
    
        public function getProp4() : ? string
        {
            return $this->prop4;
        }
    
        public function setProp4(string $prop4) : self
        {
            $this->prop4 = $prop4;
    
            return $this;
        }
    
        public function getAnecdote() : ? string
        {
            return $this->anecdote;
        }
    
        public function setAnecdote(? string $anecdote) : self
        {
            $this->anecdote = $anecdote;
    
            return $this;
        }
    
        public function getSource() : ? string
        {
            return $this->source;
        }
    
        public function setSource(? string $source) : self
        {
            $this->source = $source;
    
            return $this;
        }
    
        public function getErrore() : ? bool
        {
            return $this->errore;
        }
    
        public function setErrore(bool $errore) : self
        {
            $this->errore = $errore;
    
            return $this;
        }
    
        public function getQuizz() : ? Quizz
        {
            return $this->quizz;
        }
    
        public function setQuizz(? Quizz $quizz) : self
        {
            $this->quizz = $quizz;
    
            return $this;
        }
    
        public function getLevel() : ? Level
        {
            return $this->level;
        }
    
        public function setLevel(? Level $level) : self
        {
            $this->level = $level;
    
            return $this;
        }
    
        public function getNbr(): ?int
        {
            return $this->nbr;
        }
    
        public function setNbr(int $nbr): self
        {
            $this->nbr = $nbr;
    
            return $this;
        }
    
    }
    


    Nous avons bien l'affichage de nos 10 Questions, les uns à la suite des autres des qu'on clique sur le bouton submit.
    Le problème est que dans le dump($data) du QuizzController, nous ne récupèrons bien entendu que la dernière réponse. 
    Nous avons tenté de définir au départ un tableau vide de résultats de cette manière :


    $result = [];

    Mais pas moyen du lui passer les réponses validées par la suite. 
    Avez-vous une idée ? 



    -
    Edité par VirginiaAtenza 23 septembre 2018 à 15:07:52

    • Partager sur Facebook
    • Partager sur Twitter
      24 septembre 2018 à 10:42:11

      Hello,

      Pourquoi ne pas stocker $data dans la session, et l'exploiter à la fin ?

      // dump($data);
      $answers = $request->getSession()->get('user_answers', array()); // Récupère la variable 'user_answers' si elle existe ou renvoie un tableau vide si inexistante
      
      $answers[] = $data; // Ajoute une ligne au tableau avec les données courantes
      $request->getSession()->set('user_answers', $answers); // Créer la variable 'user_answers' si inexistante ou réécrit son contenu si existant

      Et dans ton contrôleur qui traite toutes les réponses, tu peux ensuite en faire ce que tu veux !

      $answers = $request->getSession()->get('user_answers', null);
      
      if(empty($answers))
          throw new Exception("Les réponses sont manquantes !"); // Ou tout autre traitement
      else
      {
          foreach($answers as $answer)
          {
              // traitement des réponses une par une
          }
      }




      -
      Edité par Algorun 24 septembre 2018 à 10:42:37

      • Partager sur Facebook
      • Partager sur Twitter
      Celui qui croit tout savoir ne sait rien
        21 décembre 2018 à 12:21:52

        Hé salut,

        Désolée du retard et d'avoir laissé à l'abandon la discussion mais la fin de la formation et la suite, ça a été un peu speed.

        On s'en est sorti pas trop mal pour une première version de notre application à deux et en un mois.

        Voici le résultat :

        http://quizz.vsam.fr/

        Encore merci.

        • Partager sur Facebook
        • Partager sur Twitter

        Symfony 4 : jeu Quizz

        × 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