我正在Coldfusion8做我的第一步。我设法用我正在调用的cffunction设置一个组件/服务。
在函数内部,我需要构造一个包含错误和相应错误消息的2x2表。错误消息是多语言的并存储在MySQL表中。
问题:
我找不到从 CFFunction 标记内部引用变量的方法。这不起作用:
// select from database
<cfparam name="Session.Sprache" default="DE">
<cfquery datasource="iln" name="texte">
SELECT *
FROM languages
WHERE sprache = "#Session.lang#"
</cfquery>
<cffunction name="createErrMsgsLog" returntype="object">
// create and populate
<cfset allErrMsgs=ArrayNew(2)>
<cfset allErrMsgs[1][1]="firma">
// not defined
<cfset allErrMsgs[1][2]="#tx_validate_firma#">
....
</cffunction>
问题:
如何在 CFfunction 中正确引用我的变量#tx_validate_firma#。它们总是未定义的。
修改:
好。这似乎有效:
在 application.cfc 里面我打电话:
<cfinvoke component="services.errorMsg"
method="createErrMsgsLog"
returnvariable="errMsgs">
</cfinvoke>
在 errorMsg.cfc 里面我正在做:
<cfcomponent displayname="errorMsg">
<cffunction name="createErrMsgsLog">
<cfquery datasource="mine" name="texte">
SELECT *
FROM sprachen
WHERE sprache = "#Session.Sprache#"
</cfquery>
<cfoutput query="texte">
// column name = value
<cfset "#trim(bezeichner)#" = "#trim(textinhalt)#">
</cfoutput>
// build array
<cfset allErrMsgs=ArrayNew(2)>
<cfset allErrMsgs[1][1] = "firma">
<cfset allErrMsgs[1][2] = #tx_validate_firma#>
...
<cfset errMsgs = serializeJSON(allErrMsgs)>
<cfreturn errMsgs>
</cffunction>
</cfcomponent>
这看起来好像很多代码......
答案 0 :(得分:1)
这里只是一个最佳实践答案。引用变量时,您只需引用名称,无需使用##。
例如
<cfset "#trim(bezeichner)#" = "#trim(textinhalt)#">
可以是<cfset "#trim(bezeichner)#" = trim(textinhalt)>
这并不能解决您未定义的问题,但是您应该继续前进(不要打扰清理旧代码),但这会让它更具可读性。
答案 1 :(得分:0)
要在函数内部使用值,您需要将值作为参数值传递给函数,例如:
<cffunction name="createErrMsgsLog" returntype="object">
<cfargument name="someName" [etc]>
然后在函数中将其引用为arguments.someName。
虽然你可以突破你的功能的内部范围并从主线访问变量,但这并不是特别好的做法。
另一个考虑因素可能是将您的函数抽象为CFC文件中的组件定义,而不是仅仅在“主线”代码中定义它们。这使得更整洁,更连贯的代码,并使其更可重用。也就是说,通常也有理由在内联中定义一次性功能。但也许值得调查一下:
http://livedocs.adobe.com/coldfusion/8/htmldocs/buildingComponents_01.html#1266855
答案 2 :(得分:0)
这里要考虑几件事情。与某些观察结果相比,答案并非如此:
为了您自己的理智,那些必须维护您的代码的人以及那些想要帮助的人,请不要在查询中使用“select *”。从我在这里看到的评论中,在名为texte的查询中返回tx_validate_firma。如果代码明确说:
<cfquery datasource="iln" name="texte">
SELECT tx_validate_firma, etc
FROM languages
WHERE sprache = "#Session.lang#"
</cfquery>
我们都知道价值来自哪里。哦,请在where子句中查看使用cfqueryparam。
我认为这有效,虽然看起来很奇怪:
<cfset allErrMsgs[1][2] = #tx_validate_firma#>
由于没有明确说明tx_validate_firma的范围,我们的局外人仍然在摸不着头脑,因为有人试图稍后继续这样做。
<cfset allErrMsgs[1][2] = texte.tx_validate_firma>
请注意,您不需要在此类作业中使用#。通常在ColdFusion标记内,除非您在引号内,否则不需要它们。像这样:
<cfset fullName = "#firstName# #middleInitial# #lastName#">