好的,这是我最近在这里问的另一个问题的导引。基本上,我想扩展 Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection 类,所以我可以为产品系列添加一些额外的过滤器,这些过滤器可以在我的商店中重复使用(例如最畅销的)。这是为了替换我目前使用的以下代码,它位于我的 template.phtml 文件中:
$_bs_productCollection = Mage::getResourceModel('reports/product_collection')
->addAttributeToSelect('name')
->addAttributeToFilter('visibility', $visibility)
->addOrderedQty()
->setOrder('ordered_qty', 'desc')
->setPageSize(6);
$_bs_productCollection->load();
所以,我设置了我的模块,它正在加载(它显示在 admin/system/config/advanced 中)。文件夹结构如下:
etc/modules/Samsmodule.xml
local/Samsmodule
local/Samsmodule/Catalog
local/Samsmodule/Catalog/etc
local/Samsmodule/Catalog/etc/config.xml
local/Samsmodule/Catalog/Model
local/Samsmodule/Catalog/Model/Resource/Eav/Mysql4/Product/Collection.php
local/Samsmodule/Catalog/Helper (not sure if this is needed or not)
我的 Samsmodule.xml 是:
<config>
<modules>
<Samsmodule_Catalog>
<active>true</active>
<codePool>local</codePool>
</Samsmodule_Catalog>
</modules>
</config>
我的 config.xml 是:
<config>
<modules>
<Samsmodule_Catalog>
<version>0.1.0</version>
</Samsmodule_Catalog>
</modules>
<global>
<models>
<catalog_resource_eav_mysql4>
<rewrite>
<product_collection>Samsmodule_Catalog_Model_Resource_Eav_Mysql4_Product_Collection</product_collection>
</rewrite>
</catalog_resource_eav_mysql4>
</models>
</global>
</config>
还有我的 收藏.php 是:
<?php
class Samsmodule_Catalog_Model_Resource_Eav_Mysql4_Product_Collection extends Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection
{
public function filterbyBestSelling($attribute,$visibility,$_category,$no_of_items)
{
$this->addAttributeToSelect($attribute)->addOrderedQty()->setOrder('ordered_qty', 'desc')->addAttributeToFilter('visibility', $visibility)->addCategoryFilter($_category)->setPageSize($no_of_items);
return $this;
}
}
然后从我的 template.phtml 中我这样称呼它:
$_bs_productCollection = Mage::getResourceModel('reports/product_collection')
->filterbyBestSelling('name',$visibility,$_category,6);
但它不起作用 - 我错过了什么?如果我只是从我的 添加代码收藏.php 到我核心的底部 收藏.php 文件,并使用相同的调用,它工作正常。
最佳答案
(并不是想让你卡在另一个线程中,但是对于这个问题,没有一个快速的答案,既不会看起来像魔术,也不会进一步混淆人们。)
除非您要去 ,否则您不需要覆盖类。更改 现有方法的行为。你只需要创建一个新类 延长 现有的类。这是你如何做到的。
事物正常状态的术语
所以,在正常情况下,你可能会说类似的话
Mage::getModel('catalog/product')
获取产品模型和底层系统使用
Mage::getResourceModel('catalog/product');
获取查询单个产品的 Mode Resource 对象,以及 要么 使用以下的
Mage::getResourceModel('catalog/product_collection');
Mage::getModel('catalog/product')->getCollection();
获取查询多个模型的 Collection 对象。在当前版本的 Magento 中,每个模型对象都有一个名为“getCollection”的方法,该方法返回其相应的集合资源。
脱轨报告
报告有点偏颇,但一切仍然在与上述相同的宇宙中。原来没有这样的模型
Mage::getModel('reports/product');
但是有一个集合
Mage::getResourceModel('reports/product_collection')
如果您查看类(您将在下面对其进行扩展),您会看到“reports/product_collection”集合
class Mage_Reports_Model_Mysql4_Product_Collection extends Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection
扩展基础产品系列 类(class)。换句话说,在报告部分工作的客户端程序员与您所做的完全相同。 “我想向
Mage::getModelResource('catalog/product_collection')
添加一些方法。他们通过 扩展 基类来做到这一点。闭嘴,我只是想让这个工作
所以,你真正想做的是
Samsnamespace_Samscatalog_Model_Mysql4_Product_Collection
扩展底座 Mage_Reports_Model_Mysql4_Product_Collection
收藏类。 Mage::getModelResource('samscatalog/product_collection')
通过配置我们的模块以使用模型和模型资源,返回上述类的实例。 我们还将稍微改变您的模块结构,以帮助缓解命名困惑。我不太喜欢给模块文件夹赋予与核心模块相同的名称(即“目录”),并且顶级文件夹(在 local/之后)实际上是一个命名空间,而不是模块文件夹。 (一个命名空间可能包含许多模块)
我们没有覆盖类。我们正在您的命名空间下配置自定义模块以使用模型和模型资源。然后我们定义了一个模型资源,它扩展了系统中已有的 PHP 类。仅当您想要 时才应使用覆盖更改 特定方法调用的行为。 (对这件事喋喋不休的道歉,但社区中对此有足够的普遍混淆,值得一遍又一遍地重复。)
首先,我们将创建模块目录结构和文件。我们只需要两个
local/Samsnamespace/Samscatalog/etc/config.xml
local/Samsnamespace/Samscatalog/Model/Mysql4/Product/Collection.php
(不要忘记在 app/etc/modules 中启用模块。如果你不确定这意味着什么, start reading )
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));
并且您的集合将被返回,您可以添加方法到您的心内容中。
这是怎么回事
这是思维弯曲,所以如果你愿意,你可以停止阅读。这也是我对概念的重述 covered elsewhere .
当你说
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');
关于Magento - 扩展 Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3877263/