【问题标题】:addAttributeToFilter on magento return incorrectmagento 上的 addAttributeToFilter 返回不正确
【发布时间】:2015-05-29 14:27:51
【问题描述】:

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

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

【问题讨论】:

    标签: magento


    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      • 1970-01-01
      相关资源
      最近更新 更多