Предел сбора продуктов Magento через XML - PullRequest
2 голосов
/ 05 августа 2011

У меня есть модуль бестселлеров, который я написал, и он прекрасно работает, однако я хочу иметь возможность изменять размер коллекции, которую он возвращает через XML, а не через php / phtml.

Примерно так:

    <block type="catalog/product_list" name="bestsellers" limit="3" 
template="custom/bestsellers.phtml" />

или что-то вроде:

    <block type="catalog/product_list" name="bestsellers" 
template="custom/bestsellers.phtml">
         <action method="setLimit">3</action>
    </block>

Возможно ли это?

В настоящее время я изменяю лимит через phtml с помощью:

->setPageSize(3)
->setCurPage(1);

Но это жестко и неприятно, мне нужно иметь возможность использовать мой файл phtml в качестве шаблона для многих случаев, когда модуль бестселлеров вызывается из любой точки мира с ограничением XML + в XML.

Заранее спасибо, если кто-нибудь может пролить свет на это!

1 Ответ

4 голосов
/ 06 августа 2011

Блок Mage_Catalog_Block_Product_List наследуется от класса Varien_Object, который содержит методы getData() и setData(), а также магические методы get*() и set*().Эти методы позволяют нам хранить (как вы уже догадались) ключевые данные в объекте.

Теги <action /> в XML позволяют нам выполнять вызовы методов для экземпляров блока.Вы почти там со своим вторым примером, но синтаксис:

<block type="catalog/product_list" name="bestsellers">
    <action method="setLimit"><value>3</value></action>
</block>

Что эквивалентно:

<block type="catalog/product_list" name="bestsellers">
    <action method="setData"><key>limit</key><value>3</value></action>
</block>

Что примерно эквивалентно:

$block = new Mage_Catalog_Block_Product_List();
$block->setLimit(3);

С набором данных в объекте мы теперь можем получить доступ через методы getData() или get*(), вызвав $this->getLimit() или $this->getData('limit'), создав наш код блока:

->setPageSize($this->getLimit())
->setCurPage(1);

Возможно, вам следуетсначала выполните проверку на наличие данных limit и укажите значение по умолчанию, если в XML не указано ни одного.

Примечание : имя дочерних элементов в <action />тег не имеет значения.Это порядок аргументов, которые важны.С таким же успехом мы могли бы позвонить <action method="setLimit"><foo>3</foo></action>, и это все равно сработало бы.

...