gpt4 book ai didi

coldfusion - 将 session 从 CFScript 转换为 ColdFusion 标记语法

转载 作者:行者123 更新时间:2023-12-04 18:09:49 25 4
gpt4 key购买 nike

应用程序: JavaScript 函数监听表单元素(输入和选择)的更改,并将数据发布到 CFC 方法,该方法将它们分配给 session 结构。返回结构体,使表单数据在 session 的生命周期内可用。该应用程序改编自 Raymond Camden's Using a server, or session storage, to persist form values 处的代码.

问题:原始 CFC 代码是用 CFScript 编写的。因为我们使用的是 ColdFusion 8,所以在调用该方法时出现错误。因此,我将该方法转换为 ColdFusion 标记语法并停止出现该错误。在 Chrome 的开发工具中,每次我在表单元素中输入内容时,我都可以看到通过 JSON 对象传递到 CFC 的数据。所以我知道 JavaScript 函数正在运行。即使我没有收到任何返回错误,也有一些行为让我相信我的翻译不正确。例如, session 结构的转储仅显示输入的最后一个输入元素,而不是所有元素(如 Ray 的演示中的情况)。

这是原始的 CFScript 版本,然后是我的标签翻译。除了关于我的翻译错误的任何评论之外,我很想对这一行进行解释,<cfset s.name = [s[name]] /> ,尤其是 [s[name]]构造,因为我无法阐明那里发生的事情。谢谢。

脚本语法:

component {
remote void function preserveSession(string awardData) {
if(!isJSON(arguments.awardData)) return;
arguments.awardData = deserializeJSON(arguments.awardData);

//convert the array into a name based struct
var s = {};
for(var i=1; i<=arrayLen(arguments.awardData); i++) {
var name = arguments.awardData[i].name;
if(!structKeyExists(s, name)) {
s[name] = arguments.awardData[i].value;
} else {
//convert into an array
if(!isArray(s[name])) {
s[name] = [s[name]];
}
arrayAppend(s[name], arguments.awardData[i].value);
}
}
session.awardFormData = s;
}
}

标记语法:
<cfcomponent>
<cffunction name="preserveSession" access="remote" returntype="void" output="no">

<cfargument name="awardData" type="string" />

<cfset var s = {} />

<cfif NOT isJSON(arguments.awardData)>
<cfreturn />
</cfif>

<cfset arguments.awardData = #deserializeJSON(arguments.awardData)# />

<cfloop index="i" from="1" to="#arrayLen(arguments.awardData)#">
<cfset name = #arguments.awardData[i].name# />

<cfif NOT structKeyExists(s, name)>
<cfset s.name = #arguments.awardData[i].value# />
<cfelse>
<cfif NOT isArray(s.name) >
<cfset s.name = [s[name]] />
</cfif>
<cfset arrayAppend(s.name, arguments.awardData[i].value) />
</cfif>
</cfloop>

<cfset session.awardFormData = s />

<cfreturn />
</cffunction>
</cfcomponent>

最佳答案

首先,你真的不需要翻译所有这些。 CF8 不支持 cfscript 中的组件/函数,否则您可以按原样使用它:

<cfcomponent>
<cffunction name="preserveSession" access="remote" returntype="void" output="no">
<cfargument name="awardData" type="string" />
<cfscript>
var s = {};
var name = '';
var i = 0;
if(!isJSON(arguments.awardData)) return false;
arguments.awardData = deserializeJSON(arguments.awardData);
for(i=1; i<=arrayLen(arguments.awardData); i++) {
name = arguments.awardData[i].name;
if(!structKeyExists(s, name)) {
s[name] = arguments.awardData[i].value;
} else {
if(!isArray(s[name])) {
s[name] = [s[name]];
}
arrayAppend(s[name], arguments.awardData[i].value);
}
}
session.awardFormData = s;
return true;
</cfscript>
</cffunction>
</cfcomponent>

尝试像这样简单地重新包装胆量而不是重写,看看你是否走得更远。

一般地解释符号: s[name]地址结构 s按存储在 name 中的值的键;这有时称为数组表示法。
它相当于 s.theValueStoredInName 的点符号那里的名字是已知的。
要通过变量名动态寻址结构,最简单的方法是通过数组表示法来实现。

嵌套集同样的事情:
线路 s[name] = [s[name]]正在设置一个键,其值是存储在 name 中的值存储在 s[name] 的命名键中的值.通过包装 [] 中的集合,它是一种数组。

这将有助于澄清这里具体发生的事情:

如果尚未将具有该名称键的内容分配为结构,则将其存储为结构(简单的名称键值)。
如果有,那么 name-key 值中的任何内容都会转换为具有该 name-key 的数组。
然后,如果它是第二项的连续传递(它将是,如果!只是检查此数组转换是否已经至少发生一次),则将第二项附加到具有一样的名字。

就个人而言,为了简单起见,我总是直接设置为数组。然后你总是知道如何处理存储中的值。

关于coldfusion - 将 session 从 CFScript 转换为 ColdFusion 标记语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16947564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com