我有一个数据库表,它是定义术语的字典 - 键,值。我想从数据库中加载应用程序范围中的字典,并保持它的性能(它不会改变)。
我认为这可能是某种“结构”,但我非常是ColdFusion的新手(帮助其他团队)。
然后,我想对输出到浏览器的一些字符串做一些简单的字符串替换,循环定义的术语并用一些HTML替换术语来定义术语(悬停或链接,细节是后来解决了,并不重要)。
这是application.cfc文件中当前的代码:
<cffunction name="onApplicationStart">
<cfquery name="qryDefinedTerms" datasource="mydsn">
SELECT term, definition FROM definedterms
</cfquery>
<cfset application.definedterms = Array(1)>
<cfloop query="qryDefinedTerms">
<cfset myHash = structNew()>
<cfset myHash.put("term", qryDefinedTerms.term)>
<cfset myHash.put("definition", qryDefinedTerms.definition)>
<cfset ArrayAppend(application.definedterms, myHash)>
</cfloop>
</cffunction>
调用页面尝试按如下方式使用它:
function ReplaceDefinitions(inputstring) {
for (thisdef = 1 ;
thisdef LTE ArrayLen(application.definedterms);
thisdef = (thisdef+1)) {
inputstring = Replace(inputstring,
application.definedterms(thisdef).term,
application.definedterms(thisdef).definition, "ALL");
}
return inputstring;
}
当我调用该函数时,我回来了:“在应用程序中未定义元素DEFINEDTERMS”。
编辑:强制调用OnApplicationStart()工作,显然Cold Fusion的application.cfc与ASP.NET的web.config不同,更改它不会重置应用程序。
答案 0 :(得分:4)
你问过很多单独的问题,但我会去回答它们!你还没有说过你正在使用什么版本的ColdFusion,所以我将回答使用适用于ColdFusion 8及更高版本的代码。
ColdFusion使用一个名为Application.cfc的特殊文件放在Web应用程序的路径中(类似于ASP.Net中的Global.asax)。它有一个调用onApplicationStart的方法,它只在应用程序启动时执行(所以不在每个请求上执行)。这是放置任何常量的好地方。这是一个使用{}语法设置结构(如其他语言中的地图)的简单示例:
的Application.cfc
<cfcomponent> <cffunction name="onApplicationStart"> <!--- set global constants here ---> <cfset application.foo = { a=1, b=2, c="my string" }> </cffunction> </cfcomponent>
如果你想从数据库中获取数据,这里有一个简单的方法(有很多其他方法可能更好但是这应该可以帮助你开始!)
<cfcomponent> <cffunction name="onApplicationStart"> <!--- set global constants here ---> <cfset application.datasource = "mydsn"> <cfquery name="qryConstants" datasource="#application.datasource#"> select key, value from tblConstants </cfquery> <cfset application.constants = {}> <cfloop query="qryConstants"> <cfset application.constants[ qryConstants.key ] = qryConstants.value> </cfloop> </cffunction> </cfcomponent>
至于替换字符串中的值,那么你可以这样做:
somescript.cfm
<cfsavecontent variable="somestring"> Hello, ${key1} how are you? My name is ${key2} </cfsavecontent> <!--- replace the ${key1} and ${key2} tokens ---> <cfloop collection="#application.constants#" item="token"> <cfset somestring = ReplaceNoCase( somestring, "${#token#}", application.constants[ token ], "all" )> </cfloop> <!--- show the string with tokens replaced ---> <cfoutput>#somestring#</cfoutput>
正如我所说,有很多方法可以解决你的问题,但希望你会发现这是一个很好的起点(虽然我没有测试过它!)。
祝你好运,欢迎来到ColdFusion!
答案 1 :(得分:1)
另外,在Application.cfc中修复数组声明。它应该是 ArrayNew(1)而不是Array(1)。然后尝试重新初始化应用程序变量。一种方法是使用cfinvoke:
<cfinvoke component="Application" method="OnApplicationStart" />
一旦你做完了,并做了一些Ben提到的改变。该功能应该有效。注意:如果使用CF8 +
,则可以使用较短的&lt; =和++运算符<cfscript>
// Added variable scoping
function ReplaceDefinitions(inputstring) {
var thisdef = "";
var newString = arguments.inputstring;
for (thisdef EQ 1 ; thisdef LTE ArrayLen(application.definedterms); thisdef = thisdef+1) {
newString = Replace( newString,
application.definedterms[thisdef].term,
application.definedterms[thisdef].definition,
"ALL" );
}
return newString;
}
</cfscript>
答案 2 :(得分:0)
他们都在Developing ColdFusion 9 Applications指南中。 (CF8's here)
如何定义结构(如果这是我需要的键/值对列表)?
http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WSc3ff6d0ea77859461172e0811cbec09f0b-7fe9.html
如何查询?
http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WSc3ff6d0ea77859461172e0811cbec22c24-6efa.html
如何在应用启动时[做某事]?
更换字符串的最佳方法
http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WSc3ff6d0ea77859461172e0811cbec22c24-7a49.html
答案 3 :(得分:0)
如果不深入,我会看到这一点:
application.definedterms(thisdef).term
应该是这样的:
application.definedterms[thisdef].term
在CF中(像许多语言一样)parens暗示函数调用,方括号暗示数组引用。