如何在Coldfusion中仅调用一次cf-function和用户触发器?

时间:2012-04-29 18:21:32

标签: jquery events coldfusion coldfusion-8 cffunction

我在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按预期启动。相当一次......

2 个答案:

答案 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方法。