好的,这是我最近问到的另一个问题。基本上,我想扩展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>我的Collection.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);但这不管用-我错过了什么?如果我只是将代码从我的Collection.php添加到我的核心Collection.php文件的底部,并使用相同的调用,它就可以正常工作。
发布于 2010-10-07 01:14:12
(并不是想让你在另一条线上绞尽脑汁,但这个问题没有一个快速的答案,它既不会看起来像魔法,也不会让人更加困惑。)
您不需要重写类,除非要更改现有方法的行为。您只需创建一个新类,就可以扩展现有类的。你就是这么做的。
事物正常状态术语
所以,在正常情况下,你可能会说
Mage::getModel('catalog/product')以获得产品模型,并且底层系统使用
Mage::getResourceModel('catalog/product');要获取查询单个产品的模式资源对象,可以使用以下任意一个
Mage::getResourceModel('catalog/product_collection');
Mage::getModel('catalog/product')->getCollection();若要获取查询许多模型的Collection对象,请执行以下操作。在当前版本的Magento中,每个Model对象都有一个名为"getCollection“的方法,该方法返回其相应的集合资源。
报告脱轨
报告有点偏侧,但一切仍在上述相同的宇宙中。结果发现没有这样的模型
Mage::getModel('reports/product');但是有一个集合
Mage::getResourceModel('reports/product_collection')如果您查看这个类(您将在下面进行扩展),您将看到‘reports/’集合
class Mage_Reports_Model_Mysql4_Product_Collection extends Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection扩展了基本产品集合类。换句话说,处理reports部分的客户端程序员与您的情况完全相同。“我想向Mage::getModelResource('catalog/product_collection')中添加一些方法,它们是通过扩展基类来实现的。
闭嘴,我只想让这件事起作用
所以,你真正想做的是
Samsnamespace_Samscatalog_Model_Mysql4_Product_Collection,它扩展了基本的Mage_Reports_Model_Mysql4_Product_Collection集合类。Mage::getModelResource('samscatalog/product_collection')的调用返回上述类的实例,由configurig我们的模块使用模型和模型参考资料。我们还将对模块结构进行一些修改,以帮助您减少命名混淆。我不太喜欢给模块文件夹取与核心模块相同的名称。( "Catalog"),而顶层文件夹(在本地/之后)实际上是名称空间,而不是模块文件夹。(命名空间可能包含许多模块)
我们不会凌驾全班的。我们正在您的命名空间下配置一个自定义模块,以便同时使用模型和模型资源。然后,我们定义了一个模型资源,它扩展了系统中已有的PHP类。仅当您希望更改特定方法调用的行为时,才应使用重写。(对此表示赞同,但公报中有足够的混乱之处,值得反复讨论。然后结束。然后结束。)
首先,我们将创建模块目录结构和文件。我们只需要两个
local/Samsnamespace/Samscatalog/etc/config.xml
local/Samsnamespace/Samscatalog/Model/Mysql4/Product/Collection.php(别忘了在app/etc/模块中启用模块。如果你不知道这意味着什么,开始阅读)
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');底层的mage系统代码是"ok,所以这个资源模型“
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');发布于 2010-10-07 00:07:02
结果产品集合的类别是什么?你的超驰有效吗?
这部分看起来很可疑,我很惊讶它是否真的起作用了:
<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>试一试:
<global>
<models>
<catalog>
<rewrite>
<resource_eav_mysql4_product_collection>Samsmodule_Catalog_Model_Resource_Eav_Mysql4_Product_Collection</resource_eav_mysql4_product_collection>
</rewrite>
</catalog>
</models>
</global>里面的标签是指一个模块。目录是一个模块,而catalog_resource_eav_mysql4不是。目录中的标记指定了一个类句柄,它基本上是类名中Mage_Catalog_Model_之后的所有内容。
希望这能帮上忙!
谢谢你,乔
https://stackoverflow.com/questions/3877263
复制相似问题