Nie działa podział na strony ani sortowanie


10

Do mojego modułu niestandardowego dostaję produkt według producenta. Dla szablonu skopiowałem list.phtml.

W pliku szablonu pojawia się paginacja, ale pokazuje on cały produkt zamiast wybranego limitu na stronę. Sortowanie też nie działa.

Jak mogę to zrobić?

To jest mój plik blokowy:

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;
}

Odpowiedzi:


2

Użyj poniższego fragmentu, aby dodać podział na strony i sortowanie w swojej kolekcji niestandardowej. Dla każdej niestandardowej listy kolekcji musisz również utworzyć niestandardowy pager na pasku narzędzi.

    $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);

Następnie wymień

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

aby wyświetlić dolny pager i górny pasek narzędzi sortowania.

Aby uporządkować sortowanie, zrób to przed załadowaniem kolekcji:

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

Mam nadzieję, że to rozwiąże twój problem.


możesz także dodać $ _productCollection-> setPageSize ($ itemsLimit) -> setCurPage ($ currPage);
Ahsan Horani

1

Musisz także użyć następujących filtrów:

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

Twój pełny kod staje się:

    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

Może nie być tak w twoim przypadku, ale może pomóc komuś, kto ma ten problem. Miałem ten problem podczas testowania niestandardowych zmian w getProductCollection().

Byłem w stanie to naprawić, usuwając dodany kod rejestrujący, który odnotował liczbę zwróconej kolekcji. Wierzę, że wszystko, co przesłuchuje ładowanie kolekcji, powoduje, że getProductCollection()metoda zmusi kolekcję do faktycznego przedwczesnego załadowania swoich produktów i zapobiegnie dalszym modyfikacjom kolejności kolekcji i ograniczeniu wyników dla kontroli stronicowania.


1
Aby nadal móc rejestrować liczbę kolekcji bez ładowania elementów kolekcji, użyj $collection->getSize(). Wykona osobne SELECT COUNT(*)z bieżącymi filtrami zbierania.
Jan Papenbrock

Dzięki @Jan Papenbrock. To jest przydatne. Większy punkt, który starałem się przedstawić, pozostaje. Jeśli spowoduje to załadowanie kolekcji, będzie ona zakłócać stronicowanie i sortowanie, które zostaną zastosowane do kolekcji później, jeśli nie zostanie załadowana.
Matt B

0

Musisz przesłonić _prepareLayout()i ustawić dane jak poniżej.

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

daj mi znać, jeśli masz jakieś zapytanie.


wciąż nie działa. po dodaniu wyświetla biały ekran.
Piyush,

nie tylko polubisz i wkleisz znajomego
Keyul Shah,

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.