0

私はColdfusion8で最初のステップを実行しています。呼び出しているcffunctionを使用してコンポーネント/サービスをセットアップすることができました。

関数内で、エラーと対応するエラーメッセージを含む2x2テーブルを作成する必要があります。エラーメッセージは多言語であり、MySQLテーブルに保存されます。

問題:

CFFunctionタグ内から変数を参照する方法が見つかりません。これは動作しません:

// select from database
<cfparam name="Session.Sprache" default="DE">
    <cfquery datasource="iln" name="texte">
        SELECT *
        FROM languages
        WHERE sprache = "#Session.lang#"
     </cfquery>

<cffunction name="createErrMsgsLog" returntype="object">
    // create and populate 
    <cfset allErrMsgs=ArrayNew(2)>
    <cfset allErrMsgs[1][1]="firma">
    // not defined
    <cfset allErrMsgs[1][2]="#tx_validate_firma#">
    ....
 </cffunction>

質問:CFfunction
内で変数(別名#tx_validate_firma#)を正しく参照するにはどうすればよいですか?それらは常に未定義です。

編集
わかりました。これはうまくいくようです:

私が呼んでいるapplication.cfcの内部:

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

errorMsg.cfcの内部で私が行っていること:

<cfcomponent displayname="errorMsg">    
    <cffunction name="createErrMsgsLog">
        <cfquery datasource="mine" name="texte">
            SELECT *
            FROM sprachen
            WHERE sprache = "#Session.Sprache#"
        </cfquery>
        <cfoutput query="texte">
            // column name = value
            <cfset "#trim(bezeichner)#" = "#trim(textinhalt)#">
        </cfoutput>
        // build array
        <cfset allErrMsgs=ArrayNew(2)>
        <cfset allErrMsgs[1][1] = "firma">
        <cfset allErrMsgs[1][2] = #tx_validate_firma#>
        ...

        <cfset errMsgs = serializeJSON(allErrMsgs)>
        <cfreturn errMsgs>
    </cffunction>
</cfcomponent>  

これは非常に多くのコードのようです...

4

3 に答える 3

1

ここでは、ベストプラクティスだけが答えます。変数を参照するときは、名前を参照するだけで、##を使用する必要はありません。

例えば <cfset "#trim(bezeichner)#" = "#trim(textinhalt)#">

することができます<cfset "#trim(bezeichner)#" = trim(textinhalt)>

これは未定義の問題を解決するものではありませんが、前進するために従う必要があります(古いコードをクリーンアップする必要はありません)が、これによりimoがはるかに読みやすくなります。

于 2012-04-29T18:36:45.933 に答える
0

関数内で値を使用するには、値を引数値として関数に渡す必要があります。例:

<cffunction name="createErrMsgsLog" returntype="object">
    <cfargument name="someName" [etc]>

そして、それを関数内のarguments.someNameとして参照します。

関数の内部スコープから抜け出し、メインラインから変数にアクセスすることはできますが、そうすることは特に良い習慣とは見なされません。

もう1つの考慮事項は、「メインライン」コード内で関数を定義するだけでなく、CFCファイルのコンポーネント定義に関数を抽象化することです。これにより、コードがより整理され、より一貫性のあるものになり、再利用しやすくなります。とは言うものの、1回限りの関数をインラインで定義することには正当な理由があることもよくあります。しかし、おそらく調査する価値があります。

http://livedocs.adobe.com/coldfusion/8/htmldocs/buildingComponents_01.html#1266855

于 2012-04-29T16:19:42.903 に答える
0

ここで考えるべきことがいくつかあります。いくつかの観察ほど答えはありません:

あなた自身の正気のために、あなたのコードを維持しなければならない人々、そして助けたい人々は、クエリで「select*」を使用しないでください。ここで見たコメントから、texteという名前のクエリでtx_validate_firmaが返されます。コードが明示的に言った場合:

<cfquery datasource="iln" name="texte">
    SELECT tx_validate_firma, etc
    FROM languages
    WHERE sprache = "#Session.lang#"
 </cfquery>

価値がどこから来たのかは誰もが知っているでしょう。ああ、where句でcfqueryparamを使用することを検討してください。

奇妙に思えますが、これは機能すると思います。

<cfset allErrMsgs[1][2] = #tx_validate_firma#>

tx_validate_firmaの範囲が明示的に指定されていないため、後で誰かがこれを維持しようとする場合と同様に、部外者は頭を悩ませたままになります。

<cfset allErrMsgs[1][2] = texte.tx_validate_firma>

このような割り当てでは#を使用する必要がないことに注意してください。通常、ColdFusionタグ内では、引用符で囲まれていない限り、これらは必要ありません。このようなもの:

<cfset fullName = "#firstName# #middleInitial# #lastName#">
于 2012-04-29T19:23:16.677 に答える