了解Magento中的覆盖:模型

在本系列中,我们正在探索Magento电子商务系统中可用的主要功能。 在上一篇文章中,我们讨论了如何使用自定义模块覆盖核心块文件。 今天,我将对其进行扩展,并演示如何使用基于XML的配置文件覆盖核心模型文件。

为什么要覆盖模型?

在Magento中,模型起着重要作用,因为它们实现了大多数核心功能的业务逻辑。 有时您需要更改模型中的流程或业务逻辑以实现自定义功能。

尝试直接更改核心文件很诱人,这似乎是一个简单而直接的解决方案。 话虽如此,这是一个不好的做法,因为这使Magento的升级非常困难。 您直接修改的核心文件越多,跟踪更改并在每次版本升级中应用更改的难度就越大!

在本教程中,我们将创建一个自定义模块,以了解Magento中模型覆盖的工作原理。 在此自定义模块中,我们将看到如何覆盖核心“目录”模块的类别模型类。 覆盖通过按照Magento的约定设置某些XML标签来起作用。

我假设您熟悉Magento中的基本模块创建过程。 如果没有,这是一篇很好的文章,解释了自定义模块创建的基础。 让我们直接进入本教程的过程!

设置概览

以下是所需设置所需的文件列表:

  • app/etc/modules/Envato_All.xml :这是用于启用我们的自定义模块的文件。
  • app/code/local/Envato/Catalog/etc/config.xml :这是一个模块配置文件,在该文件中,我们将根据Magento约定使用某些标签来设置模型类的替代。
  • app/code/local/Envato/Catalog/Model/Category.php :这是我们自定义模块的模型类,它将覆盖基本模型类。

创建文件和文件夹:自定义模块

首先,我们需要创建一个模块启动器文件。 创建一个文件“ app / etc / modules / Envato_All.xml”,并将以下内容粘贴到该文件中。 我们使用Envato作为模块名称空间,使用Catalog作为模块名称。 默认情况下,它将启用我们的“目录”模块。

<?xml version="1.0"?>
<config>
  <modules>
    <Envato_Catalog>
      <active>true</active>
      <codePool>local</codePool>
    </Envato_Catalog>
  </modules>
</config>

接下来,我们需要创建一个模块配置文件。 创建“ app / code / local / Envato / Catalog / etc / config.xml”,并将以下内容粘贴到该文件中。

<?xml version="1.0"?>
<config>
  <modules>
    <Envato_Catalog>
      <version>1.0</version>
    </Envato_Catalog>
  </modules>
  
  <global>
    <models>
      <catalog>
        <rewrite>
          <category>Envato_Catalog_Model_Category</category>
        </rewrite>
      </catalog>
    </models>
  </global>
</config>

首先,我们使用<version>标记定义了模块版本号。 之后, <catalog><rewrite>标记用于通知Magento覆盖系统,我们将覆盖“ Catalog”核心模块的“模型”。

接下来, <category>标记用于定义模型标识,该模型标识将被Envato_Catalog_Model_Category类覆盖。 它被映射到目录模块“模型”目录下的模型文件“ Category.php”。 这里要注意的重要一点是,我们正在遵循类似于核心模块的目录结构。 尽管这不是绝对必要的,但它比使用其他目录结构更好,因为它有助于保持可读性。

最后,剩下的唯一事情就是定义一个模型类Envato_Catalog_Model_Category 。 让我们创建一个模型文件“ app / code / local / Envato / Catalog / Model / Category.php”,并将以下内容粘贴到该文件中。

<?php
/**
 * Catalog category model
 *
 * @category   Envato
 * @package    Envato_Catalog
 */
class Envato_Catalog_Model_Category extends Mage_Catalog_Model_Category
{
  public function getProductCollection()
  {
    // Include your custom code here!

    $collection = Mage::getResourceModel('catalog/product_collection')
      ->setStoreId($this->getStoreId())
      ->addCategoryFilter($this);

    return $collection;
  }
}

我们定义了一个Envato_Catalog_Model_Category类,该类扩展了“目录”模块的核心Mage_Catalog_Model_Category模型类。 因此,您可以覆盖基类的每个方法,并在必要时创建新方法。

在上面的示例中, getProductCollection方法被覆盖,因此它将被调用,而不是在核心模型类中定义的方法! 您可以根据需要修改模型代码。

当您覆盖模型中的任何方法时,应确保该方法的返回值的数据类型与基类方法的数据类型匹配。 由于模型方法是从几个核心模块调用的,因此我们应确保它不会破坏其他功能!

尽管这是一个非常基本的示例,但它具有重写核心模型的目的,并且可以根据您的自定义要求对其进行扩展。

结论

在本教程中,我们学习了如何使用自定义模块覆盖Magento中的核心模型文件。 在本系列的下一部分和最后一部分中,我们将看到如何覆盖核心控制器文件。 请不要在下面留下您的评论!

翻译自: https://code.tutsplus.com/tutorials/understand-overriding-in-magento-models--cms-23354

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值