代码之家  ›  专栏  ›  技术社区  ›  Marlon Creative

Magento-扩展Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection类

  •  11
  • Marlon Creative  · 技术社区  · 15 年前

    好吧,这是从我最近问的另一个问题开始的。基本上,我想延长 Mage_Catalog_Model_Resource_Eav_Mysql4_Product_系列 类,因此我可以为产品集合添加一些额外的筛选器,这些产品集合可以在我的商店中重复使用(例如畅销)。这意味着要替换下面的代码,我目前使用的是模板.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>
    

    我的 配置.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;
    }
    }
    

    然后从我的模板.phtml我这样称呼它:

    $_bs_productCollection = Mage::getResourceModel('reports/product_collection')
    ->filterbyBestSelling('name',$visibility,$_category,6);
    

    但它不起作用-我错过了什么?如果我把我的代码 集合.php 在我的心底 集合.php 文件,并使用相同的调用,它工作正常。

    2 回复  |  直到 15 年前
        1
  •  21
  •   Alana Storm    15 年前

    (不是故意让你悬在另一根线上,但这个问题没有一个快速的答案,要么看起来像魔法,要么只是让人更迷惑。)

    你不需要重写类,除非你打算 改变 现有方法的行为。你只需要创建一个新类 延伸 现有类。你就是这样做的。

    事物正常状态的术语

    1. 模型是定义Magento中某些“事物”(产品等)行为的逻辑类/对象

    2. 模型包含模型资源。模型资源是从某些数据存储(mysql等)中实际获取数据的类。这是数据映射器模式。

    3. 集合是具有类似数组的属性的对象,这些属性查询数据库并返回一组模型。有些令人困惑的是,收藏品 模型资源。

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

    Mage::getModel('catalog/product')
    

    获取产品模型和底层系统使用

    Mage::getResourceModel('catalog/product');
    

    获取查询单个产品的模式资源对象,以及 任何一个 使用的是

    Mage::getResourceModel('catalog/product_collection');
    Mage::getModel('catalog/product')->getCollection();
    

    获取查询多个模型的集合对象。在当前版本的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
    

    扩展基本产品集合 上课。换言之,处理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') 通过将模块配置为使用模型和模型资源,返回上述类的实例。

    我们还将对您的模块结构进行一些更改,以帮助您缓解命名混乱。我不太喜欢将模块文件夹命名为与核心模块相同的名称(即“Catalog”),而顶层文件夹(在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');
    

    底层的mage系统代码说“好,那么这个资源模型”

    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/产品集 资源模型已命名

    Samsnamespace_Samscatalog_Model_Mysql4_Product_Collection
    

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

    include('Samsnamespace/Samscatalog/Model/Mysql4/Product/Collection.php');
    
        2
  •  0
  •   Joe Mastey    15 年前

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

    这部分看起来很可疑,如果它真的有用我很惊讶:

    <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是一个模块,而Catalog_resource_eav_mysql4不是 Mage_Catalog_Model_ 在类名中。

    希望能有帮助!

    谢谢, 乔

    推荐文章