Magento - 扩展 Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection 类

2023-11-26

好的,这是我最近在这里问的另一个问题的引申。基本上,我想延长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)

My Samsmodule.xml is:

<config>
<modules>
    <Samsmodule_Catalog>
        <active>true</active>
        <codePool>local</codePool>
    </Samsmodule_Catalog>
</modules>
</config>

My 配置文件 is:

<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>

And my 集合.php is:

<?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文件,并使用相同的调用,它工作正常。


(并不是故意让你挂在另一条线索上,但这个问题没有一个快速的答案,既不会看起来像魔法,也不会让人进一步困惑。)

你不需要重写一个类,除非你打算change现有方法的行为。你只需要创建一个新类extend现有的类。下面是你如何做到这一点。

正常状态的术语

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

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

  3. 集合是具有类似数组属性的对象,它们查询数据库并返回一组模型。有点令人困惑的是,集合是also模型资源。

所以,在正常情况下,你可能会说这样的话

Mage::getModel('catalog/product')

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

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

获取查询单个产品的模式资源对象,以及either使用以下内容

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

获取查询多个模型的 Collection 对象。在当前版本的 Magento 中,每个模型对象都有一个名为“getCollection”的方法,该方法返回其相应的集合资源。

报告偏离轨道

报告有点偏离,但一切仍然在同一个宇宙中,如上所述。事实证明,不存在这样的模型

Mage::getModel('reports/product');

But有一个集合

Mage::getResourceModel('reports/product_collection')

如果您查看该类(您将在下面对其进行扩展),您将看到“reports/product_collection”集合

class Mage_Reports_Model_Mysql4_Product_Collection extends Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection

扩展了基础产品系列班级。换句话说,负责报告部分的客户端程序员所做的与您完全相同。 “我想添加一些方法Mage::getModelResource('catalog/product_collection')。他们这样做是通过延伸基类。

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

所以,你真正想做的是

  1. 创建一个新类Samsnamespace_Samscatalog_Model_Mysql4_Product_Collection延伸基地Mage_Reports_Model_Mysql4_Product_Collection集合类。

  2. 确保呼叫Mage::getModelResource('samscatalog/product_collection')通过将模块配置为使用模型和模型资源来返回上述类的实例。

我们还将稍微更改您的模块结构,以帮助缓解命名混乱。我不太喜欢为模块文件夹提供与核心模块相同的名称(即“目录”),并且顶级文件夹(在 local/ 之后)实际上是一个命名空间,而不是模块文件夹。 (一个命名空间可能包含很多模块)

我们不会凌驾于类之上。我们正在您的命名空间下配置一个自定义模块以使用模型和模型资源。然后,我们定义一个模型资源来扩展系统中已有的 PHP 类。仅当您想要时才应使用覆盖change特定方法调用的行为。 (很抱歉喋喋不休,但社区中对此有足够多的普遍困惑,值得一遍又一遍地喋喋不休。)

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

local/Samsnamespace/Samscatalog/etc/config.xml
local/Samsnamespace/Samscatalog/Model/Mysql4/Product/Collection.php

(并且不要忘记在 app/etc/modules 中启用该模块。如果您不确定这意味着什么,开始阅读)

The 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');

底层法师系统代码说“好吧,所以这个资源模型”

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');
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Magento - 扩展 Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection 类 的相关文章

  • 如何在magento中添加自定义模块

    您好 我想为页脚创建一个自定义模块 用于显示新闻标题 还没有使用自定义模块 我该怎么做 谁能告诉我创建自定义模块的简单步骤 Thanks 您会发现的最佳资源是 模块创建器扩展 http www magentocommerce com ext
  • Magento 1.7.0.0 上的 SOAP V2 url 是什么

    1 7 0 0 版本中访问 Magento SOAP V2 的 url 是否已更改 当我尝试访问 上的服务 时http www somedomain com api v2 soap wsdl 1 http www somedomain co
  • 如何更改客户 ID 和订单 ID?

    当前 CustomerID 从 1 开始 而生成的第一个订单已OrderID 100000001 有什么方法可以改变这些字段 所以创建的第一个客户已经 顾客号码900000001并且创建的第一个订单有OrderID 900000001 通过
  • Magento Connect 登录后尝试更改为什么路径?

    我每次都会收到错误消息 部署 FTP 错误 登录后无法 chdir 我通过 chmod ing 我的 complete path to magento installation dir 成功完成了第一次连接和设置下载器 至 0777 在 d
  • 如何在magento中将订单状态设置为“完成”

    如何手动将订单状态设置为 完成 我正在使用以下代码 但它给出错误消息 订单状态 完成 不得手动设置 order Mage getModel sales order gt loadByIncrementId order id order gt
  • Magento:两种基于重量的统一运费

    尝试按如下方式设置我的运费 如果购物车总重量低于 1 公斤 则运费为 3 68 英镑 如果购物车总重量超过 1 公斤 则运费为 6 68 英镑 如果购物车总价超过 100 英镑 则免运费 我设法使用 6 68 英镑的统一费率将所有这些结合在
  • 将搜索栏从 magento 主页的标题中移动

    我是 magento 的新手 我想将搜索栏从标题移动到主页的中间位置 以便它仅显示在主页上 我在 magento 论坛上阅读了许多相关答案 但所有人都在尝试编辑 box css 中的 mini search 元素 但不幸的是我在此文件中没有
  • 一旦我们点击取消按钮,文本字段就会隐藏

    我们正在使用 magento 多供应商网站 我们正在使用以下代码来更新和取消价格 但是一旦我们单击 取消 按钮 文本字段就会隐藏 PHTML span class label pro status span
  • Magento,翻译验证错误消息

    我已经成功创建了原型验证的新规则 现在我需要翻译错误消息 位置 Javascript 中的字符串 但是 我只能翻译所有消息 我的新自定义消息似乎无法翻译 我该如何改变这个 也许你需要一个jstranslator xml里面的文件etc fo
  • Magento 如何通过静态块/页面中的 id 链接到类别

    我正在寻找使用以下方法从静态块链接到一个类别category id 有什么想法吗 我已经进行了通常的搜索 但没有结果 目前我可以做类似的事情 a href 但这并不稳健 使用类别链接小部件内联链接代码 widget type catalog
  • isSaleable() 和 isAvailable() 有什么区别?

    我正在我的 Magento 主题的 单个 产品页面上显示库存可用性 但有些事情我并不完全理解 我看到模板中使用了两种方法来检查产品是否可供销售 Mage Catalog Model Product isAvailable Mage Cata
  • 在 Magento 控制器中使用 move_uploaded_file

    我是 magento 的新手 我正在 magento 管理中创建用于文件上传的自定义模块 现在我已将上传文件发布到我的模块控制器中 这里我用过move uploaded file将文件上传到与控制器文件夹相同的目录中 下面的代码我用于控制器
  • Magento:我可以在哪个文件夹中看到我安装的扩展?

    我在 magento 1 5 中安装了一个扩展 只是想知道它在我的服务器上的位置 因为我想向它写入一个包含文件 谢谢 通常在 MagentoFolder app code community SomeCompanyName SomePack
  • 如何轻松调试布局 Xml 警告/错误?

    我陷入了这个错误 Warning simplexml load string Entity line 46 parser error Comment not terminated in lib Varien Simplexml Config
  • 在 Magento 中获取购物车详细信息

    我想通过使用 Magento 获取购物车详细信息getQuote功能 我怎样才能做到这一点 cart Mage getModel checkout cart gt getQuote 当我打印 cart页面停止执行并显示空白页面 但是当我写的
  • Magento - 将特定父类别的子类别列为链接

    我是 php 的初学者 并且一直试图将一个父类别的子类别作为链接调用 我得到了这个 它调出了 getName 但 getUrl 根本没有返回任何 URL 输出代码只是 li a href name of sub a li
  • Magento:如何覆盖本地模块中的模型

    我试图在本地文件夹中覆盖本地文件夹中的模块 但我不知道是否可能 这就是我所做的 我创建了 local Mycompany Modulename Model Model php 我想覆盖 local Othercompany Modulena
  • 如何从 Magento One Page Checkout 获取发布数据?

    为了在 Magento Checkout 中添加客户评论字段 我在相应的模板文件中添加了一个文本字段 并使用如下观察器将评论添加到订单中 comment strip tags Mage app gt getRequest gt getPar
  • Paypal Express Checkout 坚持使用电话号码,即使选项已关闭(从 Magento 拨打)

    我在 Magento 中使用 Paypal 快速结帐 选项 我没有使用任何快速结帐按钮 这只是因为我在从网站付款标准返回时遇到问题 在 Paypal 的网站付款首选项中 我已将 联系电话号码 字段设置为关闭 我还在 Magento 方面进行
  • PHP Web 应用程序 (Magento) 遭到黑客攻击;这段黑客代码有什么作用?

    我刚刚安装的 Magento 1 3 2 4 被黑了 你能告诉我这段代码的目的是什么吗 另外 如何阻止这种情况以及如何发现漏洞 谢谢 function net match network ip ip arr explode network

随机推荐