Magento CE 1.4 Indexer - 指数管理

时间:2012-01-30 19:28:29

标签: magento indexing magento-1.4

我正在尝试在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');
}
}

实现此代码后,我能够在Index Management网格下看到我的新自定义索引器项,但是当我运行reindex操作时,它只是触发了reindexAll()方法。

任何想法都会有所帮助,并提前感谢。

1 个答案:

答案 0 :(得分:2)

这是正确的Magento行为。这是一个解释: (代码示例取自magento ce 1.4.0.0)

产品保存后,在以下调用中在Mage_Catalog_Model_Product :: afterCommitCallback()中触发reindex:

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,您应该通过管理面板将索引模式更改为“手动”。