Magento更新产品属性而不触发reindex

时间:2012-04-20 13:13:19

标签: magento

是否可以在不触发reindex的情况下更新产品属性?

众所周知,load()/ setData()/ save()场景会触发reindex。

我在“Mage_Catalog_Model_Product_Action”中查看了'updateAttributes'方法,但我认为它也会触发产品重新索引。

/**
     * Update attribute values for entity list per store
     *
     * @param array $productIds
     * @param array $attrData
     * @param int $storeId
     * @return Mage_Catalog_Model_Product_Action
     */
    public function updateAttributes($productIds, $attrData, $storeId)
    {
        $this->_getResource()->updateAttributes($productIds, $attrData, $storeId);
        $this->setData(array(
            'product_ids'       => array_unique($productIds),
            'attributes_data'   => $attrData,
            'store_id'          => $storeId
        ));

        // register mass action indexer event
        Mage::getSingleton('index/indexer')->processEntityAction(
            $this, Mage_Catalog_Model_Product::ENTITY, Mage_Index_Model_Event::TYPE_MASS_ACTION
        );
        return $this;
    }

'// register mass action indexer event'下的代码似乎触发了索引器操作。

2 个答案:

答案 0 :(得分:7)

我找到了在不触发reindex的情况下更新产品属性的方法。

主要思想如下:如果您对产品的模型执行更新操作,则会触发reindex,但如果您在资源上执行这些操作,则该特定操作将在没有reindex的情况下完成。

例如:

/**
* This method updates product attributes then triggers reindex
*/
Mage_Catalog_Model_Product_Action->updateAttributes($productIds, $attrData, $storeId);

/**
* This method updates product attributes but doesn't trigger reindex
*/
Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Action->updateAttributes($productIds, $attrData, $storeId);

其中:

  • $productIds - 包含产品ID
  • 的数组
  • $attrData - 一个数组,其键作为属性名称,值作为属性值
  • $storeId - 商品指定商店的商店ID(如果您的商品被分配到不同商店的多个类别);

如果属性是全局的Mage_Core_Model_App::ADMIN_STORE_ID可以使用

干杯!

答案 1 :(得分:5)

您可以先停止索引器:

$processes = Mage::getSingleton('index/indexer')->getProcessesCollection();
$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_MANUAL));
$processes->walk('save');

然后进行更新,之后重新索引:

$processes = Mage::getSingleton('index/indexer')->getProcessesCollection();
$processes->walk('reindexAll');
$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_REAL_TIME));
$processes->walk('save');

来源:https://gist.github.com/2217520

希望这有帮助!