Forms 如何在Coldfusion CFC中声明动态表单字段默认值?
我正在寻找一种在CFC中动态声明表单默认值的方法,我通过AJAX调用。当前CFC发送订单,我需要将其分解为子订单 我一直在使用这个:Forms 如何在Coldfusion CFC中声明动态表单字段默认值?,forms,dynamic,coldfusion,cfc,Forms,Dynamic,Coldfusion,Cfc,我正在寻找一种在CFC中动态声明表单默认值的方法,我通过AJAX调用。当前CFC发送订单,我需要将其分解为子订单 我一直在使用这个: <!--- static defaults ---> <cffunction name="Defaults" access="public" returntype="struct" output="false" hint="Assign default values to instance"> <cfscript
<!--- 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>
...
当计数器表示子订单时,此字段用于
问题是,这破坏了我的动态表单字段声明,我不明白为什么。我得到以下错误:
Diagnose: Element MENGE.1 is undefined in a CFML structure referenced as part of an expression.
问题:有人能给我一个关于问题的提示吗?我是否也必须对HTML页面上的表单字段进行参数化(不必如此) 谢谢 编辑:
问题是在我的验证函数中,我还需要声明我上面所做的修改。新函数如下所示:
MENGE.1.38
MENGE.1.40
MENGE.1.41
MENGE.2.37
<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 />
var LOCAL={};
var double=structNew();
double.form=VARIABLES.Instance.FormData;
double.criteria=VARIABLES.Instance.Validation;
如果(左(formField,5)等式“MENGE”
或左(formField,10)等式“Bestell类型”
或左(formField,3)等式“EAN”
或左(formField,12)EQ“BESTELL_TEXT”
...
) {
VARIABLES.Instance.Validation[formField]=“pass”;
}
因为我没有在这个函数中添加新的更新的if子句,所以我得到了错误。要在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>
var orders=structNew();
item=listFirst(formField,“');
orderNames=“MENGE,EAN,BESTELLTEXT,BESTELLTYPE”;
if(listFindNoCase(订单名、项目、“”){
如果(!structKeyExists(订单、项目)){
//初始化项
订单[项目]=structNew();
}
orderID=“”;
亚目=”;
如果(列表项(格式字段,“')gt 1){
orderID=listGetAt(formField,2,“"”);
}
if(列表项(表格字段,公式2){
订单【项目】【订单ID】=formData[formField];
}
if(列表项(表格字段,公式3){
subOrderId=listLast(formField,简称“UZ”);
订单【项目】【订单ID】【子订单】=formData[formField];
}
}
我认为问题的原因是您将句点用作表单字段名的一部分。这使每个字段不再是一个简单的元素。如果你用下划线来代替怎么办?比利-你欠我一杯啤酒的原因是我对你答案的投票把你的声誉推到了4位数。lol@DanBracuk-下次你在会议上见到我时打电话给我,我终于明白了。
是一个问题。我把它切换到字段名\uuuuu计数器\uuuu
。这对我来说很好。然后,我也忘记了更新另一行代码,这使它工作。贴在上面。