Bonjour tout le monde.
Je vous explique mon problème. Je suis en train de réaliser un Bundle qui devra permettre la gestion de questions à choix multiples.
J'ai réalisé la partie front et la partie back office. Un administrateur peut créer un QCM avec les questions associés, et pour chaque question les réponses. Seulement le nombre de question est actuellement statique. J'ai donc fais un bouton, j'ai ajouté un event onclick et j'appelle une fonction javascript qui lance une requête ajax (via jQuery). Ma requête tape dans une action de mon contrôleur admin et s'occupe d'ajouter a mon qcm une nouvelle question et pour cette question 3 nouvelles réponses. Ensuite mon contrôleur fais son rendu de template via Twig et renvois la réponses.
Dans ma page html je récupére la réponse et j'ajoute la génération dans mon formulaire. Tout ceci marche à la perfection. Seulement lors de la validation il me sors une "Integrity constraint violation" sur le champ titre d'une question.
Je regarde les en-têtes HTTP envoyés lors de la requête POST et il se trouve qu'il n'envois pas la totalité de mes champs (seulement ceux existants de base).
J'ai également fais un test pour m'assurer que cela provenais bien de ça, j'ai réactualisé la page après avoir ajouter une question, la page m'affiche bien les champs de ma question, si je valide tout fonctionne .
Si vous avez une idée.
AdminController
routing.yml
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 public function createqcmAction() { // request object $request = $this->getRequest(); // session $session = $this->get('session'); // constantes $NB_QUESTION = 1; $NB_REPONSE = 3; // create new QCM $qcm = $session->get('qcm'); if ($qcm == null) { $qcm = new QCM(); // generate some questions for ($i = 0 ; $i < $NB_QUESTION ; $i++) { $question = new Question(); for ($j = 0 ; $j < $NB_REPONSE ; $j++) { $question->addReponses(new Reponse()); } $qcm->addQuestions($question); } } // make the form $form = $this->createForm(new QCMType(), $qcm); // check if request is post if ($request->getMethod() == "POST") { // bind data to user object $form->bindRequest($request); if ($form->isValid()) { foreach ($qcm->getQuestions() as $question) { $question->setQcm($qcm); foreach($question->getReponses() as $reponse) { $reponse->setQuestion($question); } } $em = $this->getDoctrine()->getEntityManager(); $em->persist($qcm); $em->flush(); return $this->redirect($this->generateUrl('admin_qcm')); } } $session->set('qcm', $qcm); // show template wih parameter return array('form' => $form->createView(), 'questionCount' => $NB_QUESTION); } /** * @Template() */ public function createajaxqcmAction($questionId) { $session = $this->get('session'); $qcm = $session->get('qcm'); // constantes $NB_REPONSE = 3; $question = new Question(); for ($j = 0 ; $j < $NB_REPONSE ; $j++) { $question->addReponses(new Reponse()); } $qcm->addQuestions($question); $form = $this->createForm(new QuestionType(), $question); return array('form' => $form->createView(), 'questionId' => $questionId); }
createqcm.html.twig
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 admin_qcm_create: pattern: /admin/qcm/create/ defaults: { _controller: XXXQCMBundle:Admin:createqcm } admin_qcm_create_ajax: pattern: /admin/qcm/create/ajax defaults: { _controller: XXXQCMBundle:Admin:createajaxqcm, questionId: 1 }
createajaxqcm.html.twig
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 {% javascripts "@XXXQCMBundle/Resources/public/js/*" %} <script src="{{ asset_url }}"></script> <script> var questionCount = {{ questionCount }}; $(document).ready(function() { $('#addQuestionButton').click(function() { $.ajax({ url: '{{ path("admin_qcm_create_ajax") }}', success: function(data) { $('#lastFormQuestion').before(data); questionCount++; } }); }); }); </script> {% endjavascripts %} {% block content %} <div id="errors">{{ form_errors(form)}}</div> <table style="border: 1px dotted black; width: 70%"> <form method="post" action="{{path('admin_qcm_create')}}"> <div id="qcmCreateForm"> <tr valign="top"> <td>{{ form_label(form.titre) }}</td> <td>{{ form_widget(form.titre, {'attr': {'size': '24', 'style': 'font-size: 22px'}}) }}</td> </tr> <tr><td colspan="3" style="border-bottom: 1px dotted black;"></td></tr> {% for key,question in form.questions %} <tr class="questionLabel"> <td style="text-decoration: underline">Question n°{{key + 1}}</td> <td>{{ form_widget(question.titre, {'attr': {'size': '27', 'style': 'font-size: 20px'}}) }}</td> </tr> {% for key,reponse in question.reponses %} <tr> <td style="font-style: italic;">Réponse n°{{key + 1}}</td> <td>{{ form_widget(reponse.titre, {'attr': {'size': '31', 'style': 'font-size: 18px;'}}) }} {{ form_widget(reponse.correct) }} correct ?</td> </tr> {% endfor %} <tr><td colspan="3" style="border-bottom: 1px dotted grey;"></td></tr> {% endfor %} <tr id="lastFormQuestion"></tr> {{ form_rest(form) }} <tr> <td><input id="addQuestionButton" type="button" value="Ajouter question"/></td> </tr> <tr><td colspan="3" style="border-bottom: 1px dotted grey;"></td></tr> <tr> <td><input type="submit" value="Creer le QCM" /></td> </tr> </div> </form> </table> {% endblock %}
Merci d'avoir pris le temps de lire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 <tr class="questionLabel"> <td style="text-decoration: underline">Question n°{{questionId + 1}}</td> <td>{{ form_widget(form.titre, {'attr': {'size': '27', 'style': 'font-size: 20px'}}) }}</td> </tr> {% for key,reponse in form.reponses %} <tr> <td style="font-style: italic;">Réponse n°{{key + 1}}</td> <td>{{ form_widget(reponse.titre, {'attr': {'size': '31', 'style': 'font-size: 18px;'}}) }} {{ form_widget(reponse.correct) }} correct ?</td> </tr> {% endfor %} <tr><td colspan="3" style="border-bottom: 1px dotted grey;"></td></tr>
Bonne journée.
Partager