是否可以在不触发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'下的代码似乎触发了索引器操作。
答案 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
希望这有帮助!