Magento - создание новой функции getProductCollection () - PullRequest
3 голосов
/ 02 октября 2010

В настоящее время, если я хочу получить определенную коллекцию продуктов, например, бестселлеров, я использую следующее, прямо в файле шаблона:

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

... и затем вытаскиваюпродукты с оператором foreach.

Может кто-нибудь объяснить, как создать для этого новый блок, который можно использовать повторно?Я нашел несколько примеров, но они всегда вызывают список продуктов со страницы CMS, тогда как я хочу, чтобы вызов функции был встроен непосредственно в файл шаблона, который я могу вызвать из любого места.

Итак, предположим, что у меня настроен модуль и файл 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 Ответ

1 голос
/ 02 октября 2010

Блоки для рендеринга HTML.Каждый блочный объект имеет объект шаблона phtml.Когда вы используете $this из шаблона phtml, вы возвращаетесь к содержащемуся в нем объекту блока.

Звучит не так, как будто вы визуализируете HTML.Похоже, вы хотите получить определенный список продуктов, чтобы использовать в любом блоке / шаблоне.

Если приведенные выше предположения верны, вместо создания нового блока вы хотите создатьновый класс Model Collection, расширяющий класс объекта, возвращаемого

Mage::getResourceModel('reports/product_collection').  

Добавьте ваш метод к этому классу и вызовите его с чем-то вроде

Mage::getResourceModel('mymodule/my_collectionclass')-> getLoadedBestsellingCollection()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...