3

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

众所周知,load()/setData()/save() 场景会触发重新索引。

我已经查看了“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' 下的代码似乎触发了索引器操作。

4

2 回答 2

8

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

主要思想如下:如果你对产品的Model进行更新操作,就会触发reindex,但是如果你对Resource进行这些操作,那么特定的操作是在没有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可以使用

干杯!

于 2012-04-23T17:40:16.043 回答
6

您可以先像这样停止索引器:

$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

希望这可以帮助!

于 2012-04-21T13:40:13.277 回答