Crear indexador personalizado en Magento

por David Abad
Magento Indexer

Los indexadores permiten mejorar el rendimiento de un sistema Magento mediante el preprocesamiento de los datos más costosos de obtener. De modo que cuando el sistema necesite consumir esta información, ya se encontrara disponible en una estructura de datos óptima y eficiente.

Indexadores en Magento

Magento cuenta con varios indexadores nativos, pensados para procesar la información de clientes, productos, stock, etc. Y permitir su obtención y tratamiento de forma eficiente.

Desde el administrador, en la sección System > Tools > Index Management, podemos ver los indexadores disponibles y su estado:

Magento - Index Management

Estos indexadores son capaces de detectar cambios en los datos de origen, para reindexar la información modificada y mantenerla actualizada. 

Dependiendo de su configuración, los indexadores pueden funcionar de dos modos:

  • Update on save: Reindexación sincrona en el momento de guardar cambios en los datos de origen (p.ej. al guardar datos de producto).
  • Update by schedule: Reindexación asíncrona. Un proceso asíncrono comprueba si hay cambios pendientes de reindexar y lanza los procesos correspondientes.

Por otro lado, el CLI de Magento cuenta con una serie de comandos que pueden lanzarse a nivel de terminal para interactuar con los indexadores:

Listar los indexadores disponibles

bin/magento indexer:info

Lanzar indexadores

bin/magento indexer:reindex
bin/magento indexer:reindex <indexador>

Consultar estado de indexadores

bin/magento indexer:status

Marcar indexadores como inválidos

bin/magento indexer:reset

Consultar/modificar modo de los indexadores

bin/magento indexer:show-mode
bin/magento indexer:set-mode <modo>

Crear indexador personalizado

Magento incluye varios indexadores por defecto (productos, clientes, stock…), pero es posible crear indexadores personalizados para optimizar el coste de obtención de determinados datos del sistema.

A continuación se indican los pasos a dar para la creación de un indexador personalizado:

1. Definir indexador en indexer.xml

Crear un fichero <Modulo>/etc/indexer.xml y definir el nuevo indexador personalizado:

<?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="mi_indexador" view_id="mi_indexador" class="MiVendor\MiModulo\Model\Indexer" shared_index="mi_indexador"> 
        <title translate="true">Título del indexador</title> 
        <description translate="true">Descripción del indexador</description> 
    </indexer>
</config>
2. Indicar tablas de origen de datos en mview.xml

Crear un fichero <Modulo>/etc/mview.xml y definir las tablas de base de datos de las que se obtienen los datos de origen para la indexación:

<?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="mi_indexador" class="MiVendor\MiModulo\Model\Indexer" group="indexer">
        <subscriptions>
            <table name="mi_tabla1" entity_column="entity_id" />
            <table name="mi_tabla2" entity_column="entity_id" />
        </subscriptions>
    </view>
</config>
3. Crear clase con lógica de indexación

Crear el fichero <Modulo>/Model/Indexer.php implementando las interfaces IndexerInterface y MviewInterface, con la lógica de indexación de datos total y parcial:

<?php

declare(strict_types=1);

namespace MiVendor\MiModulo\Model;

use Magento\Framework\Indexer\ActionInterface as IndexerInterface;
use Magento\Framework\Mview\ActionInterface as MviewInterface;

class Indexer implements IndexerInterface, MviewInterface
{
    public function execute($ids)
    {
        // TODO
    }
    
    public function executeFull()
    {
        // TODO
    }
    
    public function executeList(array $ids)
    {
        // TODO
    }
    
    public function executeRow($id)
    {
        // TODO
    }
}
4. Todo listo!

Después de realizar los pasos anteriores, limpiar la caché y eliminar las clases generadas (directorio generated), tu indexador personalizado estará disponibles y podrás utilizarlo desde el CLI de Magento y desde el administrador.

Déjanos tu email para recibir contenido interesante en tu bandeja de entrada, cada mes.

¡No hacemos spam!

Otros artículos