2
votes

I've used this example to set up a small object oriented project

The page I'm redoing had some order features with a dynamic number of input fields (say sizes of an article, some size S-XL, some size S-5XL.

In Coldfusion fields where labelled dynamically like so:

<input type="button" name="qty#counter#" id="qty-field#counter#"

In my CFC, I'm listing all form fields like so:

<cfcomponent output="false" hint="">
   <cfscript>
     VARIABLES.Instance.Validation = {
         field_a="validation_criteria",
         field_b="validation_criteria",
         ...
         }
   </cfscript>
   <cffunction name="Defaults" access="public" returntype="struct" output="false" hint="">
      <cfscript>
      // form defaults
      var formDefaults = {
         field_a="", 
         field_b="",
     ...
         }
     </cfscript>
  <cfreturn formDefaults />     
</cffunction>

<cffunction name="Commit" ... do something with db

  <cfscript>                
var LOCAL = {};
    structAppend(defaultValues, VARIABLES.Instance.FormData);
    LOCAL.xxx = defaultValues;
  </cfscript>

  ... do stuff with LOCAL

So I'm creating an object with all passed form fields and do my stuff inside the CFC. Sort of like cfparam in non-object-oriented pages.

My question:
If I have 200 inputs on a page (easy...), I can't possibly param them each 1-200 or extend my default by 200 inputs. So, my question: Is there an easier way to "param" dynamic number of form fields than to add dummy fields 1-500 and hope this is enough for all cases (which is the worst possible option...)

AND: If I wanted to port this into MySQL... In Coldfusion I have a query like:

<cfoutput query="s">
    <cfquery datasource="db">
    UPDATE pos
    SET qty = "#evaluate("qty#id#")#"
    WHERE id = "#client_id#" and id = "#id#"
    </cfquery>
</cfoutput>

Is there any alternative than to loop in Coldfusion and call a storedProc i-numbers of times?

Thanks for input!

EDIT:
So my current solution looks like this:

 , ean1="", ean2="", ean3="", ean4="", ean5="", ean6="", ean7="", ean8="", ean9="", ean10=""
, ean11="", ean12="", ean13="", ean14="", ean15="", ean16="", ean17="", ean18="", ean19="", ean20=""
, ean21="", ean22="", ean23="", ean24="", ean25="", ean26="", ean27="", ean28="", ean29="", ean30="" 
, ean31="", ean32="", ean33="", ean34="", ean35="", ean36="", ean37="", ean38="", ean39="", ean40="" 
, ean41="", ean42="", ean43="", ean44="", ean45="", ean46="", ean47="", ean48="", ean49="", ean50="" 
, ean51="", ean52="", ean53="", ean54="", ean55="", ean56="", ean57="", ean58="", ean59="", ean60="" 
, ean61="", ean62="", ean63="", ean64="", ean65="", ean66="", ean67="", ean68="", ean69="", ean70="" 
, ean71="", ean72="", ean73="", ean74="", ean75="", ean76="", ean77="", ean78="", ean79="", ean80="" 
, ean81="", ean82="", ean83="", ean84="", ean85="", ean86="", ean87="", ean88="", ean89="", ean90="" 
, ean91="", ean92="", ean93="", ean94="", ean95="", ean96="", ean97="", ean98="", ean99="", ean100=""

// more
, menge1="", menge2="", menge3="", menge4="", menge5="", menge6="", menge7="", menge8="", menge9="", menge10=""
, menge11="", menge12="", menge13="", menge14="", menge15="", menge16="", menge17="", menge18="", menge19="", menge20=""
, menge21="", menge22="", menge23="", menge24="", menge25="", menge26="", menge27="", menge28="", menge29="", menge30="" 
, menge31="", menge32="", menge33="", menge34="", menge35="", menge36="", menge37="", menge38="", menge39="", menge40="" 
, menge41="", menge42="", menge43="", menge44="", menge45="", menge46="", menge47="", menge48="", menge49="", menge50="" 
, menge51="", menge52="", menge53="", menge54="", menge55="", menge56="", menge57="", menge58="", menge59="", menge60="" 
, menge61="", menge62="", menge63="", menge64="", menge65="", menge66="", menge67="", menge68="", menge69="", menge70="" 
, menge71="", menge72="", menge73="", menge74="", menge75="", menge76="", menge77="", menge78="", menge79="", menge80="" 
, menge81="", menge82="", menge83="", menge84="", menge85="", menge86="", menge87="", menge88="", menge89="", menge90="" 
, menge91="", menge92="", menge93="", menge94="", menge95="", menge96="", menge97="", menge98="", menge99="", menge100=""
};

So I'm unhappy but safe until my dynamic form spits out 100+ fields... If anyone know a less code-intensive way of setting up "param"/empty vars than the above, please chip in. Thx!

                                         , 
2
you can loop over your form fields, and assign a default value if len(form[i]) EQ 0. - Henry
do not use evaluate, just use Form["qty#id#"]. Always use cfqueryparam - Henry
you can also turn dynamic form fields into array or struct by naming convention, whatever makes more sense for your situation. - Henry
@Henry - cfqueryparam (I know, skipped for the example), I'm trying to port this from Coldfusion into MySQL, then it will all be procParams. I have sort of fiddled my way through. Using 100 dummys now. See my edit. - frequent

2 Answers

5
votes

What's wrong with doing the cfparam in a loop?

<cfset numOfFields = 200>
<cfset fields = "ean,menge">
<cfloop list="#fields#" index="field">
    <cfloop from="1" to="#numOfFields#" index="i">
        <cfparam name="Form.#field##i#" default="">
    </cfloop>
</cfloop>
1
votes

Loop through the form scope and parse through the fieldnames to find the related inputs.

Here is a sample form to generate a random number of inputs with random values:

<form name="dynamicForm" action="update.cfm" method="post">
<cfoutput>      
<cfloop from="1" to="#randrange(1,100)#" index="i">
        <br>#i#:<input type="text" name="qty#i#" value="#randrange(1,100)#">    
    </cfloop>
    <br><input type="submit" name="submit" value="submit">
</cfoutput> 
</form>

Then, in update.cfm, do the following:

<cfloop list="#form.fieldnames#" index="fieldname">
    <cfif lcase(left(fieldname,3)) EQ "qty">
        <cfset id = mid(fieldname,4,len(fieldname)) >
        <cfstoredproc 
             procedure="schema.updQTY"
             datasource="myDSN">
             <cfprocparam type="IN" cfsqltype="CF_SQL_INTEGER" value="#id#">
             <cfprocparam type="IN" cfsqltype="CF_SQL_INTEGER" value="#form[fieldname]#">
        </cfstoredproc>
    </cfif>
</cfloop>

Personally, I'd name the input fields something more like "qty_XXX" and use listfirst and listlast to parse the fieldnames, but that's pure preference.