1

製品のCRUDを処理する単純なCFCクラス(Product.cfc)があります。

アプリケーションに基づいて追加のプロパティを許可するようにクラスを拡張しています。たとえば、CartProduct.cfcは、Quantityプロパティを含めることができるようにProduct.cfcを拡張しています。

Base Product.cfcクラスでは、最初にIDを渡し、read()メソッドでそのIDを使用して、データベースからデータを取得します。

<cffunction name="read" returntype="Query">
    <cfquery name="qData" datasource="mydb">
        SELECT    description
        FROM      mySKUTable
        WHERE     id = '#VARIABLES.Sku#'
    </cfquery>

    <cfreturn qData />
</cffunction>

<cffunction name="setSku" returntype="Product">
    <cfargument name="Sku" type="String" required="true" />
    <cfscript>
        var qData = QueryNew("");

        VARIABLES.Sku = ARGUMENTS.Sku;

        qData = read();

        VARIABLES.description = qData.description;
    </cfscript>
</cffunction>

CartProduct.cfcでこれを拡張して、read()メソッドを使用して別のテーブルからQuantityを取得および設定したいと思います。

<cffunction name="read" returntype="Query">
    <cfquery name="qData" datasource="mydb">
        SELECT    quantity
        FROM      myCartTable
        WHERE     id = '#VARIABLES.Sku#'
    </cfquery>

    <cfreturn qData />
</cffunction>

<cffunction name="setSku" returntype="Product">
    <cfargument name="Sku" type="String" required="true" />
    <cfscript>
        var qData = QueryNew("");

        THIS = SUPER.setSku(Sku);

        qData = read();

        VARIABLES.quantity = qData.quantity;
    </cfscript>
</cffunction>

これを行うと、拡張read()のみが呼び出されます。これは問題ありません、これは設計どおりです。ただし、両方のread()メソッドを呼び出す方法を探しているので、最初に基本クラスでプロパティを設定し、次に拡張クラスでプロパティを設定できます。

これについて何か考えはありますか?

ps CFQUERYPARAMを使用していない、または入力を検証していないことなどを知っています。これを単純にするために、そのがらくたを残しました。そのため、今はそれらの提案をしないでください。

4

2 に答える 2

1

わかりました、これが私が思いついたものです:

read()メソッドからQueryを返す代わりに、Query行をStructに変換して、Structを返します。そうすれば、read()内からSUPER.read()を呼び出してから、キーと値を親Structからすべてのレベルの新しいStructにコピーできます。それはもう少しコードですが、それは仕事を成し遂げます。

<cffunction name="read" returntype="Struct" output="false">
    <cfscript>
        var _qData = QueryNew("");
        var _properties = SUPER.read();
    </cfscript>

    <cfquery>
    ...
    </cfquery>

    <cfscript>
        StructAppend(
            _properties,
            REQUEST.UDFLib.Query.queryRowToStruct(_qData)
            );

        return _properties;
    </cfscript>
</cffunction>
于 2012-07-27T21:03:41.617 に答える
0

「スーパー」スコープを使用して、拡張コンポーネントを参照できます。したがって、CartProduct.cfc内からProduct.cfcの「read」メソッドを呼び出すには、Super.read()を呼び出します。

于 2012-07-28T18:53:47.990 に答える