(并不是故意让你挂在另一条线索上,但这个问题没有一个快速的答案,既不会看起来像魔法,也不会让人进一步困惑。)
你不需要重写一个类,除非你打算change现有方法的行为。你只需要创建一个新类extend现有的类。下面是你如何做到这一点。
正常状态的术语
模型是定义 Magento 中某些“事物”(产品等)行为的逻辑类/对象
模型包含模型资源。模型资源是从某些数据存储(mysql 等)实际获取数据的类。这就是数据映射器模式。
集合是具有类似数组属性的对象,它们查询数据库并返回一组模型。有点令人困惑的是,集合是also模型资源。
所以,在正常情况下,你可能会说这样的话
Mage::getModel('catalog/product')
获取产品模型和底层系统使用
Mage::getResourceModel('catalog/product');
获取查询单个产品的模式资源对象,以及either使用以下内容
Mage::getResourceModel('catalog/product_collection');
Mage::getModel('catalog/product')->getCollection();
获取查询多个模型的 Collection 对象。在当前版本的 Magento 中,每个模型对象都有一个名为“getCollection”的方法,该方法返回其相应的集合资源。
报告偏离轨道
报告有点偏离,但一切仍然在同一个宇宙中,如上所述。事实证明,不存在这样的模型
Mage::getModel('reports/product');
But有一个集合
Mage::getResourceModel('reports/product_collection')
如果您查看该类(您将在下面对其进行扩展),您将看到“reports/product_collection”集合
class Mage_Reports_Model_Mysql4_Product_Collection extends Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection
扩展了基础产品系列班级。换句话说,负责报告部分的客户端程序员所做的与您完全相同。 “我想添加一些方法Mage::getModelResource('catalog/product_collection')
。他们这样做是通过延伸基类。
闭嘴,我只是想让这个工作
所以,你真正想做的是
创建一个新类Samsnamespace_Samscatalog_Model_Mysql4_Product_Collection
延伸基地Mage_Reports_Model_Mysql4_Product_Collection
集合类。
确保呼叫Mage::getModelResource('samscatalog/product_collection')
通过将模块配置为使用模型和模型资源来返回上述类的实例。
我们还将稍微更改您的模块结构,以帮助缓解命名混乱。我不太喜欢为模块文件夹提供与核心模块相同的名称(即“目录”),并且顶级文件夹(在 local/ 之后)实际上是一个命名空间,而不是模块文件夹。 (一个命名空间可能包含很多模块)
我们不会凌驾于类之上。我们正在您的命名空间下配置一个自定义模块以使用模型和模型资源。然后,我们定义一个模型资源来扩展系统中已有的 PHP 类。仅当您想要时才应使用覆盖change特定方法调用的行为。 (很抱歉喋喋不休,但社区中对此有足够多的普遍困惑,值得一遍又一遍地喋喋不休。)
首先,我们将创建模块目录结构和文件。我们只需要两个
local/Samsnamespace/Samscatalog/etc/config.xml
local/Samsnamespace/Samscatalog/Model/Mysql4/Product/Collection.php
(并且不要忘记在 app/etc/modules 中启用该模块。如果您不确定这意味着什么,开始阅读)
The Collection.php
文件应包含
<?php
class Samsnamespace_Samscatalog_Model_Mysql4_Product_Collection extends Mage_Reports_Model_Mysql4_Product_Collection
{
/* your custom methods go here*/
}
配置文件应该包含
<config>
<modules>
<Samsnamespace_Samscatalog>
<version>0.1.0</version>
</Samsnamespace_Samscatalog>
</modules>
<global>
<models>
<samscatalog>
<class>Samsnamespace_Samscatalog_Model</class>
<resourceModel>samscatalog_mysql4</resourceModel>
</samscatalog>
<samscatalog_mysql4>
<class>Samsnamespace_Samscatalog_Model_Mysql4</class>
</samscatalog_mysql4>
</models>
</global>
</config>
这些文件就位并启用模块后,您应该能够调用
$test = Mage::getResourceModel('samscatalog/product_collection');
var_dump(get_class($test));
并且您的收藏将被归还,您可以随心所欲地添加方法。
这是怎么回事
这是令人费解的,所以如果你愿意,你可以停止阅读。这也是我之前概念的重述其他地方涵盖.
当你说
Mage::getResourceModel('samscatalog/product_collection');
底层法师系统代码说“好吧,所以这个资源模型”
samscatalog/product_collection
是的一部分
samscatalog/product
模型(在本例中并不完全正确,但这是系统的想法)。
所以,由于资源模型samscatalog/product_collection
是的一部分samscatalog/product
模型,让我们看看配置
global/models/samscatalog/resourceModel
获取资源模型 URI
samscatalog_mysql4
然后让我们用它来查看配置
global/models/samscatalog_mysql4/class
获取属于该模块的所有资源模型的基类名。这最终是
Samsnamespace_Samscatalog_Model_Mysql4
这意味着samscatalog/product_collection
资源模型命名
Samsnamespace_Samscatalog_Model_Mysql4_Product_Collection
然后它只是 Magento 的标准自动加载,它会执行
include('Samsnamespace/Samscatalog/Model/Mysql4/Product/Collection.php');