Magento - 制作一个新的getProductCollection()函数

时间:2010-10-01 20:01:23

标签: magento

目前,如果我想获得某些产品系列,例如畅销产品,请直接在我的模板文件中使用以下内容:

$_productCollection = Mage::getResourceModel('reports/product_collection')
->addAttributeToSelect('name')
->addAttributeToFilter('visibility', $visibility)
->addOrderedQty()
->setOrder('ordered_qty', 'desc')
$_productCollection->load();

...然后使用foreach声明提取产品。

任何人都可以解释如何创建一个新的块,可以重复使用吗?我找到了一些例子,但他们总是从CMS页面调用产品列表,而我希望调用直接嵌入模板文件中的函数,我可以从任何地方调用。

所以假设我已经设置了我的模块,并在我的Block文件夹中设置了我的Bestseller.php文件。在其中,我想我把我的功能用于集合,类似于

protected function _getBestsellingCollection()
{
$_BestsellingCollection = Mage::getResourceModel('reports/product_collection')
->addAttributeToSelect('name')
->addAttributeToFilter('visibility', $visibility)
->addOrderedQty()
->setOrder('ordered_qty', 'desc');
$_BestsellingCollection->load();
}
public function getLoadedBestsellingCollection()
{
    return $this->_getBestsellingCollection();
}

如果是这样,我怎么从我的模板中调用它?有点像?

$_productCollection = $this->getLoadedBestsellingCollection()

任何帮助,或指向体面教程的指示,非常感谢!

更新

我越来越近了,但我在扩展 Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection 类时遇到了麻烦。如果我将我的代码添加到 Collection.php 文件的末尾,例如

public function addBestSelling()
{
$this->addAttributeToSelect('*')->addOrderedQty()->setOrder('ordered_qty', 'desc'); 
return $this;
}

然后使用

$_productCollection = Mage::getResourceModel('reports/product_collection')->addBestSelling();

在我的phtml模板文件中,它运行正常。但是,如果我将该代码分成我的 Bestseller.php ,则在我的模块的Models文件夹中,就像这样

class Samsmodule_FeaturedProducts_Model_Bestseller extends Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection
{
public function addBestSelling()
{
    $this->addAttributeToSelect('*')->addOrderedQty()->setOrder('ordered_qty', 'desc');
    return $this;
}
}

然后尝试使用以下内容,我得到一个错误,页面没有完成加载(没有错误信息)

$_productCollection = Mage::getResourceModel('featuredproducts/bestseller')
->addMostViewed();

我错过了什么?

1 个答案:

答案 0 :(得分:1)

块用于呈现HTML。每个块对象都有一个phtml模板对象。当您使用phtml模板中的$this时,您将引用包含块对象。

这听起来并不像是在呈现HTML。听起来您想要在任何块/模板中获取使用的特定产品列表。

如果上述假设是正确的,那么您需要创建一个新的Model Collection类来扩展

返回的对象的类,而不是创建一个新的Block。
Mage::getResourceModel('reports/product_collection').  

将您的方法添加到该类,并使用类似

的方法调用它
Mage::getResourceModel('mymodule/my_collectionclass')-> getLoadedBestsellingCollection()