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

AJAX Discussion :

Fonctionne avec un dataType text, pas avec un dataType json !


Sujet :

AJAX

  1. #1
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut Fonctionne avec un dataType text, pas avec un dataType json !
    Bonjour,

    Des heures que je ne comprends pas ce qui coince !

    1) Le contexte
    Dans un formulaire PHP, j'ai une série de listes déroulantes qui s'enchaînent en dépendance :
    - une première pour choisir un diplôme ;
    - une deuxième pour choisir une mention du diplôme, si ce diplôme propose plusieurs mentions (il n'y en a qu'un chez nous pour le moment) ;
    - une troisième pour choisir un parcours composé d'une première liste de spécialisations d'une certaine mention qui en propose et éventuellement d'une liste d'options selon la spécialisation choisie.

    Le formulaire est chargé de base avec les listes complètes des diplômes, des mentions et des spécialisations. La liste des options est vierge.
    Seule la liste des diplômes est visible au chargement du formulaire. Si on choisit le Master MEEF, la liste des mentions apparaît et si on choisit la mention "ESD", les listes des parcours apparaissent.

    Jusque là, tout va bien... sauf pour la liste des options qui doit récupérer en Ajax les options possibles pour la spécialisation choisie.

    Passons au code...

    2) Côté Javascript
    Code javascript : 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
    /**
     * Restreint la liste des options selon la spécialisation sélectionnée
     * @param integer specialisation : Identifiant de la spécialisation sélectionnée
     */
    function restreindreOption(specialisation)
    {
    	var chemin = baseChemin();
    	var diplome = parseInt($("#diplome_ensfea").val());
    	var objData = {};
    	//var data = "";
     
    	if(specialisation == null)
    	{
    		specialisation = parseInt($("#diplomeEnsfeaSpecialisation").val());
    	}
     
    	if(specialisation != 0)
    	{
    		console.log("Diplome : " + diplome + " / Spécialisation : " + specialisation);
    		objData = {diplome: diplome, specialisation: specialisation};
    		//data = "diplome=" + $("#diplome_ensfea").val() + ",specialisation=" + parseInt(specialisation);
    		//console.log("Data : " + data);
    		//dump(objData);
    		$.ajax({
    			url: chemin + '/fr/Inscription/aj_liste_options',
    			data: objData,
    			dataType: 'json',
    			cache: 'false',
    			type: 'POST',
    			success: function(liste_options)
    			{
    				console.log("succès");
    				//alert(liste_options);
    				/*$("#diplomeEnsfeaOption").html(liste_options);
    				$("#diplomeEnsfeaOption").show();*/
    			}
    		});
    	}
    	else
    	{
    		alert("Spécialisation vide");
    		$("#diplomeEnsfeaOption").html('');
    		$("#diplomeEnsfeaOption").hide();
    		$("#diplomeEnsfeaOption option[value='0']").text("-- Sélectionnez une option parmi rien ! --");
    	}
    }

    3) Côté PHP, en désespoir de cause, j'ai simplifié à l'extrême en commentant presque tout le code et en renvoyant un simple texte :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $html = "Coucou";
    //$html = var_dump($_POST);
    //$html = "Liste options : ".var_dump($liste_options);
    // Envoi de la liste d'options au programme javascript
    echo $html;

    4) Diagnostics effectués
    4.1) Passage en dataType: "text"
    Code javascript : 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
    function restreindreOption(specialisation)
    {
    	var chemin = baseChemin();
    	var diplome = parseInt($("#diplome_ensfea").val());
    	var objData = {};
    	//var data = "";
     
    	if(specialisation == null)
    	{
    		specialisation = parseInt($("#diplomeEnsfeaSpecialisation").val());
    	}
     
    	if(specialisation != 0)
    	{
    		console.log("Diplome : " + diplome + " / Spécialisation : " + specialisation);
    		//objData = {diplome: diplome, specialisation: specialisation};
    		data = "diplome=" + $("#diplome_ensfea").val() + ",specialisation=" + parseInt(specialisation);
    		console.log("Data : " + data);
    		//dump(objData);
    		$.ajax({
    			url: chemin + '/fr/Inscription/aj_liste_options',
    			data: data,
    			dataType: 'text',
    			cache: 'false',
    			type: 'POST',
    			success: function(liste_options)
    			{
    				console.log("succès");
    				//alert(liste_options);
    				/*$("#diplomeEnsfeaOption").html(liste_options);
    				$("#diplomeEnsfeaOption").show();*/
    			}
    		});
    	}
    	else
    	{
    		alert("Spécialisation vide");
    		$("#diplomeEnsfeaOption").html('');
    		$("#diplomeEnsfeaOption").hide();
    		$("#diplomeEnsfeaOption option[value='0']").text("-- Sélectionnez une option parmi rien ! --");
    	}
    }
    => J'ai bien l'alerte de liste_options, c'est à dire que ça affiche "Coucou".
    => Par contre, si je renvoie $html = var_dump($_POST);, je constate que je n'ai pas les deux paramètres nécessaires mais un seul (diplome) avec un texte contenant le second paramètre et sa valeur ; c'est donc inexploitable, ce qui doit justifier l'emploi du format json.

    4.2) Avec le dataType json
    La console de Firefox me dit bien que le retour du programme Ajax est bien "coucou" mais l'alerte dans la fonction de succès ne fonctionne pas : rien ne s'affiche.

    Je ne comprends vraiment pas ce qui coince !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Bon ben ça fonctionne en dataType text !

    C'était ma chaîne textuelle de paramètre qui était mal formée.
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    data = "diplome=" + $("#diplome_ensfea").val() + "&specialisation=" + parseInt(specialisation);
    => paramètres à séparer par & et non pas par une virgule !

    Mais j'aimerais quand même comprendre pourquoi CE programme là ne fonctionne pas en json alors que j'en ai d'autres qui fonctionnent (enfin, a priori parce que je n'ai pas revérifié récemment).

    J'attends donc avant de passer en résolu.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 212
    Par défaut
    Bonjour,
    le datatype ne défini pas le type de données que l'on envoie mais le type de données que l'on attend en retour du serveur, le traitement côté client ne sera donc pas le même.

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Ah OK ! J'avais cru le contraire ! Ça m'apprendra à ne pas revoir la documentation !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 521
    Par défaut
    j'ajoute une petite remarque, quand tu mets dataType:"json" cela t'oblige à renvoyer le résultat serveur sous forme json :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $reponseServeur=[];//déclaration d'un tableau qui va contenir toutes les variables qu'on veux transmettre à ajax
    $reponseServeur["html"] = "Coucou";
    $reponseServeur["une_autre_variable"]="teste....";
    echo json_encode($reponseServeur);//on renvoi tout le tableau en tant que json à ajax

    puis dans ajax, tu n'as qu'à récupérer tes variables comme suite:
    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
     
    $.ajax({
        url: chemin + '/fr/Inscription/aj_liste_options',
        data: objData,
        dataType: 'json',
        cache: 'false',
        type: 'POST'
    })
    .done(function(data){
       console.log("data :",data);
       console.log("data.html :"+data.html);
       console.log("data.une_autre_variable:"+data.une_autre_variable);
    })
    .fail(function)(err){
        alert("Erreur ajax :"+err.responseText);
    });

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/09/2007, 12h15
  2. Réponses: 3
    Dernier message: 07/06/2007, 09h17
  3. Mon script fonctionne avec un bouton, mais pas avec l'image!
    Par julien.63 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 12/04/2006, 16h26
  4. fonctionne avec les sessions pas avec le reste
    Par hugo69 dans le forum Langage
    Réponses: 6
    Dernier message: 22/11/2005, 09h38
  5. Fonction JS qui fonctionne avec Mozilla mais pas avec IE.
    Par etiennegaloup dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 31/10/2005, 13h58

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