2010-12-03 28 views
8

Je suis en train d'écrire un script qui me permet d'importer plusieurs produits dans magento.API Magento: reconstruire les index après l'ajout de nouveaux produits

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

Le produit est créé parfaitement, mais il ne sera pas affiché dans mon frontend jusqu'à ce que je sauve soit dans le back-end (sans changer quoi que ce soit!) OU je reconstruire les index dans le back-end.

J'ai fait un diff sur les tables de base de données pertinentes pour voir ce qui change lorsque j'ai sauvegardé le produit et ajouté ces champs à mon script d'importation, mais cela n'a eu aucun effet. Le produit importé doit être OK car il apparaît lorsque je reconstruis les index manuellement via le backend.

La mise en mémoire cache est complètement désactivée. Maintenant, ma question est: Comment puis-je reconstruire les index après l'importation de mes produits?

Répondre

34

Vous pouvez utiliser un tel modèle dans le module Index.

$processes = Mage::getSingleton('index/indexer')->getProcessesCollection(); 
$processes->walk('reindexAll'); 

Puisque vous avez besoin de reconstruire tous les index, il n'y a pas de filtres aplied à la collecte. Mais vous pouvez filtrer la liste des processus d'index par ensemble de paramètres (code, dernière fois réindexé, etc) via la méthode addFieldToFilter($field, $condition).

Petit Suggestion

Ce serait génial de définir des index en mode manuel pendant que vous l'importation des produits, il vous aidera à accélérer le processus d'importation, parce que certains d'entre eux observent événement sauver produit, donc il faut parfois. Vous pouvez le faire de la manière suivante:

$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

C'est génial et fonctionne très bien! Je vous remercie! – Alex

+0

Excellent extrait, merci Ivan. La lenteur des importations est une plainte si commune à propos de Magento, c'est génial de savoir comment l'améliorer! –

+0

Très bon extrait. Mon importation s'est accélérée au 3/4 du temps! Je vous remercie! –

4

Il y a au moins deux circonstances qui empêchent l'indexeur de réindexer un produit lors de la sauvegarde. Un: le paramètre «Mise à jour manuelle» dans les propriétés des index que vous trouvez sous Système, Gestion de l'index. Vous devez le définir sur "Mettre à jour lors de l'enregistrement" si vous souhaitez indexer un produit lors d'une sauvegarde. Deux: l'indicateur de produit setIsMassupdate qui est utilisé, par exemple, dans les procédures d'importation par lots DataFlow afin d'empêcher le déclenchement de l'indexeur lors de chaque appel de méthode d'enregistrement de produit.

Espérons que cela aide. Cordialement, Alessandro