Реализация пользовательского индексатора Magento в расширении


Я работаю над добавлением дополнительного столбца в сетку в существующем внутреннем расширении. Мне нужно добавить индексатор к этому расширению, индексирующему здоровье (количество продаж) (примерно) за последние 3 месяца. (90 дней.) Я делю здоровье на двоих в месяц. (Итак, по полю для каждого 1-30, 31-60 и 61-90 дней назад.)

Имея в основном нулевые знания об индексаторах Magento, я решил создать простое безликое расширение (функционирующая страница adminhtml и ничего больше) и попытайтесь реализовать индексатор на этом, чтобы узнать, как работает индексация.

Я уже просмотрел несколько руководств, пытаясь понять, как это сделать, но ни в одном из них нет полностью функционирующих примеров.

Они включают код, необходимый для создания индексатора, без подробного описания его реализации.

Как бы я создал индексатор, реализовал его и использовал для такого рода данных? Какой тип индекса мне нужен для индексации этого информация?

Я ищу объяснение индексов Magento и полную реализацию. Возможность создать и запустить индекс с такими данными в любом расширении работает для меня.

Author: Marius, 2016-06-15

1 answers

Чтобы объявить индекс, вам нужно добавить это в config.xml внутри тега global:

    <index>
        <indexer>
            <some_unique_index_name_here>
                <model>[module]/indexer_something</model>
            </some_unique_index_name_here>
        </indexer>
    </index>

Тег model в приведенном выше коде содержит псевдоним для вашей модели индексатора. Он похож на тот, который вы используете для Mage::getModel(...).

Затем вам нужно создать класс, на который ссылается тег model выше:

//you need to extend Mage_Index_Model_Indexer_Abstract class
class [Namespace]_[Module]_Model_Indexer_Something extends Mage_Index_Model_Indexer_Abstract 
{
    //you need to add the following 2 methods `_registerEvent` and `_processEvent`. Let''s just make them do nothing for now.
    protected function _registerEvent(Mage_Index_Model_Event $event) 
    {
        return $this;
    }
    protected function _processEvent(Mage_Index_Model_Event $event) 
    {
        return $this;
    }
    //this is the index name that shows up in indexes section
    public function getName() 
    {
        return Mage::helper('[module]')->__('Your index name');
    }
    //this is the index description that shows up in indexes section
    public function getDescription() 
    {
        return Mage::helper('[module]')->__('Your index description');
    }
    //magic happens here
    public function reindexAll() 
    {
        //here goes the code you need for reindexing
        return $this;
    }
}

Если ваш индекс должен запускаться только с экрана индексов или из командной строки, то вы настроены.
Если вам нужно, чтобы ваш индекс срабатывал при разных событиях, он становится все сложнее.
Вам нужно реализовать методы, которые я оставил пустыми выше _registerEvent и _processEvent.
Но они действительно специфичны в зависимости от ваших событий.
Вы можете взглянуть на эти методы из основных индексаторов, чтобы увидеть, что произойдет.
Индексатор плоских изделий, например: https://github.com/OpenMage/magento-mirror/blob/magento-1.9/app/code/core/Mage/Catalog/Model/Product/Indexer/Flat.php

 5
Author: Marius, 2016-06-23 13:35:06