Intereting Posts
Использование функции «Кодификатор эвакуации» Удаление строки таблицы mySQL с помощью jQuery Ajax mysql_fetch_assoc (): предоставленный аргумент не является допустимым ресурсом результатов MySQL Создание WSDL при использовании собственного класса SOAP PHP? Кодовое завершение / помощь для встроенных функций PHP в Eclipse PDT PHP / Curl: проверка заголовков ответов перед загрузкой тела Как включить сжатие gzip с помощью PHP Simple HTML DOM Parser Удалить index.php в CodeIgniter_2.1.4 Предупреждение: Отсутствует 1 аргумент Как обнаружить и удалить ненужные атрибуты xmlns: <something> в PHP DOM? Что такое прокручиваемый курсор PDO? Как избежать нежелательной переносимости сеанса между различными экземплярами приложения Получить цену товара на рынке сообщества Steam с помощью PHP и Regex как получить только нулевой счетчик элементов в массиве php Сжатие текста перед его сохранением в базе данных

magento ограничение количества возвращенных предметов в вызове коллекции продуктов

Я пытаюсь ограничить количество возвращенных результатов вручную в копии шаблона 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; 

Это то, о чем вы спрашивали?