2015-05-29 76 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; 
}