2012-04-29 49 views
1

我在Coldfusion8中有一个组件,它构造了一个错误消息的日志并将它传递给JSON中的一个变量,以供Jquery使用。如何在Coldfusion中仅调用一次cf函数和用户触发器?

当用户更改语言(重新加载页面)一样,所以我重建这个组件:

HTML:

<a href="index.cfm?lang=EN">change to english</a> 

在我检查重装和如果指定在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> 

Question1: 有没有更好的方法来做到这一点?从我的小Coldfusion exp,CFINVOKE创建并丢弃对象,所以这应该是资源友好

Question2
如何在应用程序/会话启动时运行此操作?我尝试从我的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:
好的。我通过here发现问题。当我更改我的应用程序名称时,我发现什么不起作用,修复此问题后,onSessionStart按预期启动。相当多的...

+0

不要忘记var范围和验证变量。根据你的代码,我可以很容易地将任何东西注入会话变量。 –

+0

hm。你知道一个好的链接让我开始? – frequent

回答

1

有可能是一个更好的方式来做到这一点,但从你发布的代码很难判断哪种方式最适合你的特定情况。我假设你的代码示例在你的index.cfm中?

这里是你可以做什么:在你的Application.cfc设置会议onSessionStart(

application.objErrMsh = createobject("component", "services.errorMsg"); 

2)):

中的Application.cfc您onApplicationStart()方法1)缓存您的组件.lang为默认语言并设置会话。ERRMSG VAR:

session.lang = "DE"; 
session.errMsg = application.objErrMsg.createErrMsgsLog(session.lang); 

(?我这里假设你的组件的回报率取决于用户的语言设置如果没有 - 什么是对语言变化中重新调用组件的点)

3)每当你需要设置你的JavaScript错误日志变种,你现在可以做的事:

<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> 

I.e.上面的代码将位于index.cfm页面的顶部。您还需要为url.lang值添加一些验证(例如,它位于可接受值的列表中),因此您最终不会收到所有类型的垃圾 - 总是会清理所有用户提供的值

心连心

+0

很酷。研究这一点。我已将默认语言设置为会话变量。我也考虑过errorMsg,但是之后将它放在onSessionStart之外,因为我担心用户切换语言时不会更新它。但你的样品照顾这个。错误消息中的值全由我自己决定。不过,感谢卫生技巧。牢记这一点。 – frequent

+0

“createErrMsgLog”不能正确,可以吗? :-) – frequent

+0

对不起,应该是_createErrMsgsLog_(我错过了Msgs中的最后一个_s_) - errorMsg.cfc中方法的名称。我在我的答案中编辑了代码以纠正错字。 – azawaza

1

我不禁大为与问题1,但也许可以用2

你应该能够把你的代码在某处CFC,并从的Application.cfc运行(并且请确保文件名以大写A开头)onRequestStart方法。

+0

为什么首都A?第一周有CF ... – frequent

+1

这是一个最佳实践,最重要的是,没有A,ColdFusion服务器在某些环境下找不到它,比如Unix。在我工作的地方,我们习惯使用Windows IIS服务器,并且很多开发人员习惯于使用全部小写字母,然后我们切换到Unix Apache服务器。这并不好玩。如果ColdFusion没有找到Application.cfc或Application.cfm文件,则不会发出抱怨,但如果变量未设置,应用程序会发出大量抱怨。先前对最佳实践的一点坚持会为我们节省很多问题。 – Barry

+0

很高兴知道。谢谢。 – frequent