Magento - addCategoryFilter抛出错误

use*_*772 1 magento magento-1.4

我成功运行了这个查询:

 $_productCollection = Mage::getResourceModel('reports/product_collection')
                        ->addAttributeToSelect('*')
                        ->setOrder('created_at', 'desc')
                        ->setPage(1, 5);
Run Code Online (Sandbox Code Playgroud)

但是当我补充说

->addCategoryFilter('3')
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Fatal error: Call to a member function getId() on a non-object in /home/sitename/public_html/app/code/core/Mage/Catalog/Model/Resource/Eav/Mysql4/Product/Collection.php on line 556
Run Code Online (Sandbox Code Playgroud)

它运行的块定义为

<block type="catalog/product_list" name="catalog.right.bestsellers" template="catalog/navigation/right.phtml"/>
Run Code Online (Sandbox Code Playgroud)

在catalog.xml

Ala*_*orm 9

这涵盖了1.4.2.根据您的错误,我认为您运行的是较旧的版本,但错误的根本原因应该是相同的.

类别名reports/product_collection解析为

Mage_Reports_Model_Mysql4_Product_Collection
Run Code Online (Sandbox Code Playgroud)

在资源模式上下文中.这个班Mage_Reports_Model_Mysql4_Product_Collection是孩子的Mage_Catalog_Model_Resource_Eav_Mysql4_Collection_Abstract.在addCategoryFilterMage_Catalog_Model_Resource_Eav_Mysql4_Collection_Abstract看起来是这样的

public function addCategoryFilter(Mage_Catalog_Model_Category $category)
{
    $this->_productLimitationFilters['category_id'] = $category->getId();
    if ($category->getIsAnchor()) {
        unset($this->_productLimitationFilters['category_is_anchor']);
    }
    else {
        $this->_productLimitationFilters['category_is_anchor'] = 1;
    }

    ($this->getStoreId() == 0)? $this->_applyZeroStoreProductLimitations() : $this->_applyProductLimitations();

    return $this;
}
Run Code Online (Sandbox Code Playgroud)

请注意,在1.4.2中,参数中会进行一些类型检查

public function addCategoryFilter(Mage_Catalog_Model_Category $category)
Run Code Online (Sandbox Code Playgroud)

我怀疑你的版本没有那个检查.因此,它到达时失败

$this->_productLimitationFilters['category_id'] = $category->getId();
Run Code Online (Sandbox Code Playgroud)

你传入一个字符串,然后Magento试图调用getId字符串.这就是你得到错误的原因.

Magento希望您传入类别对象,而不是类别ID.试一试

$category = Mage::getModel('catalog/category')->load(3);
$p = Mage::getResourceModel('reports/product_collection')
            ->addAttributeToSelect('*')
            ->setOrder('created_at', 'desc')
            ->addCategoryFilter($category)
            ->setPage(1, 5);
Run Code Online (Sandbox Code Playgroud)