1

我在 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 警报/控制台,所以我担心什么都不会发生......而且必须有比使用这样的功能涂抹 application.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:
好的。我发现问题在这里阅读。当我更改我的应用程序名称时,我看到什么不起作用,修复此问题后,onSessionStart 按预期触发。很赶...

4

2 回答 2

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

于 2012-04-29T18:52:00.127 回答
1

我对问题 1 无能为力,但也许对问题 2 有帮助。

您应该能够将您的代码放在某个 CFC 中,并从 Application.cfc 运行它(请确保文件名以大写 A 开头),onRequestStart 方法。

于 2012-04-29T18:52:42.587 回答