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

jQuery Discussion :

Fonction success retourne “UNDEFINED” avec CFC query [AJAX]


Sujet :

jQuery

  1. #1
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 102
    Points : 47
    Points
    47
    Par défaut Fonction success retourne “UNDEFINED” avec CFC query
    Bonjour,

    J'ai un problème pour utiliser JQUERY et ajax dans des listes déroulantes d'un formulaire d'une page d'un fichier Coldfusion (cfm). J'utilise Coldfusion (fichier cfc) pour faire une requête pour récupérer les résultats d'une base de données Oracle.

    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
    <cfcomponent output="false">
    	<cffunction name="getTransports" access="remote" returnFormat="json"  returnType="Array">
            <cfargument name="VIL_CD_DEST" type="string" required="yes">  
            <cfargument name="VIL_CD_ORIG" type="string" required="yes"> 
     
     
    	<cfquery name ="transport" datasource="#application.datasource#">
    	<!---Query Transports--->
    		select * from APP_GEN_CODE_T where ST_CLASS_CODE = 'BUD_CTRP'
        </cfquery>
     
    	<cfset transports = arrayNew(1)>
     
    	<cfloop query="transport">		
     
    		<cfquery name="defined_transport" datasource="#application.datasource#">
    			select * from TABLE_FRAIS 
    			where VIL_CD_DEST = <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.VIL_CD_DEST#">
    			and VIL_CD_ORIG = <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.VIL_CD_ORIG#">
    			and CTRP_ST_CODE = '#transport.ST_CODE#'	
    		</cfquery>
     
    	  <cfif defined_transport.recordCount eq 0>
    	    <cfset transport_value = "#transport.ST_DESCRIPTION# (not defined)">
    	  <cfelse>  
    		<cfset transport_value = "#transport.ST_DESCRIPTION#">
    	  </cfif>
     
    		<cfset transports[currentRow]["ID"] = #transport.ST_CODE#>
    		<cfset transports[currentRow]["VALUE"] = #transport_value#>
    	</cfloop>
     
    		<cfreturn transports>
    	</cffunction>
    </cfcomponent>
    Cette fonction lancée dans mon navigateur est fonctionnelle et récupère correctement les résultats sous un format JSON:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [{"VALUE":"Apex (not defined)","ID":"APEX"},{"VALUE":"Plane (not defined)","ID":"AVI"},{"VALUE":"Train 1st class","ID":"TRAIN 1"},{"VALUE":"Car","ID":"VOIT"},{"VALUE":"Cost 0 (not defined)","ID":"ZERO"}]
    Je ne sais pas si le format de ce JSON est correct pour fonctionner avec le script JQUERY.

    Dans le script JQUERY, la fonction success ne récupère pas les résultats et un console.log(result) affiche "undefined". Si j'essaye de faire console.log(result.length), le script lance error et affiche l'erreur en retour.

    Dans firebug, je peux voir dans l'onglet XHR que la requête a été lancée et les résultats en JSON (ci-dessus) sont récupérés.

    Voici mon script QUERY script dans mon fichier CFM:

    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
    $().ready(function() {
         $.ajax({
            type:   'GET',
            url:    'transport.cfc',
            data: {
                method:     'getTransports',
                CITY_TO:    'LUX',
                CITY_FROM:  'UWP'
            },
            dataType:       'json',
            contentType:    'application/json',
     
            success: function(result) {
                var select = $("##transp"); // utilisation de ## pour échapper # car nous sommes en coldfusion
                select.empty();
                select.append(
                    new Option('Select transport', '-1')
                );
                console.log(result) // affiche "undifined"
     
                /* GENERE ERREUR
                $.each(result, function(i, item) {
                    select.append(
                        new Option(item.ID, item.VALUE)
                    );
                });*/
            },
     
            error: function(xhr, message) {
                alert('ajax request failed');
                console.log(xhr, message);
            }
         });
    });
    J'utilise la version JQUERY 1.1.2. et j'ai essayé d'utiliser la dernière version, mais le problème persiste.

    J'ai essayé de suivre la solution proposée dans un forum: remplacer json par jsonp. En faisant cela, les résultats sont bien affichés dans la console grâce au console.log(result) mais la boucle each n'est pas parcourue et l'erreur 'ajax request failed' apparaît à nouveau.

    Pourriez-vous m'aider à résoudre ce problème svp car je ne sais pas comment faire cela.

    Merci d'avance pour votre aide

  2. #2
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Avec la dernière version de jQuery, je vous conseille de tester le code suivant en JSON ou en JSONP :

    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
    $( function(){ // forme abrégée de $(document).ready( function( ){      
     
      var
        jqXHR = $.getJSON( "transport.cfc", {
          "method" : "getTransports",
          "CITY_TO" : "LUX",
          "CITY_FROM" : "UWP"    
        });
     
      setTimeout( function(){
        // Si l'objet différé existe dans l'état "attendre", 
        // alors exécute la méthode fail()
     
        if ( jqXHR && jqXHR.state() === "pending" ){
          jqXHR.abort();
        }
      }, 3000 ); // 3s
     
      jqXHR.done( function( data, textStatus, jqXHR ){
        // succès de la transaction, on doit traiter le contenu de data
        console.log( data, textStatus, jqXHR );
     
      });
     
      jqXHR.fail( function( jqXHR, textStatus, errorThrown ){
        // échec de la transaction, gérer la catastrophe
        console.log( jqXHR, textStatus, errorThrown );
     
      });
     
      jqXHR.always( function( jqXHR, textStatus ){
        // la transaction est terminée
        // nettoyage
        // exécution d'un code dépendant
        console.log( jqXHR, textStatus );
     
      })
     
    });

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  3. #3
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 102
    Points : 47
    Points
    47
    Par défaut
    Merci ce code est fonctionnel. Pourriez-vous me dire comment avec ce code mettre un message de chargement (image ou texte "Loading..." dans les listes déroulantes) avant que le résultat ne soit renvoyé par AJAX?

    Merci d'avance pour votre aide

  4. #4
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Les transactions AJAX sont toujours asynchrones et généralement rapides, donc elles ne bloquent pas l'utilisateur. La plupart du temps, un "loading..." n'est pas utile. Dans le cas contraire, il faut mettre en place le "loading..." juste avant l'appel à $.getJSON() et l'enlever dans jqXHR.always() (transaction AJAX terminée).

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

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

Discussions similaires

  1. [AJAX] Fonction success avec AJAX
    Par prince_rick dans le forum jQuery
    Réponses: 11
    Dernier message: 13/12/2013, 15h46
  2. Fonction undefined reference avec SDL 2 et Code::Blocks
    Par therev123 dans le forum OpenGL
    Réponses: 7
    Dernier message: 07/08/2013, 18h54
  3. Undefined reference avec les fonctions d'une class
    Par romnair dans le forum Débuter
    Réponses: 5
    Dernier message: 10/04/2012, 16h40
  4. [Tableaux] Pb avec fonction qui retourne 2 variables
    Par cyberdevelopment dans le forum Langage
    Réponses: 6
    Dernier message: 12/07/2006, 14h19
  5. Réponses: 17
    Dernier message: 24/03/2005, 12h24

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