Разбивка на страницы и сортировка не работает

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;
}
Piyush
источник

Ответы:

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(*)с текущими фильтрами коллекции.
Ян Папенброк
Спасибо @Джан Папенброк. Это удобно. Большая мысль, которую я пытался подчеркнуть, остается. Если вы заставите коллекцию загружаться, это помешает подкачке и сортировке, которые применяются к коллекции позже, если она не была загружена.
Мэтт Б
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;
}

дайте мне знать, если у вас есть запрос.

Кейул Шах
источник
это все еще не работает. после добавления отображается белый экран.
Пиюш
это не будет просто копировать и вставлять приятель
Кейул Шах
0

Перейдите в раздел «Управление категориями» и установите для параметра «Якорь» значение «Да».

user3917822
источник