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;
    }

「// マス アクション インデクサー イベントの登録」の下のコードは、インデクサー アクションをトリガーするようです。

4

2 に答える 2

8

再インデックスをトリガーせずに製品の属性を更新する方法を見つけました。

主な考え方は次のとおりです。製品のモデルで更新操作を行うと、再インデックスがトリガーされますが、リソースでこれらの操作を行うと、その特定の操作は再インデックスなしで実行されます。

例えば:

/**
* 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 に答える