IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Formulaire avec de l'ajax


Sujet :

Symfony PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 32
    Points : 17
    Points
    17
    Par défaut Formulaire avec de l'ajax
    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
    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);
    	}
    routing.yml
    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 }
    createqcm.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&deg;{{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&eacute;ponse n&deg;{{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 %}
    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
     
    	<tr class="questionLabel">
    		<td style="text-decoration: underline">Question n&deg;{{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&eacute;ponse n&deg;{{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>
    Merci d'avoir pris le temps de lire.
    Bonne journée.

  2. #2
    Membre émérite
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Points : 2 778
    Points
    2 778
    Par défaut
    Quel est ton SGBD ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Integrity constraint violation
    implique qu'il y a une erreur lors d'une action sur la base. Quelle est l'erreur complète ?

    vérifie bien que tu ne tentes pas de mettre un champ NULL dans une clé primaire par exemple, qu'il n'y ait pas de doublons etc

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 32
    Points : 17
    Points
    17
    Par défaut
    Il s'agit de MySQL version 5.

    Effectivement une "Integrity constraint violation" c'est une contrainte d'intégrité si je tente d'insérer une valeur null dans un champ de clé étrangère ou de supprimé une clé étrangére référencé dans une autre table.

    Seulement il se trouve que le champ titre n'est ni clé primaire, ni clé étrangère. Le champ est juste "NOT NULL". Comme je l'ai dit, en analysant les en-têtes http il ne transmet pas les informations des questions qui ont été ajouté en ajax. Seulement celle de page "originale". Au final, l'objet existe bien en session côté serveur mais le client n'envois pas les données associés. Donc le champ titre est vide ce qui provoque cette erreur.

    Merci.

Discussions similaires

  1. [AJAX] Vérifier formulaire avec de l'AJAX
    Par sihamnet dans le forum jQuery
    Réponses: 3
    Dernier message: 19/02/2014, 13h47
  2. Réponses: 2
    Dernier message: 25/07/2011, 07h57
  3. [AJAX] valider un formulaire avec une fonction ajax
    Par freums dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 18/02/2008, 11h34
  4. [AJAX] Envoi ou non d'un formulaire avec une fonction AJAX
    Par ohhh.gringo dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 16/05/2007, 11h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo