2011-11-17 11 views
7

मैंने कुछ या अन्य पैरामीटर के आधार पर अपने उत्पाद कैटलॉग को अपडेट करने के लिए कुछ स्क्रिप्ट लिखी हैं। उनमें से प्रत्येक में आधार तर्क प्रत्येक को बचाने के लिए एक एसक्यूएल अद्यतन क्वेरी कुछ इस के लिए simillar है ...Magento: उत्पाद कैटलॉग को तेज़ी से अपडेट करना

 //Get collection 
    $collection = Mage::getModel('catalog/product')->getCollection(); 
    $collection->addAttributeToSelect('sku'); 
$collection->addAttributeToSelect('publihser'); 
    $collection->addFieldToFilter(array(array('attribute'=>'publisher','eq'=>$publisher))); 

    // for each product in collection do a individual save 
    foreach ($collection as $product) { 
    $product->setSKU($newValue); 
    $product->save(); 
      } 

इस काम हालांकि, और तथ्य यह है कि एक बहुत बड़ी सूची है, यह काफी धीमी है।

मैं सोच रहा था कि क्या यह उत्पाद पर बजाय संग्रह पर एकल बचत करके बढ़ाया जा सकता है।

+0

क्या यह ब्राउज़र या क्ली में चलता है? – djdy

+2

कोशिश करें [एमएजीएमआई] (http://sourceforge.net/apps/mediawiki/magmi/index.php?title=Magmi_Wiki)। –

+0

@djdy यह सीएलआई पर चल रहा है .. लेकिन वेब इंटरफ़ेस पर भी चलाया जा सकता है। – TheVyom

उत्तर

21

बहुत तेज़ अपडेट स्क्रिप्ट लिखने के लिए आप कई चीजें कर सकते हैं। मुझे नहीं पता कि आप अपने कुछ चर कैसे प्राप्त कर रहे हैं, इसलिए आपको इसे अपने मामले में काम करने के लिए संशोधित करने की आवश्यकता होगी, लेकिन नीचे दिया गया कोड वर्तमान में इसे करने के तरीके से बहुत तेज़ होना चाहिए। उदाहरण:

// Set indexing to manual before starting updates, otherwise it'll continually get slower as you update 
$processes = Mage::getSingleton('index/indexer')->getProcessesCollection(); 
$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_MANUAL)); 
$processes->walk('save'); 

// Get Collection 
$collection = Mage::getModel('catalog/product')->getCollection() 
    ->addAttributeToSelect('sku') 
    ->addAttributeToSelect('publihser') 
    ->addFieldToFilter(array(array('attribute'=>'publisher','eq'=>$publisher))); 


function productUpdateCallback($args){ 
    $product = Mage::getModel('catalog/product'); 

    $product->setData($args['row']); 

    $productId = $product->getId(); 

    $sku = 'yourSku'; 

    // Updates a single attribute, much faster than calling a full product save 
    Mage::getSingleton('catalog/product_action') 
     ->updateAttributes(array($productId), array('sku' => $sku), 0); 
} 

// Walk through collection, for large collections this is much faster than using foreach 
Mage::getSingleton('core/resource_iterator')->walk($collection->getSelect(), array('productUpdateCallback')); 


// Reindex all 
$processes->walk('reindexAll'); 
// Set indexing back to realtime, if you have it set to manual normally you can comment this line out 
$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_REAL_TIME)); 
$processes->walk('save'); 
+0

धन्यवाद @Jasuten। आपका उत्तर उन विचारों से भरा है जो मैं गति को बेहतर बनाने के लिए उपयोग कर सकता हूं। – TheVyom

+2

मुझे 'category_ids' को अपडेट करने का प्रयास करते समय \ 69 \ code \ core \ Mage \ Catalog \ Model \ संसाधन \ Product \ Action.php में गैर-ऑब्जेक्ट पर किसी सदस्य फ़ंक्शन getAttributeId() पर कॉल करें। क्या इस तरह "विशेषता" (यह वास्तव में एक विशेषता नहीं है) को संशोधित करने का कोई तरीका नहीं है, या किसी भी तरह से '$ product-> setCategoryIds (' 1,2,3 ') -> सेव(); '' –

संबंधित मुद्दे