Magento ограничение количества возвращенных предметов в вызове коллекции продуктов
Я пытаюсь ограничить количество возвращенных результатов вручную в копии шаблона list.phtml, но его оказалось намного сложнее, чем я ожидал.
Ive попытался вручную установить размер коллекции, но я снова ничего не работаю. Может ли кто-нибудь показать мне, как это сделать? Было бы очень благодарно!
Ответы
Ответ 1
Быстрый способ с этим методом Недавно я обнаружил. Вы даже можете использовать его непосредственно в шаблоне.
$_productCollection = clone $this->getLoadedProductCollection();
$_productCollection->clear()
->setPageSize(3)
->load();
Ответ 2
Аналогичный подход к @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
node для создания поля, которое может быть отредактировано администратором без жесткого кодирования 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
Ответ 3
К сожалению, это не работает, потому что в методе _getProductCollection()
коллекция уже инициализирована с размером страницы.
Более гибким решением могло бы быть наблюдение события catalog_product_collection_load_before
, которое, как следует из названия, отправляется до загрузки коллекции.
Далее следует пример (предполагая, что в < <23 > записать расширение yourmodule
):
ШАГ 1: Определите своего наблюдателя в файле config.xml
в разделе global
вашего файла расширения 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;
}
}
Надеюсь, это поможет.
С уважением,
Алессандро Ронки
Ответ 4
У меня есть Code of User: clockworkgeek, но здесь есть некоторые проблемы, и правильный код выглядит следующим образом: он работает и благодарит clockworkgeek.
$_productCollection = $this->getLoadedProductCollection();
$_productCollection->clear();
$_productCollection->setPageSize(3)
$_productCollection->load();
Вы также пишете enter code here
или решите эту проблему, изменив ее как
$this->getLoadedProductCollection()->clear();
$_productCollection = $this->getLoadedProductCollection();
Спасибо,
Если это поможет вам прокомментировать.
Ответ 5
Похоже, что коллекция, возвращенная в 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;
}
Важная часть - найти способ определить, используете ли вы пользовательскую страницу list.phtml или нет. Затем вам нужно переопределить ссылки на <block type='catalog/product_list' />
в макетах с вашим классом, и вы должны быть настроены для перехода.
Надеюсь, что это поможет!
Спасибо,
Джо
Ответ 6
Как уже упоминалось, у 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;
Это то, о чем вы спрашивали?