magento上的addAttributeToFilter返回错误

时间:2015-05-29 14:27:52

标签: magento

在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;
}

我需要在过滤后将没有任何产品!

1 个答案:

答案 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;
}