8722 sujets

Développement web côté serveur, CMS

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 ?
Modifié par Virginia (23 Sep 2018 - 15:10)
Salut,

Si j'ai bien compris, pour chaque question y'a un "submit" qui est fait ? et qui doit ajouter en base ? où uniquement à la fin des 10 questions ?
Salut,
Entre une chose et une autre, finir le projet terminé la formation et 36 00 choses j'ai laissé en suspens le sujet.
On s'en est finalement pas mal sortie avec des astuces pour contourner nos petits soucis.
Voici le résultat pour une 1ère version
http://quizz.vsam.fr/
Merci et désolée pour le retard de ma réponse