我有一个简单的CFC类来处理Product-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()。这很好,这是设计的。但是,我正在寻找一种方法来调用 BOTH read()方法,所以我可以先在基类中设置属性,然后在扩展类中设置Properties。
对此有何想法?
P.S。我知道我没有使用CFQUERYPARAM或验证我的输入等。为了保持这个简单,我留下了废话,所以请不要立即给我这些建议。
答案 0 :(得分: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>
答案 1 :(得分:0)
您可以使用“超级”范围来引用扩展组件。因此,要从CartProduct.cfc中调用Product.cfc的“read”方法,请调用Super.read()。