首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Magento -扩展Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection类

问Magento -扩展Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection类
EN

Stack Overflow用户
提问于 2010-10-06 22:06:43
回答 2查看 4.8K关注 0票数 11

好的,这是我最近问到的另一个问题。基本上,我想扩展Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection类,所以我可以为产品集合添加一些额外的过滤器,这些过滤器可以在我的商店内重复使用(比如畅销书)。这是为了替换我目前使用的以下代码,该代码位于我的template.phtml文件中:

代码语言:javascript
复制
$_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中)。文件夹结构如下:

代码语言:javascript
复制
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是:

代码语言:javascript
复制
<config>
<modules>
    <Samsmodule_Catalog>
        <active>true</active>
        <codePool>local</codePool>
    </Samsmodule_Catalog>
</modules>
</config>

我的config.xml是:

代码语言:javascript
复制
<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是:

代码语言:javascript
复制
<?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中,我这样称呼它:

代码语言:javascript
复制
$_bs_productCollection = Mage::getResourceModel('reports/product_collection')
->filterbyBestSelling('name',$visibility,$_category,6);

但这不管用-我错过了什么?如果我只是将代码从我的Collection.php添加到我的核心Collection.php文件的底部,并使用相同的调用,它就可以正常工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-07 01:14:12

(并不是想让你在另一条线上绞尽脑汁,但这个问题没有一个快速的答案,它既不会看起来像魔法,也不会让人更加困惑。)

您不需要重写类,除非要更改现有方法的行为。您只需创建一个新类,就可以扩展现有类的。你就是这么做的。

事物正常状态术语

  1. 模型是定义某种“事物”(产品等)行为的逻辑类/对象。在马根托
  2. 模型包含模型资源。是从某些数据存储(mysql等)中实际获取数据的类。这是Data模式。
  3. 集合是具有类似于属性的数组的对象,它们查询数据库并返回一组模型。有些令人困惑的是,集合也是,也是模型参考资料。

所以,在正常情况下,你可能会说

代码语言:javascript
复制
Mage::getModel('catalog/product')

以获得产品模型,并且底层系统使用

代码语言:javascript
复制
Mage::getResourceModel('catalog/product');

要获取查询单个产品的模式资源对象,可以使用以下任意一个

代码语言:javascript
复制
Mage::getResourceModel('catalog/product_collection');
Mage::getModel('catalog/product')->getCollection();

若要获取查询许多模型的Collection对象,请执行以下操作。在当前版本的Magento中,每个Model对象都有一个名为"getCollection“的方法,该方法返回其相应的集合资源。

报告脱轨

报告有点偏侧,但一切仍在上述相同的宇宙中。结果发现没有这样的模型

代码语言:javascript
复制
Mage::getModel('reports/product');

但是有一个集合

代码语言:javascript
复制
Mage::getResourceModel('reports/product_collection')

如果您查看这个类(您将在下面进行扩展),您将看到‘reports/’集合

代码语言:javascript
复制
class Mage_Reports_Model_Mysql4_Product_Collection extends Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection

扩展了基本产品集合类。换句话说,处理reports部分的客户端程序员与您的情况完全相同。“我想向Mage::getModelResource('catalog/product_collection')中添加一些方法,它们是通过扩展基类来实现的。

闭嘴,我只想让这件事起作用

所以,你真正想做的是

  1. 创建一个新的类Samsnamespace_Samscatalog_Model_Mysql4_Product_Collection,它扩展了基本的Mage_Reports_Model_Mysql4_Product_Collection集合类。
  2. 确保对Mage::getModelResource('samscatalog/product_collection')的调用返回上述类的实例,由configurig我们的模块使用模型和模型参考资料。

我们还将对模块结构进行一些修改,以帮助您减少命名混淆。我不太喜欢给模块文件夹取与核心模块相同的名称。( "Catalog"),而顶层文件夹(在本地/之后)实际上是名称空间,而不是模块文件夹。(命名空间可能包含许多模块)

我们不会凌驾全班的。我们正在您的命名空间下配置一个自定义模块,以便同时使用模型和模型资源。然后,我们定义了一个模型资源,它扩展了系统中已有的PHP类。仅当您希望更改特定方法调用的行为时,才应使用重写。(对此表示赞同,但公报中有足够的混乱之处,值得反复讨论。然后结束。然后结束。)

首先,我们将创建模块目录结构和文件。我们只需要两个

代码语言:javascript
复制
local/Samsnamespace/Samscatalog/etc/config.xml
local/Samsnamespace/Samscatalog/Model/Mysql4/Product/Collection.php

(别忘了在app/etc/模块中启用模块。如果你不知道这意味着什么,开始阅读)

Collection.php文件应该包含

代码语言:javascript
复制
<?php
class Samsnamespace_Samscatalog_Model_Mysql4_Product_Collection extends Mage_Reports_Model_Mysql4_Product_Collection    
{
    /* your custom methods go here*/
}

而配置文件应该包含

代码语言:javascript
复制
<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>

有了这些文件并启用了模块,您应该能够调用

代码语言:javascript
复制
$test = Mage::getResourceModel('samscatalog/product_collection');           
var_dump(get_class($test));

您的集合将被退回,您可以添加方法到您的心的内容。

发生什么事了

这是精神弯曲,所以你可以停止阅读,如果你想。这也是我有覆盖在其他地方的概念的重述。

当你说

代码语言:javascript
复制
Mage::getResourceModel('samscatalog/product_collection');

底层的mage系统代码是"ok,所以这个资源模型“

代码语言:javascript
复制
samscatalog/product_collection

是

代码语言:javascript
复制
samscatalog/product

模型(在这种情况下不是完全正确,但这是系统的想法)。

因此,既然资源模型samscatalog/product_collection是samscatalog/product模型的一部分,那么让我们看一下

代码语言:javascript
复制
global/models/samscatalog/resourceModel

的资源模型URI。

代码语言:javascript
复制
samscatalog_mysql4

然后,让我们使用它来查看配置

代码语言:javascript
复制
global/models/samscatalog_mysql4/class

获得属于本模块一部分的所有资源模型的基本类名。这最后是

代码语言:javascript
复制
Samsnamespace_Samscatalog_Model_Mysql4

这意味着samscatalog/product_collection资源模型被命名为

代码语言:javascript
复制
Samsnamespace_Samscatalog_Model_Mysql4_Product_Collection

然后就是Magento的标准自动加载

代码语言:javascript
复制
include('Samsnamespace/Samscatalog/Model/Mysql4/Product/Collection.php');
票数 21
EN

Stack Overflow用户

发布于 2010-10-07 00:07:02

结果产品集合的类别是什么?你的超驰有效吗?

这部分看起来很可疑,我很惊讶它是否真的起作用了:

代码语言:javascript
复制
<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>

试一试:

代码语言:javascript
复制
<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_之后的所有内容。

希望这能帮上忙!

谢谢你,乔

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3877263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档