1

我有一个简单的 CFC 类来处理产品 - Product.cfc 上的 CRUD。

我正在扩展该类以允许基于应用程序的其他属性 - 例如 CartProduct.cfc 扩展 Product.cfc 以允许包含 Quantity 属性。

在 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() 方法从不同的表中检索和设置数量:

<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 的“读取”方法,请调用 Super.read()。

于 2012-07-28T18:53:47.990 回答