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 类 的相关文章

  • IE 抛出 JavaScript TypeError 但在 chrome 上不抛出

    描述在我们的 Magento 购物车上 当用户单击添加到购物篮在任何 Internet Explorer 浏览器的 产品详细信息 页面上单击按钮 浏览器中都会弹出一个包含以下错误消息的窗口 异常 类型错误 无法获取未定义或空引用的属性 ta
  • 为什么在网关取消的订单状态没有转换为“ payment_pending ”?

    我正在使用 Magento 社区 ver1 6 1 0 我在 Magento wiki 上找到了这个状态图http www magentocommerce com wiki 2 magento concepts and architectu
  • Magento 如何通过静态块/页面中的 id 链接到类别

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

    我在最新版本的 magento 中发现了一个奇怪的错误 高级搜索工具无法正常工作 我做了什么 安装 magento 的新副本 在管理页面添加了一个名为 测试 1 的产品 重新索引全部 清除所有缓存 At the frontend page
  • 如何在 magento 的左侧栏中显示最新、评价最高和最好的产品

    我正在使用 Magento 版本 1 5 0 1 在主页中 我使用了 2 列和左栏 我想逐一展示最新的 评价最高的和最好的产品 请帮助我如何做到这一点 我是magento新手请帮助我 在您的 app design frontend your
  • Magento:如何覆盖本地模块中的模型

    我试图在本地文件夹中覆盖本地文件夹中的模块 但我不知道是否可能 这就是我所做的 我创建了 local Mycompany Modulename Model Model php 我想覆盖 local Othercompany Modulena
  • Magento 从 Observer 重定向始终有效

    我无法从观察者在 Magento 中创建工作重定向 据我所知 有很多事件都获得了响应对象 在 observer目的 另一种方法是使用类似的东西 Mage app gt getResponse gt setRedirect Mage getU
  • 如何在购物车中显示自定义属性(Magento)

    我尝试了很多东西 但没有一个起作用 我想我可以在产品页面上获取自定义属性 但我想知道 如何在购物车页面中获取它们 属性只是简单的文字 item gt getProduct gt load 将从数据库重新加载所有产品数据 虽然这可行 但请记住
  • 使用按钮添加自定义折扣订单总计

    我的模块带有自定义折扣 没问题 配置 xml
  • Magento:获取给定产品的购物车数量

    我使用这个代码 items Mage getModel checkout cart gt getQuote gt getAllItems items Mage getSingleton checkout session gt getQuot
  • 如何自定义 Magento 主题并保留其源代码

    运行 Magento 1 7 0 2 最新 我下载了一个免费主题并安装了它 没问题 我希望开始对其进行细微的编辑 但我不想触及源代码 我想在一个目录中进行编辑 在该目录中它们将渲染并覆盖基本自定义主题 但如果我要在发布新版本时升级免费主题
  • 多个商店和多个具有不同角色的管理员

    我毫不怀疑magento可以处理多个商店 但我想知道每个商店是否可以处理这样的特定用户 其中他们可以像管理员一样访问他们的目录 销售 库存等 但仅限于他们的特定商店 这是我的示例表示 Magento website gt Store Cat
  • 下订单时如何在 Magento 中触发电子邮件?

    我需要以下问题的解决方案 1 客户下订单 2 店主收到没有价格信息的电子邮件 例如装箱单 我需要编辑哪些文件 我读过很多帖子 但他们似乎没有提到文件路径 Thx 实现这一目标的两种可能方法 您可以为该类创建模型重写Mage Sales Mo
  • Magento 信用卡号与信用卡类型不匹配异常

    我正在使用 magento api 并且在创建订单时遇到了一些问题 我已经能够完成创建订单的所有工作 使其能够正常工作 我看到的问题是 当我调用创建订单的方法时 我总是遇到异常 Credit card number mismatch wit
  • 从 Magento 产品视图中的可配置产品中获取所有简单产品

    如何获取与可配置产品关联的所有简单产品 我找到了如何做相反的事情 从简单的产品获得可配置的产品 但这不是我需要的 我想显示所选产品的库存数量 可配置属性 我最初的想法是打印所有数量的库存并用 jQuery 控制显示 任何想法 使用下面的代码
  • 如何在 Magento 中缓存集合?

    我有一个需要大量时间才能加载的集合 我想要的是缓存它 APC Memcache 无法缓存整个对象 因为它无法反序列化并且超过 1 MB 我认为缓存集合数据 col gt getData 是可行的方法 但我找不到基于此数组重建对象的方法 有什
  • Magento SOAP V2 API - 附加属性设置为空

    几个小时以来 我一直在尝试通过 SOAP V2 API 创建具有附加属性的产品 每当我打电话时就会添加该产品目录产品创建但我随请求发送的附加属性被设置为空 每当我不添加附加属性时 这两个属性都会设置为其默认值 因此我认为这些属性正在发送和接
  • magento 控制器的动态路由器名称

    我将如何创建一个具有动态操作名称的控制器的自定义模块 从某种意义上说 它可以由用户在管理区域中随意配置并在自定义模块中自动更新 您可以在控制器中重写此方法 public function getActionMethodName action
  • Magento - 购物车和结账(订单审核)屏幕有不同的字段和标签集

    在 Magento 默认主题中cart页面中 我们会在屏幕右侧中间看到以下总计框 我的问题是显示购物车中显示的 税 和 含税总计 字段 因为一旦我们知道送货地址 就会计算税 所以 我们只想在结帐屏幕 under 订单审核 但是 当覆盖上面提
  • 如何使用模块在magento admin中创建子菜单

    我正在开发 magento 模块 我想在管理部分添加菜单 like 管理 gt 目录 gt 属性 gt 管理属性 gt 这里是我的菜单 Magento 版本 1 5 1 0 我怎样才能做到这一点 在你的模块中adminhtml xml输入以

随机推荐