在本系列中,我们正在探索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