我正在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#)。它们始终是未定义的。
编辑:
还行。这似乎有效:
在应用程序.cfc 内部,我正在调用:
<cfinvoke component="services.errorMsg"
method="createErrMsgsLog"
returnvariable="errMsgs">
</cfinvoke>
内部错误Msg.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>
这似乎是很多代码...
这里只是一个最佳实践答案。引用变量时,您可以只引用名称,无需使用 ##。
例如 <cfset "#trim(bezeichner)#" = "#trim(textinhalt)#">
可<cfset "#trim(bezeichner)#" = trim(textinhalt)>
这并不能解决您未定义的问题,但您应该继续前进(不要费心清理旧代码),但这使其更具可读性 imo。
要在函数中使用值,您需要将该值作为参数值传递到函数中,例如:
<cffunction name="createErrMsgsLog" returntype="object">
<cfargument name="someName" [etc]>
然后在函数中将其引用为 arguments.someName。
虽然您可以脱离函数的内部作用域并从主行访问变量,但这样做并不被认为是特别好的做法。
另一个考虑因素可能是将函数抽象为 CFC 文件中的组件定义,而不仅仅是在"主线"代码中定义它们。 这使得代码更整洁、更连贯,并使其更可重用。 也就是说,通常也有理由以内联方式定义一次性函数。 但也许值得研究:
http://livedocs.adobe.com/coldfusion/8/htmldocs/buildingComponents_01.html#1266855
几件事需要考虑。 与其说是答案,不如说是一些观察:
为了自己的理智,那些必须维护你的代码的人,以及那些想要帮助的人,请不要在查询中使用"select *"。 从我在这里看到的注释中,tx_validate_firma在名为 texte 的查询中返回。 如果代码明确表示:
<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#">