2010-08-25 10 views
0

J'ai un formulaire de contact assez standard qui utilise un cfc pour le traitement maintenant. Je veux utiliser .post pour les utilisateurs qui ont javascript activé. J'ai créé un tableau avec jQuery des éléments de formulaire et je veux passer cela au même CFC (sans modifier le CFC) mais je ne suis pas sûr de savoir comment le faire. Fondamentalement, je veux passer quelque chose appelé 'formData' comme un argument à la CFC (comme je le fais avec juste le code côté serveur de base), puis l'analyser dans le CFC. À l'heure actuelle, je n'utilise qu'un cfdump dans le cfc (ce qui fonctionne bien avec une soumission non-java) mais cela ne fonctionne pas avec cette configuration. Des idées?Comment créer un tableau approprié d'éléments de formulaire avec jQuery pouvant être utilisé dans une fonction ColdFusion?

Voici mon jQuery

$('#theForm').submit(function(e) { 
    e.preventDefault(); 

    var formData = {}; 
    $('form [name]').each(function(){ 
     formData[this.name] = this.value; 
    }); 
    $.post("cfc/engine.cfc?method=collectdata&returnformat=json", 
      {'formData': formData} 
      ); 
}); 

Et mon CFC

<cffunction name="collectdata" access="remote" output="false" returntype="void"> 
    <cfargument name="formData" type="struct" required="yes"> 
    <cfdump var="#formData#"> 
    <cfabort> 
</cffunction> 
+0

Quels sont les résultats que vous n'obtenez pas? Est-ce qu'il lance une erreur? Ou juste ne pas faire ce que vous attendez? –

+0

"FORMDATA est requis mais n'a pas été transmis" est l'erreur que je reçois ... – Ofeargall

+0

Supprimez la balise CFARGUMENT et vider la portée des arguments. Il vous montrera ce qui est posté.

Répondre

1

Ceci est un autre de ces moments où je souhaite que j'avais un serveur à mes fingertimes 24/7 ...

En regardant de plus près votre CFC, il semble que vous ayez besoin de formData pour être struct. Cependant, IIRC, JSON est considéré comme une chaîne, et vous devrez le désérialiser manuellement. Essayez de changer le type en chaîne, ou supprimez-le tout à fait.

Editer: On dirait que jquery.post() envoie un message http standard, pas un appel AJAX/webservice. Ainsi, le contenu sera mis dans la portée du formulaire, si je comprends correctement tous les docs dispersés.

+0

J'ai enlevé le type =" "et toujours pas aller. L'erreur indique que le paramètre "FORMDATA" n'est pas passé dans la fonction. Suis-je incapable de passer simplement dans la variable formData (tableau) en tant qu'unité entière, puis l'analyser dans le cfc? – Ofeargall

+0

Merci. J'ai fini par le désérialiser manuellement parce que ti était une forme courte. Ça a pris du temps mais je pense que ça va me donner un peu plus de sécurité puisque je vérifie chaque argument pour le CFC. – Ofeargall

0

Préparez votre tableau javascript en le sérialisant en JSON. Une façon simple et rigoureuse de le faire est avec json2js de Crockford. Donc, vous auriez:

<script src="json2.js"></script> 

... puis:

var your_params = [ 'this','that','theother' ]; // your js array 
var s_params = JSON.stringify(your_params); // now as json 

... puis dans votre .post():

{'formData': s_params} 

Définir vos cfc pour recevoir un argument de tapez string (ou any). Dans le cfc, utilisez deserializeJson() sur l'argument entrant:

<cffunction name="collectdata" output="false" access="remote" returntype="void"> 
    <cfargument name="formData" type="string" required="yes"> 
    <cfset var result = deserializejson(arguments.formData)><!--- make a CF array ---> 
    <cfset var foo = isArray(result)> <!--- TRUE! ---> 
    <!--- ... etc ... ---> 
</cffunction> 

Vous avez pris un tableau javascript, il sérialisé JSON, envoyé à votre cfc qui l'a reçue comme une chaîne, puis désérialisée à un " natif "tableau CF. La même chose fonctionnera pour le transport des objets js/structures entre javascript et CF respectivement (par opposition au tableau simple dans cet exemple).