Bonjour,

Nous avons comme petit projet de fin de formation la création d'un je Quizz avec possiblité qu'un utlisateur identifié puisse poster des nouveaux Quizz avec les 10 Questions du Quizz.

Pour le moment nous avons bien lié nos deux entités Quizz et Question. Et nous en sommes à la partie où justement un utlisateur va proposer son nouveau Quizz. Nous avons découpé le système en deux étapes, d'abord l'ajout du Quizz avec le QuizzType.
Voici la première partie du QuizzController :

/**
     * @Route("/quizz/propose/nouveau", name="new_quizz")
     */
    public function new(Request $request, ObjectManager $manager)
    {
        $user = $this->getUser();
        $quizz = new Quizz();
        $form = $this->createForm(QuizzType::class, $quizz);
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            //? j'ajoute le User connecté comme auteur du quizz
            $quizz->setAuthor($user);
            // TODO ajouter un slugger
            $quizz->setSlug('test');
            // TODO comment géer la partie privée si l'utilisateur a plusieurs crew ?
            dump($user);
            //  $quizz->setCrew('user.crew')
            $manager->persist($quizz);
            $manager->flush();
            dump($request);

            //? après la création du questionnaire j'oriente vers la  création des questions.
            return $this->redirectToRoute('questions_quizz', [
                'id' => $quizz->getId(),
                'quizz' => $quizz,
                'nbr' => 0,
            ]);
        }
        return $this->render('quizz/new.html.twig', [
            'form' => $form->createView()
        ]);
    }

Puis l'ajout des 10 Questions où la page se recharge à chaque fois qu'on passe à la Question suivante :

/**
     * @Route("/question/quizz/{id}/{nbr}", name="questions_quizz", methods="POST|GET", defaults={"nbr"=0})
     */
    public function addQuestions(Request $request, ObjectManager $manager, $id, QuizzRepository $qr, $nbr) : Response
    {
        dump($nbr);
        dump($id);
        $question = new Question();
        //? je récupere l'id du quizz créer
        $quizz = $qr->findOneById($id);
        $form = $this->createForm(QuestionType::class, $question);
        $form->handleRequest($request);

        //? je crée une variable pour compter le nombre de question créées
        $nbr++;
        //c'est la avant le if
        if ($form->isSubmitted() && $form->isValid()) {
            $question->setQuizz($quizz);
            $question->setErrore(0);
            $manager->persist($question);
            $manager->flush();
            if ($nbr < 10) {
                $question = new Question();
                $form = $this->createForm(QuestionType::class, $question);
                return $this->render('quizz/newsQuestions.html.twig', [
                    'nbr' => $nbr,
                    'form' => $form->createView(),
                    'quizz' => $quizz,
                ]);
            }
            return $this->redirectToRoute('quizz_list_sort', [
                'sort ' => 'id'
            ]);
        }
        return $this->render('quizz/newsQuestions.html.twig', [
            'form' => $form->createView(),
            'quizz' => $quizz,
            'nbr' => $nbr,
        ]);
    }
}

Du coup, pour empêcher le rechargement nous souhaitons mettre en place une requête Ajax mais impossible, on doit forcément oublier des choses car cela ne fonctionne pas :

var app = {

    init: function () {

        console.log('Hello Webpack Encore! Edit me in assets/js/app.js');

        $('#nextQuestion').on('submit', app.nextQuestion);

    },

    nextQuestion: function (event) {
        event.preventDefault();

        $form = $('#nextQuestion');
        var dataToSend = $(this).serialize();

        $.ajax({
            url: '',

            method: 'POST',
            cache: false,
            data: dataToSend,
            success: function (html) {
                console.log('success')
                $('#nextQuestion').remove();

                var newQuestion = $(html).find('#nextQuestion')
                $('#formDiv').html(newQuestion);

                $('#nextQuestion').on('submit', app.nextQuestion);
            }
        })
    },
}
$(app.init);

Lorsque 'lon passe la requête Ajax en POST, on ne récupère pas la bonne URL et pourtant le décompte des questions saisies se fait bien.
Avez-vous une idée ?

2 réponses


Virginia
Auteur
Réponse acceptée

Alors oui en effet, nous avions enlever la partie url pour faire des test mais je vous rassure, on a avait aussi tester en mettant notre route.
Mais bon, on a fini par faire un point hier avec notre prof de Symfo. L'option d'avoir en premier l'ajout du Quizz avec ensuite par partie des 10 formulaires de Questions , avec la page qui se recharge ne le choque pas du tout. Ce qui manquerait ça serait juste un peu d'ergonomie, quelque chose de plus clair pour l'utilisateur afin qu'il sache où il en est dans l'ajout des questions. L'Ajax à la limite pour la V2 vue que la date des présentation des projets avance à grand pas et que, malgré notre bon rythme, il nous manque tout de même une partie importante, qui est de pouvoir jouer au Quizz.
Alors la soluce ou plutôt devrais-je dire l'astuce de contournement du problème, c'est dans la partie Question nous avons intégrer un aside avec une barre de progression ainsi qu'une reprise de la question postée juste avant.
Donc pour le QuizzController on a ça :

/**
     * @Route("/quizz/propose/nouveau", name="new_quizz")
     */
    public function new(Request $request, ObjectManager $manager)
    {
        $user = $this->getUser();
        $quizz = new Quizz();

        $form = $this->createForm(QuizzType::class, $quizz);

        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            //? j'ajoute le User connecté comme auteur du quizz
            $quizz->setAuthor($user);
            // TODO ajouter un slugger
            $quizz->setSlug('test');
            // TODO comment géer la partie privée si l'utilisateur a plusieurs crew ?
            dump($user);
            //  $quizz->setCrew('user.crew')
            $manager->persist($quizz);
            $manager->flush();
            dump($request);

            //? après la création du questionnaire j'oriente vers la  création des questions.
            return $this->redirectToRoute('questions_quizz', [
                'id' => $quizz->getId(),
                'quizz' => $quizz,
                'nbr' => 0,
            ]);
        }

        return $this->render('quizz/new.html.twig', [
            'form' => $form->createView()
        ]);
    }

    /**
     * @Route("/question/quizz/{id}/{nbr}", name="questions_quizz", methods="POST|GET", defaults={"nbr"=0})
     */
    public function addQuestions(Request $request, ObjectManager $manager, $id, QuestionRepository $questionRepo ,QuizzRepository $qr, $nbr) : Response
    {

        $question = new Question();

        //? je récupere l'id du quizz créer
        $quizz = $qr->findOneById($id);

        dump($question);
        $form = $this->createForm(QuestionType::class, $question);
        $form->handleRequest($request);
        //? je crée une variable pour compter le nombre de question créées
        $nbr++;

        if ($form->isSubmitted() && $form->isValid()) {
            $question->setQuizz($quizz);
            $question->setErrore(0);
            $manager->persist($question);

            $manager->flush();

            $questions = $questionRepo->findBy(['quizz' => $id]);

            if ($nbr < 10) {
                $question = new Question();
                dump($questions);
                $form = $this->createForm(QuestionType::class, $question);
                return $this->render('quizz/newsQuestions.html.twig', [
                    'nbr' => $nbr,
                    'form' => $form->createView(),
                    'quizz' => $quizz,
                    'questions' => $questions,
                ]);
            }

            return $this->redirectToRoute('quizz_list_sort', [
                'sort ' => 'id'
            ]);
        }

        return $this->render('quizz/newsQuestions.html.twig', [
            'form' => $form->createView(),
            'quizz' => $quizz,
            'nbr' => $nbr,
        ]);
    }

Et nos vues Twig :
Partie NewQuizz avec le QuizzType

{% extends 'base.html.twig' %}
{% block new_quizz %}active{% endblock %}
{% block title %}Nouveau Quizz
{% endblock %}

{% block body %}
    <div class="col-8 offset-2">
        <div class="bubble">
            <h2 class="bubble-title">Propose ton Nouveau Quizz</h2>
            <p>Propose ici ton nouveau Quizz.<br/>
                Tu dois saisir un titre de Quizz avec ses 10 Questions.<br/>
                Pour chaque Question, tu dois proposer 1 bonne réponse ainsi que 3 fausses.<br/>
                Tu pourras aussi partager une anecdote en rapport avec la Question, et si le coeur t'en dis, tu pourras mettre un lien de la source où tu as trouvé cette anecdote.</p>
        </div>

        <div class="bubble">
            {{ include('quizz/_formNewQuizz.html.twig') }}
        </div>
    </div>
</div>
</main>
{% endblock %}

le include fait référence à ce fomulaire
{{ form_start(form)}}
{{ form_widget(form) }}

<button class="btn btn-success" type="submit">
    C'est parti pour ton nouveau Quizz !
</button>
{{ form_end(form) }}

Et pour les NewsQuestions avec les 10 avec le QuestionType

{% extends 'base.html.twig' %}
{% block new_quizz %}active{% endblock %}
{% block title %}Nouveau Quizz
{% endblock %}

{% block body %}
    <div class="row col-10 offset-1">
        {#
    <div class="bubble col-8 offset-2">
        TODO a mettre dans u flash message
        <h2 class="bubble-title">Super aux Questions maintenant</h2>
        <p>Ton questionnaire se sent tout vide sans ses questions.<br />
            <h4>titre du questionnaire :
                {{ quizz.title }}</h4>
    </div>
    #}

        <div class="bubble col-8" id="formDiv">
            {{ form_start(form, {'action': path('questions_quizz', {'id': quizz.id, 'nbr' : nbr } )} ) }}
            {{ form_widget(form) }}
            <button class="btn btn-success" type="submit">
                Question suivante !
            </button>
            {{ form_end(form) }}
        </div>

        <aside class="bubble ml-2 col-3">
            <h4>
                Tu es à la Question
                {{ nbr }}</span></h4>
        {#TODO a mettre dans un flash
        <h5>courage plus que
            {{10 - nbr}}
            questions
        </h5>
        <p>
            {% if 3 > nbr %}
            c'est un bon début !
            {% elseif 5 > nbr %}
            c'est une moyenne
            {% elseif 7 > nbr %}
            tu y es presque un dernier effort
            {% endif %}
        </p>
        #}
        <div class="progress">
            <div class="progress-bar bg-success" role="progressbar" aria-valuenow="{{ nbr -1 }}" style="width: {{ (nbr - 1) * 10 }}%" aria-valuemax="9">{{ nbr -1 }}
                / 10</div>
        </div>
        <div>
            {% if questions is defined %}
                {% for q in questions %}
                    <span class="text-left ">Question
                        {{ nbr }}:</span>
                    <p class="shortQuestion">{{ q.body }}</p>

                {% endfor %}
            {% endif %}
        </div>
    </aside>

</div>
{% endblock %}

Voilà en gros comment mettre de côté un problème, on y reviendra sûrement mais pour la V2 ou alors si avant le 3 octobre on a le temps, on vaincra Ajax .

Encore merci de vous être penché sur cette problématique !

Plutôt un pb de js si ça fonctionne sans ajax...
C'est normal ça? :

url: '',

Aucune url n'est appelé en ajax?
C'est l'action du form qui devrait être passée dans l'url à appeler par la fonction $.ajax

Ou alors une route si tu utilises FosJsRouting