2013-02-24 64 views
2

我正在尋找一種方法來在CFC中動態聲明表單默認值,我通過AJAX調用。當前的CFC發送訂單,我需要分解成子訂單。如何在ColdFusion CFC中聲明動態表單域默認值?

我一直在使用這樣的:

<!--- static defaults ---> 
<cffunction name="Defaults" access="public" returntype="struct" output="false" 
    hint="Assign default values to instance"> 
    <cfscript> 
     var formDefaults = { 
       versenden="" 
      , speichern="" 
      ... 
     } 
    </cfscript> 
    <cfreturn formDefaults /> 
</cffunction> 

<cffunction name="Commit" access="public" returntype="struct" output="false" hint="database handler"> 

<!--- add dynamic form fields ---> 
<cfscript>    
    var LOCAL = {}; 
    variables.defs = THIS.Defaults(); 
</cfscript> 
<cfloop collection="#VARIABLES.Instance.FormData#" item="formField"> 
    <cfscript> 
     if ( LEFT(formField, 5) EQ "MENGE" 
      OR LEFT(formField, 3) EQ "EAN" 
      OR LEFT(formField, 12) EQ "BESTELL_TEXT" 
      OR LEFT(formField, 10) EQ "BESTELLTYP" 
      ... 
     ) { 
      variables.defs[formField]=""; 
     } 
    </cfscript> 
</cfloop> 
<cfscript> 
    structAppend(variables.defs, VARIABLES.Instance.FormData);     
    LOCAL.Basket = variables.defs; 
</cfscript> 

... 

所以我首先聲明靜態表單域(單實例只),然後嘗試動態表單域動態地追加到我的數組,這可能會被轉移多次(MENGE38, MENGE39, MENGE40等)

雖然這個工程確定,我需要另一個計數元素添加到我的形式,名稱,所以我將不得不改變MENGE喜歡的東西counter.MENGEMENGE.counter然後將發送表單值這樣的:

MENGE.1.38 
MENGE.1.40 
MENGE.1.41 
MENGE.2.37 

用計數器表示子順序,該字段用於。

問題是,這打破了我的動態表單字段聲明,我不明白爲什麼。我收到以下錯誤:

Diagnose: Element MENGE.1 is undefined in a CFML structure referenced as part of an expression. 

問:
誰能給我什麼問題可能是一個暗示?我是否也必須在HTML頁面上配置表單域(不應該)?

謝謝!

編輯
問題是在我的驗證功能,我還需要聲明我在上面做了修改。新功能如下:

<cffunction name="Validate" access="public" returntype="array" output="false" hint="validate form inputs and return an array of faulty field names."> 
    <cfscript> 
    var LOCAL = {}; 
    var double = structNew(); 
    double.form = VARIABLES.Instance.FormData; 
    double.criteria = VARIABLES.Instance.Validation; 
    </cfscript> 

    <!--- add dynamic form fields for validation... I FORGOT TO UPDATE THIS---> 
    <cfloop collection="#VARIABLES.Instance.FormData#" item="formField"> 
    <cfscript> 
     if ( LEFT(formField, 5) EQ "MENGE" 
      OR LEFT(formField, 10) EQ 'BESTELLTYP' 
      OR LEFT(formField, 3) EQ "EAN" 
      OR LEFT(formField, 12) EQ "BESTELL_TEXT" 
      ... 
     ) { 
      VARIABLES.Instance.Validation[formField]="pass"; 
     } 
    </cfscript> 
    </cfloop> 
    <!--- Get error names and type ---> 
    <cfinvoke component="form_validate" method="validate_fields" double="#double#" returnvariable="validation_errors"></cfinvoke> 
    <cfset LOCAL.ErrorMessages = validation_errors /> 
    <cfreturn LOCAL.ErrorMessages /> 

因爲我沒有在這個函數中添加新的更新,如果從句,我得到的錯誤。

+3

我認爲問題是由於您使用句點作爲表單字段名稱的一部分而引起的。這阻止每個領域是一個簡單的元素。如果使用下劃線會發生什麼? – 2013-02-24 13:53:49

回答

3

要建立在Dan Bracuk的答案上,請使用下劃線(儘管您需要更改「BESTELL_TEXT」的名稱)。使用listFirst,listGetAt和listLast的組合來確定字段名稱結構,並使用下劃線作爲分隔符。請注意我是如何使用列表函數清理你的大IF。這段代碼可能不會滿足您的需求,但希望在不必瞭解業務需求的情況下說明概念。

<cfscript> 
var orders=structNew(); 
item=listFirst(formField,'_'); 
orderNames = "MENGE,EAN,BESTELLTEXT,BESTELLTYPE"; 
if (listFindNoCase(orderNames,item,'_')){ 
    if (!structKeyExists(orders,item)){ 
     // initialize item 
     orders[item]=structNew(); 
    } 
    orderID=""; 
    subOrderId=""; 
    if (listLen(formField,'_') gt 1) { 
     orderID=listGetAt(formField,2,'_'); 
    } 
    if (listLen(formField,'_') eq 2) { 
     orders[item][orderId]=formData[formField]; 
    } 
    if (listLen(formField,'_') eq 3) { 
     subOrderId=listLast(formField,'_'); 
     orders[item][orderId][subOrderId]=formData[formField]; 
    } 

} 
</cfscript> 
+0

比利 - 你欠我一杯啤酒的原因是我對你的回答的投票將你的聲望推到了4位數。 – 2013-02-24 19:40:20

+0

哈哈@DanBracuk - 下一次你在會議上看到我的時候打我 - – 2013-02-24 19:43:14

+0

我終於明白了。 '.'是一個問題。我將它切換到'fieldname__counter__'。這對我來說工作得很好。然後我忘了更新另一行代碼,使其工作。在上面發佈。 – frequent 2013-02-24 21:43:42