1

エラー メッセージのログを作成し、それを JSON の変数に渡して Jquery で取得するコンポーネントが Coldfusion8 にあります。

ユーザーが言語を変更する (ページをリロードする) と、次のようにこのコンポーネントを再構築します。

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>

Question1 : これを行うためのより良い方法はありますか? 私の小さな Coldfusion の経験から、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

質問 1 についてはあまり役に立ちませんが、2 についてはできるかもしれません。

コードをどこかの CFC に配置し、Application.cfc (ファイル名が大文字の A で始まることを確認してください)、onRequestStart メソッドから実行できるはずです。

于 2012-04-29T18:52:42.587 に答える
1

おそらくもっと良い方法がありますが、投稿したコードから、特定の状況に最適な方法を判断するのは困難です. あなたのコード サンプルは index.cfm にあると思いますか?

できることは次のとおりです。

1) Application.cfc の onApplicationStart() メソッドで、コンポーネントをキャッシュします。

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

2) Application.cfc の onSessionStart() で、session.lang をデフォルトの言語に設定し、session.errMsg 変数を設定します。

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

(ここでは、コンポーネントの戻り値はユーザーの言語設定に依存すると想定しています。そうでない場合、言語の変更時にコンポーネントを再起動する意味は何ですか?)

3) javascript の errorLog 変数を設定する必要があるときはいつでも、次のことができるようになりました。

<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 値の検証(たとえば、受け入れられる値のリストにあること) を追加して、そこにあらゆる種類のがらくたが含まれないようにすることもできます。ユーザーが指定したすべての値を常にサニタイズしてください。

h番目

于 2012-04-29T18:52:00.127 に答える