我成功运行了这个查询:
$_productCollection = Mage::getResourceModel('reports/product_collection')
->addAttributeToSelect('*')
->setOrder('created_at', 'desc')
->setPage(1, 5);
但是当我添加
->addCategoryFilter('3')
我收到以下错误:
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
它运行的块定义为
<block type="catalog/product_list" name="catalog.right.bestsellers" template="catalog/navigation/right.phtml"/>
在catalog.xml
答案 0 :(得分:9)
这涵盖1.4.2。根据您的错误,我认为您运行的是较旧的版本,但错误的根本原因应该是相同的。
类别名reports/product_collection
解析为
Mage_Reports_Model_Mysql4_Product_Collection
在资源模式上下文中。班级Mage_Reports_Model_Mysql4_Product_Collection
是Mage_Catalog_Model_Resource_Eav_Mysql4_Collection_Abstract
的孩子。 addCategoryFilter
上的Mage_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;
}
请注意,在1.4.2中,在参数中进行了一些类型检查
public function addCategoryFilter(Mage_Catalog_Model_Category $category)
我怀疑你的版本没有检查。因此,它到达
时失败$this->_productLimitationFilters['category_id'] = $category->getId();
你传入一个字符串,然后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);
答案 1 :(得分:1)
addCategoryFilter()
的参数必须是Mage_Catalog_Model_Category
类型的对象。