Magento 2 索引与重建索引

在本文中,将学会如何在 Magento 2 中创建索引,重建索引,索引器是 Magento 2 索引的一大特点,了解如何创建 Hello World 模块。

本文中我们将使用 Mageplaza_HelloWorld 模块,请查看我们之前的教程了解如何在 Magento 2中创建一个简单的模块。

索引是 Magento 2 转换产品、类别等数据的方式,用来提高网站的性能。一旦数据发生改变,翻译数据也必须被更新或重建。Magento 2 有一个非常复杂的架构,可以存储大量的商业数据(包括目录数据、价格、用户、商店等等)在许多数据表中,为了优化店面性能,Magento 使用索引器将数据累积到特殊的表中。

例如:假设您将商品的价格从8.99美元更改为6.99美元,Magento 必须重建改变价格的索引并显示在店铺页面上,如果没有索引,Magento 不得不每次都计算购物车中、捆绑定价、折扣、分层定价等每个产品的价格,加载一个产品的价格将会花费很长时间,可能导致购物车数据被废弃。

让我们开始创建用户索引:

  • 第一步:创建索引配置文件
  • 第二步:创建 Mview 配置文件
  • 第三步:创建索引类
  • 第四步:运行测试

创建所以配置文件

此配置文件将会定义索引。

文件:app/code/Mageplaza/HelloWorld/etc/indexer.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Indexer/etc/indexer.xsd">
    <indexer id="mageplaza_helloworld_indexer" view_id="mageplaza_helloworld_indexer" class="Mageplaza\HelloWorld\Model\Indexer\Test">
        <title translate="true">Mageplaza HelloWorld Indexer</title>
        <description translate="true">HelloWorld of custom indexer</description>
    </indexer>
</config>

在这个文件中,我们使用该属性声明一个新的索引器进程:

  • id属性用于标识该索引器,当您想要检查状态、模式或通过命令行重新索引该索引器时,您可以调用它。

  • view_id 是在 mview 配置文件中定义的 view 元素的 id 。

  • class 属性是我们处理索引器方法的类的名称

这个简单的 Magento 2 索引将有一些子元素:

  • 标题元素用于定义在索引器网格中显示时的标题。

  • 描述元素用来定义在索引器网格中显示时的元素。

创建 Mview 配置文件

mview.xml 文件用于跟踪某个实体的数据库更改并运行更改句柄( execute() 方法)。

文件:app/code/Mageplaza/HelloWorld/etc/mview.xml

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Mview/etc/mview.xsd">
    <view id="mageplaza_helloworld_indexer" class="Mageplaza\HelloWorld\Model\Indexer\Test" group="indexer">
        <subscriptions>
            <table name="catalog_product_entity" entity_column="entity_id" />
        </subscriptions>
    </view>
</config>

在这个文件中,我们定义了一个 id属性的视图元素,该元素可以从 indexer 和包含 execute()调用。当订阅中的表发生更改时,将运行此方法。

要声明一个表,使用这个表的表名和列发送到execute()方法。在这个例子中,声明一个表catalog_product_entity。所以当一个或者多个产品被保存 Mageplaza\HelloWorld\Model\Indexer\Test 类中的 execute() 方法会被调用。

创建索引类

根据上面的 indexer.xml and mview.xml 文件,将这两个文件定义为索引类:Mageplaza\HelloWorld\Model\Indexer\Test

文件:app/code/Mageplaza/HelloWorld/Model/Indexer/Test.php

<?php
namespace Mageplaza\HelloWorld\Model\Indexer;

class Test implements \Magento\Framework\Indexer\ActionInterface, \Magento\Framework\Mview\ActionInterface
{
	/*
	 * Used by mview, allows process indexer in the "Update on schedule" mode
	 */
	public function execute($ids){

		//code here!
	}

	/*
	 * Will take all of the data and reindex
	 * Will run when reindex via command line
	 */
	public function executeFull(){
		//code here!
	}
   
   
	/*
	 * Works with a set of entity changed (may be massaction)
	 */
	public function executeList(array $ids){
		//code here!
	}
   
   
	/*
	 * Works in runtime for a single entity using plugins
	 */
	public function executeRow($id){
		//code here!
	}
}

您可以使用此方法写一段添加数据的代码在indexer类中

做过这些操作之后,请刷新缓存,进入 System > Index Management 页面查看结果,将会展示为:

使用命令重建索引

在命令行中执行此命令

php bin/magento indexer:reindex

本教程翻译自Mageplaza模块开发系列,其他内容请点击下面链接: