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 ?

3 réponses


Bonsoir.
C'est tout à fait normal que la variable data soit vide après chaque rechargement de la page, il vous faut stocker les données à garder quelque part, base de données ou session par exemple, afin de les récupérer par la suite.
Tout ce que vous faites actuellement après que l'utilisateur a soumis le formulaire, c'est de le rediriger vers la question suivante, mais sans sauvegarder les données qu'il choisi, elles ne pourront pas être persistées et donc non récupérable.
Les Framework permettent de faciliter le développement d'application web, mais ils ne vont pas deviner tout ce que vous voulez faire.

Virginia
Auteur

Oui merci pour votre réponse, je sais bien que c'est ça notre problème, que dès qu'on renvoie on vide les data et c'est pour cette raison d'ailleurs qu'on ne récupère que le premier et dernier envoie dans le dump().
Mais le truc c'est comment le stocker, genre en session en Symfony, la seule chose que l'on veut stocker ce sont les résultats du joueurs pusique nous avons une entité Statistic. Mais on s'est un peu perdu et à vrai dire en cours nous avons à chaque fois persisté nos données en BDD. Mais là c'est pas le cas dans l'immédiat, on voudrait tout récupérer et ne persister que les résultats.
Est-ce qu'en Symfony il y a une manière de stocker momentanément comme une session ? Avez-vous juste une piste à me donner ?

Bonjour Virginia,
tu dois pouvoir gérer ça dans ton controleur avec l'objet SessionInterface.
Voici un lien :
https://symfony.com/doc/current/controller.html#session-intro