2

多言語サイトを使用していて、クライアント側のフォーム検証のために、さまざまな言語のエラーメッセージをブラウザに渡す必要があります。

現在、私はerror.cfcを使用しています。これには次のものが含まれています。

 <cfcomponent displayname="errorMsg" hint="create error msgs">  
      <cffunction name="createErrMsgsLog" output="false" returntype="string">               

           <cfset var allErrMsgs=ArrayNew(2)>
           <cfquery datasource="db" name="texte" cachedWithin="#Session.globalCache#">
                ... query db for snippets and text blocks ...
           </cfquery>
           <cfoutput query="texte"><cfset "#trim(snippet)#" = "#trim(text)#"></cfoutput>
           <cfscript>
                allErrMsgs[1][1] = "comp";
                allErrMsgs[1][2] = tx_validate_comp;
                ...
           </cfscript>
           <cfset Session.errMsgs = serializeJSON(allErrMsgs)>
           <cfreturn Session.errMsgs> 
      </cffunction>
 </cfcomponent> 

だから私はすべてのテキストをつかんで、配列を埋めます。配列はシリアル化されて文字列として返されます。

cfcはapplication.cfc内で呼び出されます

 <cffunction name="onSessionStart" returnType="boolean" output="false" hint="session initalizer">
      ...
      <cfinvoke component="services.errorMsg" method="createErrMsgsLog" returnvariable="errMsgs"></cfinvoke>
      <cfset Session.errMsgs = errMsgs>
      ...
 </cffunction>

そして、すべてのページに次のように含めています。

 <script type="text/javascript" language="JavaScript">var #toScript(Session.errMsgs, "errorLog")#</script>

errorLogが未定義になることがある理由はわかりませんが、ページを更新しているとき、またはアプリケーション内でページURLを手動で入力したとき(ページABCからページDEFに移動)に発生することがあります。

私はJqueryMobileを使用しているので、Sessionが開始されて最初のページが読み込まれると、errorLogが最初のページに1回レンダリングされます。後続のすべてのページがこのページにプルイン/削除されるため、最初のerrorLogは常にアクティブです。URLを手動で変更すると、新しいページを読み込んでいるため、最初のページのerrorLogが失われていると思いますが、新しいページが「独自の」errorLogを取得しない理由、またはすべてが未定義である理由がわかりません。突然の。

質問:
errorLogが定義されていることを確認する方法=ColdfusionでerrorMessagesが作成されることを確認するにはどうすればよいですか?

手伝ってくれてありがとう!

編集: わかりました。Coldfusionにチェックを追加したので、Session変数が定義されていない場合は、それを再作成しています。しかし、これまでのところ、それは常にそこにあります。URLを手動で変更して別のページに移動した場合にのみ発生するようです。IE8で再現できます。不思議なことに、IE8デバッガーをチェックすると、errorLogがありますが、それでも未定義であるというエラーが表示されます...

編集:
cfinvokeをapplication.cfc内のonrequestハンドラーに移動しました。

    <cfif len( Session.errMsgs ) EQ 0>
        <cfinvoke component="services.errorMsg" method="createErrMsgsLog" returnvariable="errMsgs"></cfinvoke>
        <cfset Session.errMsgs = errMsgs> 
    </cfif> 

アプリケーションが起動したときにifステートメント内に収まるだけなので、Coldfusionの部分は正しく機能しているようです。その後、errMsgsが定義されますが、問題は残ります...イライラします。

編集
別の原因は私のJSON文字列である可能性があります。私はそれを次のように設定しています:

 <script type="text/javascript">var #toScript(Session.errMsgs, "errorLog")#; alert(errorLog);</script>

アラートは大丈夫ですが、後でそのように取得しようとすると、次のようになります。

 err = jQuery.parseJSON(errorLog);

NULLを取得しています。私のJSONは次のようになります(有効で、Session.errMsgsに警告します

 [["firma","Bitte Firmennamen eingeben!"],["firma_re","Bitte Firmennamen eingeben!"],... 

またはこれ(無効、toScriptで出力):

 "[[\"firma\",\"Bitte Firmennamen eingeben!\"],[\"firma_re\",\.... (invalid)
4

2 に答える 2

1

さて、これがそれであるかどうかはわかりませんが、いくつかのエラーに気づきました。

<cfif len( Session.errMsgs ) EQ 0>
    <cfinvoke component="services.errorMsg" method="createErrMsgsLog" returnvariable="errMsgs"></cfinvoke>
    <cfset Session.errMsgs = errMsgs> 
</cfif> 

する必要があります:

<cfif arrayLen( Session.errMsgs ) EQ 0>
    <cfinvoke component="services.error" method="createErrMsgsLog" returnvariable="errMsgs"></cfinvoke>
    <cfset Session.errMsgs = errMsgs> 
</cfif>

Session.errMsgsは配列である必要があるため、arrayLen()関数を使用します。また、コンポーネントを表示名ではなくファイル名で呼び出すため、「services.errorMsg」ではなく「services.error」を呼び出します。

また、変数スコープの問題を回避するために、コンポーネントからの戻りで変数を直接設定します。

<cfinvoke component="services.error" method="createErrMsgsLog" returnvariable="SESSION.errMsgs"></cfinvoke>

ええと、実際、私はおそらくcfinvokeをまったく使用しないでしょうが、それはもっとスタイルの問題です。

于 2012-07-25T18:40:26.053 に答える
0

私は問題を見つけたと思います。RequireJSを使用していて、スニペットの上にrequireJSを初期化するための呼び出しがあり、ページに変数を入力しました。これは最初のページでは機能するようですが、後続のページでは、requireJSはjsファイルの再解析がはるかに高速であるように見えるため、変数がページに設定される前に、errorLogを検索するファイルが解析されました。errorLogを設定した後にrequireJSinitを移動すると、問題が解決するようです。

于 2012-07-25T20:43:26.980 に答える