2011-03-01 2 views
4

Je construis un formulaire pour ma demande de ColdFusion en utilisant le rapport de format de nom [{champ name}] qui lors de l'utilisation RoR ou CFWheels me donner une struct sur le rapport appelé back-end contenant tous mes noms de champs. J'utilise FW/1 pour que tous mes champs de formulaire soient placés dans la portée RC plutôt que de rester dans la portée Form. Je sais qu'il est possible de convertir mes champs de formulaire en une structure ColdFusion, car, comme je l'ai dit, CFWheels le fait. Je n'ai aucune idée de comment faire ma demande.ColdFusion convertir les valeurs dans un struct

Voici une partie de la forme que je parle

<dl class="oneColumn"> 
    <dt class="first"><label for="report[name]">Name</label></dt> 
    <dd><input type="text" name="report[name]" class="text" /></dd> 
    <dt><label for="report[description]">Description</label></dt> 
    <dd><textarea name="report[description]" class="textarea"></textarea></dd> 
</dl> 
+1

FWIW, votre champ de formulaire est déjà un struct. C'est vrai de toutes les étendues de variables. – ale

+0

@Al Oui tous les champs variables ont leurs propres struct, mais dans FW/1 mes champs de formulaire et url se mélangent ensemble avec d'autres choses. J'ai juste besoin de ma portée de formulaire qui n'est pas accessible pour autant que je sache. –

+1

Comme Al a dit que la forme est une structure que vous pouvez manipuler comme n'importe quelle autre structure. –

Répondre

4

Adam avait le bon contexte, mais son extrait de code était faux.

Une fonction qui fonctionne est la suivante:

<cffunction name="$createNestedParamStruct" returntype="struct" access="public" output="false"> 
    <cfargument name="params" type="struct" required="true" /> 
    <cfscript> 
     var loc = {}; 
     for(loc.key in arguments.params) 
     { 
      if (Find("[", loc.key) && Right(loc.key, 1) == "]") 
      { 
       // object form field 
       loc.name = SpanExcluding(loc.key, "["); 

       // we split the key into an array so the developer can have unlimited levels of params passed in 
       loc.nested = ListToArray(ReplaceList(loc.key, loc.name & "[,]", ""), "[", true); 
       if (!StructKeyExists(arguments.params, loc.name)) 
       arguments.params[loc.name] = {}; 

       loc.struct = arguments.params[loc.name]; // we need a reference to the struct so we can nest other structs if needed 
       loc.iEnd = ArrayLen(loc.nested); 
       for(loc.i = 1; loc.i lte loc.iEnd; loc.i++) // looping over the array allows for infinite nesting 
       { 
        loc.item = loc.nested[loc.i]; 
        if (!StructKeyExists(loc.struct, loc.item)) 
         loc.struct[loc.item] = {}; 
        if (loc.i != loc.iEnd) 
         loc.struct = loc.struct[loc.item]; // pass the new reference (structs pass a reference instead of a copy) to the next iteration 
        else 
         loc.struct[loc.item] = arguments.params[loc.key]; 
       } 
       // delete the original key so it doesn't show up in the params 
       StructDelete(arguments.params, loc.key, false); 
      } 
     } 
    </cfscript> 
    <cfreturn arguments.params /> 
</cffunction> 

Je l'ai testé dans ma demande (en dehors de CFWheels) et cela a fonctionné parfaitement. Tout ce que vous faites est de passer dans un struct (dans mon cas, la struct de FW Rc/1) contenant ce qui devrait être des structures, mais l'affichage sous forme de chaînes et vous serez renvoie une structure avec des structures imbriquées.

Exemple:

<cfscript> 
    Struct['hello[world]'] = 1; 
    Struct['hello[earth]'] = 2; 
    myhello = $createNestedParamStruct(Struct); 
    /* Now myhello equals this: 
     myhello.hello.world = 1; 
     myhello.hello.eath = 2; 
    */ 
</cfscript> 
+0

+1 pour la bonne fonction. ;) –

3

Ainsi, la forme la plus fondamentale du changement que vous devez faire est la suivante:

mystruct.name = form["report[name]"]; 

Ce que vous devez faire est écrire une boucle qui boucle sur la structure du formulaire et analyse les noms des champs de formulaire et construit des structures comme celles-ci. Je devine qu'il est déjà écrit quelque part dans CFWheels (en fonction), et vous pourriez vous épargner des maux de tête et de frustration en trouver juste et en le tirant par vous-même.

Je pense que cela, mais je ne suis pas sûr:

<!--- helper method to recursively map a structure to build mapping paths and retrieve its values so you can have your way with a deeply nested structure ---> 
<cffunction name="$mapStruct" returntype="void" access="public" output="false" mixin="dispatch"> 
    <cfargument name="map" type="struct" required="true" /> 
    <cfargument name="struct" type="struct" required="true" /> 
    <cfargument name="path" type="string" required="false" default="" /> 
    <cfscript> 
     var loc = {}; 
     for(loc.item in arguments.struct) 
     { 
      if (IsStruct(arguments.struct[loc.item])) // go further down the rabit hole 
      { 
       $mapStruct(map=arguments.map, struct=arguments.struct[loc.item], path="#arguments.path#[#loc.item#]"); 
      } 
      else // map our position and value 
      { 
       arguments.map["#arguments.path#[#loc.item#]"] = {}; 
       arguments.map["#arguments.path#[#loc.item#]"].value = arguments.struct[loc.item]; 
      } 
     } 
    </cfscript> 
</cffunction> 
Questions connexes