Paginierung und Sortierung funktionieren nicht


10

Für mein kundenspezifisches Modul habe ich Produkt vom Hersteller erhalten. Für Vorlage habe ich kopiert list.phtml.

In der Vorlagendatei wird eine Paginierung angezeigt, die jedoch alle Produkte anstelle des ausgewählten Limits pro Seite anzeigt. Das Sortieren funktioniert auch nicht.

Wie kann ich es zum Laufen bringen?

Es ist meine Blockdatei:

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

Antworten:


2

Verwenden Sie das folgende Snippet, um Ihrer benutzerdefinierten Sammlung Paginierung und Sortierung hinzuzufügen. Für jede benutzerdefinierte Sammlungsliste müssen Sie auch einen benutzerdefinierten Symbolleisten-Pager erstellen.

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

Danach ersetzen

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

um den unteren Pager und die obere Sortiersymbolleiste anzuzeigen.

Führen Sie die Sortierreihenfolge vor dem Laden der Sammlung aus:

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

Ich hoffe das löst dein Problem.


Sie können auch $ _productCollection-> setPageSize ($ itemsLimit) -> setCurPage ($ currPage) hinzufügen.
Ahsan Horani

1

Sie müssen auch folgende Filter verwenden:

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

So wird Ihr vollständiger Code:

    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

Dies ist in Ihrem Fall möglicherweise nicht der Fall, kann jedoch jemand anderem helfen, der dieses Problem hat. Ich hatte dieses Problem beim Testen von benutzerdefinierten Änderungen in getProductCollection().

Ich konnte das Problem beheben, indem ich den hinzugefügten Protokollcode entfernte, der die Anzahl der zurückgegebenen Sammlungen notierte. Ich glaube, dass alles, was die Ergebnisse der Sammlungsladung in der getProductCollection()Methode abfragt, die Sammlung dazu zwingt, ihre Produkte tatsächlich vorzeitig zu laden, und verhindert, dass nachgelagerte Änderungen an der Sammlungsreihenfolge und Ergebnisbeschränkungen für die Paging-Steuerelemente angewendet werden.


1
Verwenden Sie, um die Anzahl der Sammlungen weiterhin zu protokollieren, ohne die Sammlungselemente zu laden $collection->getSize(). Es wird eine separate SELECT COUNT(*)mit aktuellen Erfassungsfiltern durchgeführt.
Jan Papenbrock

Danke @Jan Papenbrock. Das ist praktisch. Der größere Punkt, den ich ansprechen wollte, bleibt jedoch bestehen. Wenn Sie veranlassen, dass die Sammlung geladen wird, beeinträchtigt dies das Paging und Sortieren, die später auf die Sammlung angewendet werden, wenn sie nicht geladen wurde.
Matt B

0

Sie müssen das überschreiben _prepareLayout()und die Daten wie folgt einstellen.

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

Lassen Sie mich wissen, wenn Sie Fragen haben.


es funktioniert immer noch nicht. Nach dem Hinzufügen wird ein weißer Bildschirm angezeigt.
Piyush

Es wird nicht nur wie Kopieren und Einfügen Kumpel
Keyul Shah

0

Gehen Sie zum Abschnitt Kategorie verwalten und setzen Sie die Ankeroption auf "Ja".

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.