我在Coldfusion8中有一个组件,它构造一个错误消息日志,并将它传递给JSON中的一个变量,由Jquery接收。
当用户更改语言(重新加载页面)时,我正在重建此组件,如下所示:
HTML:
<a href="index.cfm?lang=EN">change to english</a>
在重新加载时我正在检查 lang ,如果指定我在Coldfusion中运行它:
<cfif isdefined("lang")>
<cfset Session.lang= #lang#>
<!--- rebuild error messages --->
<cfinvoke component="services.errorMsg"
method="createErrMsgsLog"
returnvariable="errMsgs">
</cfinvoke>
<cfoutput><script type="text/javascript">var errorLog = '<cfoutput>#errMsgs#</cfoutput>';</script></cfoutput>
</cfif>
问题1 : 有一个更好的方法吗?从我的小Coldfusion exp中,CFINVOKE创建并丢弃对象,因此这应该是资源友好的。
问题2 :
如何在应用程序/会话启动时运行此命令?我尝试从我的application.cfc onSessionStart 运行它,但是我不能从那里触发任何Javascript警报/控制台,所以我担心什么都没发生......还有一个比石膏应用更好的方法.cfc有这样的功能。
感谢您的一些见解!
修改:
中途:当我改变语言时,我可以解雇这个问题:
<cfif isdefined("Sprachwechsel")>
<cfset Session.Sprache = #Sprachwechsel#>
<cfinvoke component="services.errorMsg" method="createErrMsgsLog" returnvariable="Session.errMsgs">
</cfinvoke>
<cfoutput>
<script type="text/javascript">var errorLog = '<cfoutput>#Session.errMsgs#</cfoutput>'</script>
</cfoutput>
但是我也想从application.cfc中解雇一次。我可以使用相同的代码或下面的代码。什么都没发生。
<cffunction name="onApplicationStart" returnType="boolean" output="false">
<cfscript>
APPLICATION.strObjs = structNew();
APPLICATION.strObjs.objErrMsg = createObject("component","services.errorMsg");
</cfscript>
<cfreturn true />
</cffunction>
<cffunction name="onSessionStart" returnType="void" output="false">
<cfscript>
Session.sprache = "DE";
Session.errMsgs = APPLICATION.strObjs.objErrMsg.createErrMsgsLog();
</cfscript>
<cfreturn true />
</cffunction>
我尝试了很多变种,但是如果我在实际页面上检查它, Session.errMsgs 就会保持不确定状态。知道我错过了什么吗?
EDIT2:
好。我发现问题通过here阅读。当我更改我的应用程序名称时,我看到了什么不起作用,在修复之后,onSessionStart按预期启动。相当一次......
答案 0 :(得分:1)
可能有更好的方法,但是根据您发布的代码,很难说出哪种方式最适合您的特定情况。我假设您的代码示例在index.cfm中?
以下是您可能会做的事情:
1)在Application.cfc中的onApplicationStart()方法中缓存你的组件:
application.objErrMsh = createobject("component", "services.errorMsg");
2)在Application.cfc中的onSessionStart()中将session.lang设置为您的默认语言并设置session.errMsg var:
session.lang = "DE";
session.errMsg = application.objErrMsg.createErrMsgsLog(session.lang);
(我假设您的组件的返回取决于用户的语言设置。如果不是 - 在语言更改时重新调用组件有什么意义?)
3)每当你需要设置你的javascript errorLog var时,你现在可以这样做:
<script type="text/javascript">var errorLog = <cfoutput>#session.errMsg#</cfoutput>;</script>
4)当用户点击“更改语言”链接时,请运行以下代码:
<cfparam name="url.lang" type="string" default="DE">
<cfif url.lang neq session.lang>
<cflock scope="session" type="exclusive">
<cfset session.lang = url.lang>
<cfset session.errMsg = application.objErrMsg.createErrMsgsLog(session.lang)>
</cflock>
</cfif>
即。上面的代码将位于index.cfm页面的顶部。您还需要为url.lang值添加一些验证(例如,它在可接受值的列表中),这样您就不会在那里遇到各种垃圾 - 始终清理所有用户提供的值。
HTH
答案 1 :(得分:1)
我对问题1的帮助不大,但也许可以用2。
您应该能够将代码放在某个CFC中,并从Application.cfc运行它(并且请确保文件名以大写A开头),onRequestStart方法。