2010-12-03 9 views
8

現在、複数の商品をマゼンタでインポートできるスクリプトを作成しています。Magento API:新製品を追加した後にインデックスを再作成

$product = Mage::getModel('catalog/product'); 
$product->setSku($data['sku']); 
//etc etc 
$product->save(); 

製品が完全に作成されますが、私はどちらかのバックエンドに保存するまで、それは(何も変更せずに!)私のフロントエンドには表示されませんまたは私はバックエンドでインデックスを再構築。

関連するデータベーステーブルでdiffを実行して、製品を保存してインポートスクリプトにこれらのフィールドを追加したときに何が変わっているかを確認しましたが、何の効果もありませんでした。インポートされた製品は、バックエンドを介して手動でインデックスを再構築すると表示されるため、正常でなければなりません。

キャッシュが完全に無効になっています。

私の質問は次のとおりです。製品をインポートした後にインデックスを再構築するにはどうすればよいですか?

答えて

34

インデックスモジュールでこのようなモデルを使用できます。

すべてのインデックスを再構築する必要があるため、コレクションにフィルタが適用されていません。しかし、addFieldToFilter($field, $condition)メソッドを使用して、パラメータセット(コード、最後に再インデックスされたものなど)でインデックスプロセスリストをフィルタリングできます。

小提案

はあなたが製品を輸入しながら、手動モードにインデックスを設定するのは素晴らしいことだ、それはそれらのいくつかは、イベントを保存し、製品を観察するため、インポートプロセスをスピードアップするためのお手伝いをしますので、取りいくつかの時間。あなたは次のようにそれを行うことができます。

$processes = Mage::getSingleton('index/indexer')->getProcessesCollection(); 
$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_MANUAL)); 
$processes->walk('save'); 
// Here goes your 
// Importing process 
// ................ 
$processes->walk('reindexAll'); 
$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_REAL_TIME)); 
$processes->walk('save'); 
+0

これはすばらしく素晴らしいです!ありがとうございました! – Alex

+0

すばらしいスニペット、ありがとうIvan。ゆっくりとした輸入は、マゼンタについてのよくある苦情です。それを改善する方法を知ることは素晴らしいことです! –

+0

本当に素晴らしいスニペット。私の輸入は時間の3/4でスピードアップしました!ありがとうございました! –

4

セーブで製品のインデックスを再作成するためにインデクサを防ぐため、少なくとも2つの状況があります。

1つ:「インデックス管理」の「インデックス」プロパティの「手動更新」の設定。保存時に製品のインデックスを作成する場合は、[保存時に更新]に設定する必要があります。

2つ:DataFlowバッチインポートプロシージャなどで使用されるsetIsMassupdate製品フラグ。各製品保存メソッド呼び出し時にインデクサーがトリガーされないようにします。

これが役に立ちます。 よろしくお願いします。アレッサンドロ

関連する問題