Я пытаюсь ограничить количество возвращенных результатов вручную в копии шаблона list.phtml, но его оказалось намного сложнее, чем я ожидал.
Ive попытался вручную установить размер коллекции, но я снова ничего не работаю. Может ли кто-нибудь показать мне, как это сделать? Было бы очень благодарно!
Быстрый способ заключается в этом методе, который я недавно обнаружил . Вы даже можете использовать его непосредственно в шаблоне.
$_productCollection = clone $this->getLoadedProductCollection(); $_productCollection->clear() ->setPageSize(3) ->load();
Аналогичный подход к @joseph заключается в переопределении Mage_Catalog_Block_Product_List
но вставьте следующий код в новый класс:
const PAGE_SIZE = 3; protected function _getProductCollection(){ $collection = parent::_getProductCollection(); $yourCustomBoolean = someFunctionThatDetectsYourCustomPage(); if($yourCustomBoolean) { $collection->setPageSize(self::PAGE_SIZE); } return $collection; }
таким образом вы наследуете любые будущие изменения в коде Mage_Catalog из родительского блока, но все же устанавливаете лимиты своей страницы.
В идеале вы должны использовать узел system.xml
для создания поля, которое может быть отредактировано администратором без жесткого кодирования page_size. Xml будет выглядеть примерно так:
<config> <sections> <catalog> <groups> <frontend> <fields> <custom_page_size translate="label"> <label>Page Size for Custom Page Type</label> <frontend_type>text</frontend_type> <sort_order>9999</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>1</show_in_store> </custom_page_size> </fields> </frontend> </groups> </catalog> </sections> </config>
Затем верните это значение в свой код с помощью:
$page_size = Mage::getStoreConfig('catalog/frontend/custom_page_size');
НТН,
JD
к сожалению, это не работает, потому что в _getProductCollection()
коллекция уже была инициализирована размером страницы.
Более гибким решением может быть наблюдение за событием catalog_product_collection_load_before
которое, как следует из названия, отправляется до загрузки коллекции.
Ниже приведен пример (предполагая написать расширение yourpackage
под yourpackage
):
ШАГ 1: Определите своего наблюдателя в файле config.xml
в global
секции вашего config.xml
расширения config.xml
вставьте что-то вроде:
<events> <catalog_product_collection_load_before> <observers> <yourpackage_yourmodule_catalog_observer> <type>singleton</type> <class>yourpackage_yourmodule/catalog_observer</class> <method>limitPageSize</method> </yourpackage_yourmodule_catalog_observer> </observers> </catalog_product_collection_load_before> </events>
ШАГ 2: Определите свой класс Observer в папке Model\Catalog
:
<?php class Yourpackage_Yourmodule_Model_Catalog_Observer { public function limitPageSize($observer) { #TODO: Insert the logic you need to differentiate when to apply the following $event = $observer->getEvent(); $collection = $event->getCollection(); $collection->setPageSize(3); return $this; } }
Надеюсь, поможет. С уважением, Алессандро Рончи
Я получил код пользователя: clockworkgeek, но вот некоторая проблема и правильный код, как следует, он работает и благодарит clockworkgeek.
$_productCollection = $this->getLoadedProductCollection(); $_productCollection->clear(); $_productCollection->setPageSize(3) $_productCollection->load();
Вы также можете написать enter code here
или решить эту проблему, изменив как
$this->getLoadedProductCollection()->clear(); $_productCollection = $this->getLoadedProductCollection();
Спасибо, если это поможет вам тогда прокомментировать.
Похоже, что коллекция, возвращаемая в list.phtml, уже вызвала load (), что означает, что к моменту получения шаблона мы потеряли возможность установить размер страницы. Итак, это будет немного грязно!
Блок, который генерирует эту коллекцию, представляет собой Mage_Catalog_Block_Product_List
, который мы можем расширить с помощью нашего собственного класса и переопределить в одно и то же время. Создайте новый блок, который расширяет Mage_Catalog_Block_Product_List
и переопределяет метод _getProductCollection
следующим образом:
/** * Retrieve loaded category collection * * @return Mage_Eav_Model_Entity_Collection_Abstract */ protected function _getProductCollection() { if (is_null($this->_productCollection)) { $layer = Mage::getSingleton('catalog/layer'); /* @var $layer Mage_Catalog_Model_Layer */ if ($this->getShowRootCategory()) { $this->setCategoryId(Mage::app()->getStore()->getRootCategoryId()); } // if this is a product view page if (Mage::registry('product')) { // get collection of categories this product is associated with $categories = Mage::registry('product')->getCategoryCollection() ->setPage(1, 1) ->load(); // if the product is associated with any category if ($categories->count()) { // show products from this category $this->setCategoryId(current($categories->getIterator())); } } $origCategory = null; if ($this->getCategoryId()) { $category = Mage::getModel('catalog/category')->load($this->getCategoryId()); if ($category->getId()) { $origCategory = $layer->getCurrentCategory(); $layer->setCurrentCategory($category); } } $this->_productCollection = $layer->getProductCollection(); $this->prepareSortableFieldsByCategory($layer->getCurrentCategory()); // OUR CODE MODIFICATION //////////////////// $yourCustomPage = someFunctionThatDetectsYourCustomPage(); if($yourCustomPage) { $this->_productCollection->setPageSize(1); $this->_productCollection->setCurPage(3); $this->_productCollection->load(); } ///////////////////////////////////////////// if ($origCategory) { $layer->setCurrentCategory($origCategory); } } return $this->_productCollection; }
-/** * Retrieve loaded category collection * * @return Mage_Eav_Model_Entity_Collection_Abstract */ protected function _getProductCollection() { if (is_null($this->_productCollection)) { $layer = Mage::getSingleton('catalog/layer'); /* @var $layer Mage_Catalog_Model_Layer */ if ($this->getShowRootCategory()) { $this->setCategoryId(Mage::app()->getStore()->getRootCategoryId()); } // if this is a product view page if (Mage::registry('product')) { // get collection of categories this product is associated with $categories = Mage::registry('product')->getCategoryCollection() ->setPage(1, 1) ->load(); // if the product is associated with any category if ($categories->count()) { // show products from this category $this->setCategoryId(current($categories->getIterator())); } } $origCategory = null; if ($this->getCategoryId()) { $category = Mage::getModel('catalog/category')->load($this->getCategoryId()); if ($category->getId()) { $origCategory = $layer->getCurrentCategory(); $layer->setCurrentCategory($category); } } $this->_productCollection = $layer->getProductCollection(); $this->prepareSortableFieldsByCategory($layer->getCurrentCategory()); // OUR CODE MODIFICATION //////////////////// $yourCustomPage = someFunctionThatDetectsYourCustomPage(); if($yourCustomPage) { $this->_productCollection->setPageSize(1); $this->_productCollection->setCurPage(3); $this->_productCollection->load(); } ///////////////////////////////////////////// if ($origCategory) { $layer->setCurrentCategory($origCategory); } } return $this->_productCollection; }
Важная часть – найти способ определить, используете ли вы пользовательскую страницу list.phtml или нет. Затем вам нужно будет переопределить ссылки на <block type='catalog/product_list' />
в макетах с вашим классом, и вы должны быть настроены для перехода.
Надеюсь, это поможет!
Спасибо, Джо
Как уже упоминалось, в productCollection
уже установлен размер страницы. Есть еще один способ получить коллекцию; через catalog/product
Модель:
$productCollection = Mage::getModel('catalog/product') ->getCollection() ->addAttributeToSelect( array('name', 'image', 'price') ) ->addIdFilter( array('1', '2') ) ->setPageSize( 2 ) ->load(); ; return $productCollection->getSelect()->__toString();
Полученный запрос (и, в конечном счете, объект ) содержит синтаксис LIMIT:
SELECT `e`.* ... WHERE (`e`.`entity_id` IN('1', '2')) LIMIT 2;
Это то, о чем вы спрашивали?