2012-04-29 51 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