对于任何框架而言,在核心本身中支持可扩展性和可伸缩性始终是一项重要功能。 Magento确实如此,它允许程序员创建自定义扩展来满足自定义要求,从而提供可扩展性。 另一方面,它还允许您覆盖核心文件,以更改Magento核心功能的流程和行为。
Magento中有多种方法可以让您覆盖核心文件。 其中之一是事件观察者模式的实现。 使用该方法,您将在模块中定义所需事件的观察者,并在Magento中引发相关事件时将其拾取。 当然,这是对Magento核心模块进行更改的强大而标准的方法。 话虽如此,在某些情况下,您会觉得如果只用核心文件片段替换它们就好了。 您可以使用自定义模块中的XML配置文件来执行此操作。
为什么要覆盖块?
在Magento中,块是前端中任何布局的原始构建组件。 尽管您可以使用自定义主题覆盖任何块的模板文件来更改视觉输出,但是有时您还是想更改核心块代码的逻辑。 在这种情况下,用自定义模块的块文件覆盖核心块确实有助于轻松插入更改。
在本教程中,我们将创建一个自定义模块,以了解Magento中块覆盖的工作原理。 在自定义模块中,我们将覆盖显示在类别页面视图上的产品列表块。 覆盖通过按照Magento的约定设置某些XML标签来起作用。
我假设您熟悉Magento中的基本模块创建过程。 这是一篇很好的文章,解释了自定义模块创建的基础,以防万一您想看看它! 让我们直接进入本教程的内容!
设置概览
我们将创建一个名为“ Catalog”的简单自定义模块,该模块在类别页面视图中设置核心产品列表块的覆盖(app / code / core / Mage / Catalog / Block / Category / View.php)。 以下是所需设置所需的文件列表:
- app / etc / modules / Envato_All.xml:这是用于启用我们的自定义模块的文件。
- app / code / local / Envato / Catalog / etc / config.xml:这是一个模块配置文件,在该文件中,我们将根据Magento约定使用某些标签来设置块覆盖。
- app / code / local / Envato / Catalog / Block / Category / View.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>
<blocks>
<catalog>
<rewrite>
<category_view>Envato_Catalog_Block_Category_View</category_view>
</rewrite>
</catalog>
</blocks>
</global>
</config>
在模块的开头,我们使用<version>
标记设置了模块版本号。 之后, <catalog>
和<rewrite>
标记用于通知Magento覆盖系统,我们将覆盖“ Catalog”核心模块的“块”之一。
此外, <category_view>
标记用于定义一个块标识,该标识将被Envato_Catalog_Block_Category_View
类覆盖。 它映射到目录模块“块”目录下的块文件“ Category / View.php”。 这里要注意的重要一点是,我们正在遵循类似于核心模块的目录结构。 尽管这不是绝对必要的,但为了保持可读性,它优于其他目录结构。
最后,剩下的唯一事情就是定义一个块类Envato_Catalog_Block_Category_View
。 让我们创建一个阻止文件“ app / code / local / Envato / Catalog / Block / Category / View.php”,并使用以下内容填充它。
<?php
/**
* Category View block
*
* @category Envato
* @package Envato_Catalog
*/
class Envato_Catalog_Block_Category_View extends Mage_Catalog_Block_Category_View
{
public function getProductListHtml()
{
// Include your custom code here!
return $this>getChildHtml('product_list');
}
}
我们定义了Envato_Catalog_Block_Category_View
类,它扩展了核心Mage_Catalog_Block_Category_View
块类。 因此,您可以覆盖基类的每个方法,并在必要时创建新方法。
在上面的示例中, getProductListHtml
方法被覆盖,因此将在类别页面视图中调用它! 您可以根据需要更改代码。
尽管这是一个非常基本的示例,但它的目的是覆盖核心块,您可以对其进行调整,以使事情变得更复杂,并创建更有用的东西!
结论
今天,在本系列的第一篇文章中,我们已经学习了如何覆盖Magento的核心模块。 在下一部分中,我将提出更多令人兴奋的东西! 我希望在下面的Feed中听到您的评论和疑问!
翻译自: https://code.tutsplus.com/tutorials/understand-overriding-in-magento-blocks--cms-23325