2011-11-17 39 views
7

Tôi đã viết khá một vài tập lệnh để cập nhật danh mục sản phẩm của mình dựa trên một số hoặc thông số khác. Trong mỗi chúng logic cơ bản là một cái gì đó simillar này ...Magento: Cập nhật Danh mục sản phẩm nhanh hơn

 //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(); 
      } 

Mặc dù tác phẩm này, mỗi tiết kiệm được một bản cập nhật truy vấn SQL và thực tế là có một cửa hàng rất lớn, điều này là khá chậm.

Tôi đã tự hỏi liệu điều này có thể được tăng tốc hay không bằng cách lưu một lần vào bộ sưu tập thay vì trên sản phẩm.

+0

Điều này có chạy trong trình duyệt hoặc bấm không? – djdy

+2

thử [MAGMI] (http://sourceforge.net/apps/mediawiki/magmi/index.php?title=Magmi_Wiki). –

+0

@djdy Điều này đang chạy trên CLI .. nhưng cũng có thể chạy trên giao diện Web. – TheVyom

Trả lời

21

Có một số điều bạn có thể làm để viết tập lệnh cập nhật nhanh hơn nhiều. Tôi không biết làm thế nào bạn đang nhận được một số biến của bạn, do đó bạn sẽ cần phải sửa đổi để có được nó làm việc trong trường hợp của bạn, nhưng mã dưới đây nên được nhanh hơn nhiều so với cách bạn hiện đang làm nó. ví dụ:

// 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

Cảm ơn @Jasuten. Câu trả lời của bạn đầy những ý tưởng mà tôi có thể sử dụng để cải thiện tốc độ. – TheVyom

+2

Tôi nhận được 'Gọi hàm thành viên getAttributeId() trên một đối tượng không trong \ app \ code \ core \ Mage \ Catalog \ Model \ Resource \ Product \ Action.php trên dòng 69' khi cố cập nhật' category_ids'. Không có cách nào để sửa đổi "thuộc tính" (nó không thực sự là một thuộc tính) theo cách này, hoặc bất kỳ cách nào nhanh hơn '$ product-> setCategoryIds ('1,2,3') -> save();' –

Các vấn đề liên quan