Magento - 扩展 Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection 类

标签 magento

好的,这是我最近在这里问的另一个问题的导引。基本上,我想扩展 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 文件,并使用相同的调用,它工作正常。

最佳答案

(并不是想让你卡在另一个线程中,但是对于这个问题,没有一个快速的答案,既不会看起来像魔术,也不会进一步混淆人们。)

除非您要去 ,否则您不需要覆盖类。更改 现有方法的行为。你只需要创建一个新类 延长 现有的类。这是你如何做到的。

事物正常状态的术语

  • 模型是定义 Magento 中某些“事物”(产品等)行为的逻辑类/对象
  • 模型包含模型资源。模型资源是从某些数据存储(mysql 等)中实际获取数据的类。这是数据映射器模式。
  • 集合是具有类似数组属性的对象,用于查询数据库并返回一组模型。有点令人困惑,集合是 还有模型资源。

  • 所以,在正常情况下,你可能会说类似的话
    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') 添加一些方法。他们通过 扩展 基类来做到这一点。

    闭嘴,我只是想让这个工作

    所以,你真正想做的是
  • 创建新类(class) 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_collectionsamscatalog/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/

    相关文章:

    php - 如何在 PHP/Magento 中捕获这个低级别的 MySQL(?)错误

    php - Magento 将现有评论添加到订单电子邮件

    database - 如何安全地将阶段数据库部署到 magento 中的实时生产数据库

    php - 如何连接到http ://localhost/magento to complete Magento Community Edition ver1. 9.2.4 安装?

    image - Magento:将图像(或任何属性)添加到自定义模块

    php - Magento - 获取愿望 list 中项目的关联产品属性

    performance - magento 编译模式 vs apc

    Elasticsearch 错误响应 5019 : Illegal Argument

    javascript - 未捕获的类型错误 : undefined is not a function when using a jQuery plugin in Magento

    php - 带有自定义 productCollection 的 Magento 产品列表