Пагинація та сортування не працюють


10

Для мого спеціального модуля я маю отримати товар від виробника. Для шаблону я скопіював list.phtml.

На файлі шаблону з'являється сторінка, але вона відображає весь продукт замість вибраного обмеження на сторінку. Сортування теж не працює.

Як я можу змусити його працювати ??

Це мій файл блоку:

protected function _getProductCollection() 
{
    if (is_null($this->_productCollection)) {
        $layer = $this->getLayer();
        $brand_id = $this->getRequest()->getParam('id');
        $collection = Mage::getModel('catalog/product')->getCollection();
        $collection->addAttributeToSelect('*');
        $collection->addFieldToFilter(array(
            array('attribute' => 'manufacturer', 'eq' => $brand_id)
        ));
    }

    return $collection;
}

Відповіді:


2

Використовуйте фрагмент нижче, щоб додати сторінки та сортування у вашій користувацькій колекції. Для кожного списку спеціальних колекцій також потрібно створити користувацький пейджер панелі інструментів.

    $itemsLimit         =   $_GET["limit"] ? $_GET["limit"] : Mage::getStoreConfig('catalog/frontend/grid_per_page');   //Set items to show per page
    $currPage               =   $_GET["p"] ? $_GET["p"] : 1;                //Set current page      
   /*   Set Pagination for Custom Loaded Collection */                              
    $toolbar = Mage::getBlockSingleton('catalog/product_list')->getToolbarBlock();
    $toolbar->setCollection($_productCollection);

    /*  Set Pager   */
    $pager = $this->getLayout()->createBlock('page/html_pager', 'custom.pager');
    $pager->setAvailableLimit(array($itemsLimit=>$itemsLimit));
    $pager->setCollection($_productCollection);
    $toolbar->setChild('product_list_toolbar_pager', $pager);
    $toolbar->setData('_current_limit', $itemsLimit);

Після цього замініть

$this->getToolbarHtml(); by $toolbar->toHtml(); 

для відображення нижнього пейджера та верхньої панелі інструментів сортування.

Для сортування порядку виконайте це перед завантаженням колекції:

$_productCollection->addAttributeToSort($_GET["order"], $_GET["dir"]');

Я сподіваюся, що це вирішить вашу проблему.


також ви можете додати $ _productCollection-> setPageSize ($ itemsLimit) -> setCurPage ($ currPage);
Ахсан Хорані

1

Ви також повинні використовувати такі фільтри:

    ->addAttributeToSort($_GET['order'],$_GET['dir'] )
    ->setPageSize($limit)
    ->setCurPage($_GET['p'])

Тож ваш повний код стає:

    protected function _getProductCollection() 
    {
        if (is_null($this->_productCollection)) 
        {
            $layer = $this->getLayer();
            $brand_id = $this->getRequest()->getParam('id');
            $collection = Mage::getModel('catalog/product')->getCollection();
            $collection->addAttributeToSelect('*');
            $collection->addFieldToFilter(array(array('attribute'=>'manufacturer','eq'=>$brand_id),
    ))
$collection->addAttributeToSort($_GET['order'],$_GET['dir'] );
    $collection->setPageSize($_GET['limit']);
    $collection->setCurPage($_GET['p']);



        }

        return $collection;
    }

1

Це може бути не у вашому випадку, але це може допомогти іншому, хто має цю проблему. У мене виникла ця проблема під час тестування користувацьких змін у getProductCollection().

Я зміг це виправити, видаливши код реєстрації, який я додав, що відзначав кількість повернутої колекції. Я вважаю, що все, що опитує результати завантаження колекції в getProductCollection()методі, змусить колекцію фактично передчасно завантажувати свої продукти, а також запобігає застосуванню модифікацій впорядкування колекції та обмеження результатів, застосованих до елементів керування пейджингом.


1
Щоб все-таки мати можливість записувати кількість колекцій, не завантажуючи предмети колекції, використовуйте $collection->getSize(). Він виконає окрему SELECT COUNT(*)з поточними фільтрами колекції.
Ян Папенброк

Дякую @Jan Papenbrock Це зручно. Більш важливий момент я намагався зробити, хоча залишається. Якщо ви змусите колекцію завантажуватися, вона буде перешкоджати підкачці і сортування, які будуть застосовані до колекції пізніше, якщо вона не була завантажена.
Метт Б

0

Ви повинні перекрити _prepareLayout()та встановити дані, як показано нижче.

protected function _prepareLayout()
{
    parent::_prepareLayout();
    $pager = $this->getLayout()->createBlock('page/html_pager')->setCollection($this->getDatasets());
    $this->setChild('pager', $pager);
    $this->getDatasets()->load();
    return $this;
}

дайте мені знати, якщо у вас є запити.


він все ще не працює. після додавання цього виводиться білий екран.
Піюш

це не просто сподобається копіювати та вставляти приятеля
Кейул Шах

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.