在magento中覆盖Mage_Catalog_Block_Product_List类时出现问题。我的目标是在Overriden Class中添加一些过滤器。我的代码
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;
}
我需要在过滤后将没有任何产品!
答案 0 :(得分:1)
大部分时间这是由于集合已经加载。
您必须知道Magento集合只加载一次(以保存数据库访问权限),因为底层_setIsLoaded
上有一个标记Varien_Data_Collection
,阻止您重新加载它。
你可以尝试做的是
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;
}