2011-04-19 81 views
1

我通過一個產品集合運行循環像下面通過產品收集循環和節能產品正在改變屬性值

$productCollection = Mage::getModel('catalog/product')->getCollection() 
    ->addAttributeToSelect('small_image') 
    ->addAttributeToSelect('thumbnail') 
    ->addAttributeToSelect('image') 
    ->addAttributeToSelect('sku'); 

foreach($productCollection as $product){ 
    $product->setSmallImage($product->getImage()); 
    $product->setThumbnail($product->getImage()); 
    $product->save(); 
} 

我的其他圖像類型爲基準圖像,因爲設置爲相同的意外更改客戶忘記將其設置在導入表單中。出於某種原因,在執行此操作時,將所有產品的可見性設置爲「目錄」,「搜索」。很多我的產品都假設爲「不可見」,所以當然這會造成不必要的麻煩。

任何想法爲什麼這個值會改變,還有其他值可能會根據我通過產品集合的循環而改變嗎?

我想這是因爲我刪除了addAttributeToSelect(*),並做了具體的兩個屬性,但是試圖超過18K的產品做的產品集合,當它被crapping了

+0

也許知名度有這樣做的一個教程爲每個產品設置,我不確定。您可以製作當前可見性值的副本,並在保存之前爲每個產品重新設置。 – 2011-04-19 18:02:32

+0

您可以將'addAttributeToSelect(*)'放回原處並使用分頁方式分批進行。儘管如此,可能還需要很長時間。 – clockworkgeek 2011-04-19 18:27:43

+0

另一個想法是,如果只有可見性受到負面影響,那麼將該屬性添加到選擇中,這會節省加載「*」,這在EAV術語中是很多表連接。 – clockworkgeek 2011-04-19 19:38:49

回答

4

好了,所以這是我發現了什麼。當在Magento中保存一個對象時,它將調用普通的Model抽象保存方法,然後調用$this->_getResource()->save($this);,這將調用實體抽象保存方法,最終得到/app/code/core/Mage/Eav/Model/Entity/Abstract.php and its _beforeSave()方法,該方法調用walkAttributes($partMethod, array $args=array())方法。

只要所有屬性都加載了實體的資源對象, walkAttributes方法將遍歷與實體關聯的所有屬性,並調用此方法call_user_func_array(array($ instance,$ method),$ args);在我的情況下,它調用beforeSave方法的屬性,你可以在這裏看到

/app/code/core/Mage/Eav/Model/Entity/Attribute/Backend/Abstract.php 
public function beforeSave($object) 
    { 
     $attrCode = $this->getAttribute()->getAttributeCode(); 
     if (!$object->hasData($attrCode) && $this->getDefaultValue()) { 
      $object->setData($attrCode, $this->getDefaultValue()); 
     } 
    } 

所以不具有任何數據,並有一個默認值的任何屬性,默認值應用到對象,在意義上覆蓋我真正設置的數據並沒有加載到我的對象。我猜測循環數以千計的產品的最佳方式是將pageSize設置爲您的服務器可以處理加載的數字,然後您可以設置addAttributeToSelect('*')。但是我不知道最好的方法來正確地循環,因此對於我來說,我可能只是將產品加載到for循環中,而不是將屬性設置爲全選。

這是我嘗試在遍歷整個集合,請發表任何改進

$productCollection = Mage::getModel('catalog/product')->getCollection()->addAttributeToSelect('*')->setPageSize(200); 
for ($i = 1; $i <= $productCollection->getLastPageNumber(); $i++) { 
    if ($productCollection->isLoaded()) { 
     $productCollection->clear(); 
     $productCollection->setPage($i); 
     $productCollection->setPageSize(200); 
    } 
    foreach ($productCollection as $product) { 
     echo $product->getId() . "\n\n"; 
    } 
    echo $i . "\n\n"; 
} 

我想仍然聽到有這方面的其他投入,這是否是問題的正確的思維或解釋。

+0

我已經使用默認值測試了所有簡單產品屬性的此問題。事實證明,只有以下屬性受到影響:visibility和options_container。 – 2015-07-17 15:05:58