Как создать пользовательский индексатор?
Я пытаюсь создать пользовательский индексатор для определенного атрибута продукта.
Мне нужно:
- прочитайте значение атрибута продукта
- обработайте его каким-либо образом (не имеет значения)
- сохраните его в таблице индексов
Описанные выше шаги могут быть реализованы в пользовательском скрипте, но я хотел бы интегрировать индексатор, используя шаблон, используемый другим индексатором в Magento.
Я вижу, что индексатор Magento по умолчанию реализует этот абстрактный класс Mage_Index_Model_Indexer_Abstract
... Похоже, что понять процесс из кода непросто, и я не могу найти для него никакой документации.
Любая помощь - это благодарность.
1 answers
Следующая информация должна быть общим руководством, которое приведет к базовому пониманию всего indexer thing
, поэтому не является полным "пошаговым руководством"... (если вы хотите внести свой вклад в этот ответ, пожалуйста)
Здесь требуется как минимум 3 шага:
- Создайте таблицу индексов и связанную модель ресурсов
- Создайте модель индексатора, реализующую
Mage_Index_Model_Indexer_Abstract
- добавьте свой индексатор в конфигурацию Magento
Предлагаемая документация:
- Вероятно, лучший способ разобраться в этом - взглянуть на
Mage_Catalog_Model_Product_Indexer_Price
(это одна из более простых реализаций индекса). - Этот ресурс на данный момент выглядит лучшим руководством для понимания всего процесса, чтобы решить, какое именно действие требуется.
ШАГ 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>
Источники: