Magento CE 1.4 Indexer - Управление индексами - PullRequest
4 голосов
/ 30 января 2012

Я пытаюсь создать пользовательский индексатор в разделе «Управление индексами» в сообществе Magento версии 1.4, основная цель этого пользовательского индексатора - обновить пользовательский атрибут продукта на основе набора вычислений.

Я изучил код ядра magento и сделал что-то похожее на то, что мне нужно, но я не смог найти достаточно документации по этому вопросу.

это то, что я получил до сих пор:

config.xml

<?xml version="1.0"?>
<config>
<!-- configuration -->
    <global>
       <index>
            <indexer>
                <custom_product_price>
                <model>custom/indexer_price</model>
                </custom_product_price>
             </indexer>
        </index>
     </global>
<!-- configuration -->
</config>

Затем я создал модель

class MyModule_Custom_Model_Indexer_Price extends Mage_Index_Model_Indexer_Abstract
{
protected $_matchedEntities = array(
    Mage_Catalog_Model_Product::ENTITY => array(
        Mage_Index_Model_Event::TYPE_SAVE,
        Mage_Index_Model_Event::TYPE_DELETE,
        Mage_Index_Model_Event::TYPE_MASS_ACTION
    )
);

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

public function getName()
{
    return Mage::helper('customizer')->__('Customizable Products');
}

public function getDescription()
{
    return Mage::helper('customizer')->__('Index Customizable Product Prices');
}

public function matchEvent(Mage_Index_Model_Event $event) {
    Mage::log("Should I match an event: ".$event->getEntity() . '|'. $event->getType());
    return true;
}

protected function _registerEvent(Mage_Index_Model_Event $event) {
    Mage::log("Should I register an event: ".$event->getEntity() . '|'. $event->getType()); 
}

protected function _processEvent(Mage_Index_Model_Event $event) {
    Mage::log("Should I process an event: ".$event->getEntity() . '|'. $event->getType()); 
}

public function reindexAll() {

    Mage::log('Do my processing to reindex');
}
}

, после реализации этого кода я смог увидеть свой новый элемент индексатора в сетке управления индексами, но когдаЯ выполнил действие переиндексации, оно просто вызвало метод reindexAll ().

Любые идеи будут полезны и заранее благодарны.

1 Ответ

2 голосов
/ 07 сентября 2013

Это правильное поведение Magento.Вот объяснение: (примеры кода взяты из magento ce 1.4.0.0)

После сохранения продукта переиндексация запускается в Mage_Catalog_Model_Product :: afterCommitCallback () в следующем вызове:

Mage::getSingleton('index/indexer')->processEntityAction($this, self::ENTITY, Mage_Index_Model_Event::TYPE_SAVE);

Если вы загляните внутрь processEntityAction, вы увидите, что если ваш индекс соответствует и если режим индекса не «ручной», то magento запускает метод _processEvent вашей модели индексатора.Когда Magento заканчивает работу, он удаляет ожидающую запись из таблицы «index_process_event».

Когда вы запускаете переиндекс из панели администратора, Magento проверяет, есть ли ожидающие записи для вашего индекса в таблице «index_process_event»,если да - Magento запускает метод _processEvent вашей модели, в противном случае он запускает reindexAll.Таким образом, в вашем случае совершенно правильно, что magento запускает reindexAll.Если вы хотите, чтобы Magento запускал _processEvent вместо reindexAll, вам следует изменить режим индексирования на «Ручной» через панель администратора.

...