目前,如果我想获得某些产品系列,例如畅销产品,请直接在我的模板文件中使用以下内容:
$_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();
我错过了什么?
答案 0 :(得分:1)
块用于呈现HTML。每个块对象都有一个phtml模板对象。当您使用phtml模板中的$this
时,您将引用包含块对象。
这听起来并不像是在呈现HTML。听起来您想要在任何块/模板中获取使用的特定产品列表。
如果上述假设是正确的,那么您需要创建一个新的Model Collection类来扩展
返回的对象的类,而不是创建一个新的Block。Mage::getResourceModel('reports/product_collection').
将您的方法添加到该类,并使用类似
的方法调用它Mage::getResourceModel('mymodule/my_collectionclass')-> getLoadedBestsellingCollection()