2015-05-29 82 views
1

當在magento中覆蓋Mage_Catalog_Block_Product_List類時,出現問題。我的目標是在Overriden Class中添加一些過濾器。我的代碼magento上的addAttributeToFilter返回不正確

public function getLoadedProductCollection() 
{ 
    $collection = parent::_getProductCollection(); 
    $collection->addAttributeToFilter('model', array('eq' => 'coucu')); 

    var_dump($collection->count()); // return 1 (incorrect) 
    var_dump($collection->getData()); // return empty (correct) 
    return $collection; 
} 

我需要過濾器後將沒有任何產品!

回答

1

大多數情況下,這是由於該集合已被加載。 你必須知道,Magento集合只加載一次(以節省數據庫訪問),因爲在下墊Varien_Data_Collection上有一個標誌_setIsLoaded,阻止你重新加載它。

什麼,你可以嘗試做的是

public function getLoadedProductCollection() 
{ 
    $collection = parent::_getProductCollection(); 
    var_dump($collection->isLoaded()); 
    return $collection; 
} 

如果已經做了你一個true,這意味着你的收集已經加載顯示和你addAttributeToFilter永遠不會被執行。而且它將會是這種情況,因爲這個功能沒有理由不叫getLoadedProductCollection

有兩種方法可以解決這個問題。
最好的:覆蓋setCollection代替

public function setCollection($collection) 
{ 
    $this->_productCollection = $collection; 
    $this->_productCollection->addAttributeToFilter('model', array('eq' => 'coucu')); 
    return $this; 
} 

的並不好,因爲這樣您的收藏會被重複加載及附加你的數據庫:

public function getLoadedProductCollection() 
{ 
    $collection = parent::_getProductCollection(); 
    $collection->clear(); 
    // this resets the _isLoaded flag 
    /** @see Varien_Data_Collection::clear() */ 
    $collection->addAttributeToFilter('model', array('eq' => 'coucu')); 
    return $collection; 
}