Как создать пользовательский индексатор?


Я пытаюсь создать пользовательский индексатор для определенного атрибута продукта.
Мне нужно:

  • прочитайте значение атрибута продукта
  • обработайте его каким-либо образом (не имеет значения)
  • сохраните его в таблице индексов

Описанные выше шаги могут быть реализованы в пользовательском скрипте, но я хотел бы интегрировать индексатор, используя шаблон, используемый другим индексатором в Magento.

Я вижу, что индексатор Magento по умолчанию реализует этот абстрактный класс Mage_Index_Model_Indexer_Abstract
... Похоже, что понять процесс из кода непросто, и я не могу найти для него никакой документации.

Любая помощь - это благодарность.

Author: Fra, 2014-07-14

1 answers

Следующая информация должна быть общим руководством, которое приведет к базовому пониманию всего indexer thing, поэтому не является полным "пошаговым руководством"... (если вы хотите внести свой вклад в этот ответ, пожалуйста)

Здесь требуется как минимум 3 шага:

  1. Создайте таблицу индексов и связанную модель ресурсов
  2. Создайте модель индексатора, реализующую Mage_Index_Model_Indexer_Abstract
  3. добавьте свой индексатор в конфигурацию Magento

Предлагаемая документация:

  1. Вероятно, лучший способ разобраться в этом - взглянуть на Mage_Catalog_Model_Product_Indexer_Price (это одна из более простых реализаций индекса).
  2. Этот ресурс на данный момент выглядит лучшим руководством для понимания всего процесса, чтобы решить, какое именно действие требуется.

ШАГ 1
Просто добавьте свою таблицу индексов в установщик, как и для любой другой таблицы модулей.
Ваша модель ресурсов должна реализовать логику для Reindex All в reindexAll() метод: вы, вероятно, обработали бы все объекты здесь, чтобы извлечь все данные.

ШАГ 2
_registerEvent(),_processEvent() являются ли здесь важным методом, вам нужно будет немного покопаться в приведенном ниже руководстве, чтобы понять логику, стоящую за ними

В основном _registerEvent() добавьте некоторые данные в $event на основе "типа события" и "типа сущности". Эти дополнительные данные будут использоваться в методе _processEvent().

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

/**
 * Data key for matching result to be saved in
 */
const EVENT_MATCH_RESULT_KEY = 'some_key';

/**
 * Initialize resource model
 *
 */
protected function _construct()
{
    $this->_init('module/resource_model');
}

/**
 * @var  Used by matchEvent()
 * for example if you are processing products ...
 */
protected $_matchedEntities = array(
    Mage_Catalog_Model_Product::ENTITY => array(
        Mage_Index_Model_Event::TYPE_SAVE,
        Mage_Index_Model_Event::TYPE_MASS_ACTION,
        Mage_Index_Model_Event::TYPE_DELETE
    )
);

 /**
 * Get Indexer name
 *
 * @return string
 */
public function getName(){
    return 'My indexer Name';
}

/**
 * Get Indexer description
 *
 * @return string
 */
public function getDescription()
{
    return 'My indexer Description';
}

/**
 * Register indexer required data inside event object
 *
 * @param   Mage_Index_Model_Event $event
 *
 * Register data required by process in event object
 * @param Mage_Index_Model_Event $event
 */
protected function _registerEvent(Mage_Index_Model_Event $event)
{
    $event->addNewData(self::EVENT_MATCH_RESULT_KEY, true);
    $entity = $event->getEntity();
    $dataObj = $event->getDataObject();

    if ($entity == Mage_Catalog_Model_Product::ENTITY) {
        if ($event->getType() == Mage_Index_Model_Event::TYPE_SAVE) {
            $event->addNewData('yourmodule_update_product_id', $dataObj->getId());
        } elseif ($event->getType() == Mage_Index_Model_Event::TYPE_DELETE) {
            $event->addNewData(' yourmodule _delete_product_id', $dataObj->getId());
        } elseif ($event->getType() == Mage_Index_Model_Event::TYPE_MASS_ACTION) {
            $event->addNewData(' yourmodule _mass_action_product_ids', $dataObj->getProductIds());
        }
    }
}

/**
 * Process event based on event state data
 *
 * @param   Mage_Index_Model_Event $event
 */
protected function _processEvent(Mage_Index_Model_Event $event){
    /** DO STUFF **/
    return $this;
}

ШАГ 3
Добавьте это в свою конфигурацию, [модуль/модель] - это модель, созданная на шаге 2. Поэтому на этом этапе, если вы зайдете в систему->индексатор, вы увидите новую запись

<global>
    ......
    <index>
        <indexer>
            <some_key>
                <model>module/model</model>
            </some_key>
        </indexer>
    </index>
    ......
</global> 

Источники:

 19
Author: Fra, 2015-09-24 07:21:23