2012-01-30 2 views
4

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

Я изучил основной код 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'); 
} 
} 

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

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

+0

Не знаете, что вы на самом деле спрашиваете здесь? – edmondscommerce

ответ

2

Это правильное поведение 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».

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

Смежные вопросы