Impaginazione e ordinamento non funzionanti


10

Per il mio modulo personalizzato ho ricevuto il prodotto dal produttore. Per il modello che ho copiato list.phtml.

Sul file modello appare l'impaginazione ma mostra tutto il prodotto anziché il limite selezionato per pagina. Anche l'ordinamento non funziona.

Come posso farlo funzionare ??

È il mio file di blocco:

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

Risposte:


2

Utilizza lo snippet di seguito per aggiungere impaginazione e ordinamento alla tua raccolta personalizzata. Per ogni elenco di raccolte personalizzate è necessario creare anche un cercapersone personalizzato sulla barra degli strumenti.

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

Dopo questo, sostituire

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

per visualizzare il cercapersone inferiore e la barra degli strumenti di ordinamento superiore.

Per l'ordinamento, eseguire questa operazione prima del caricamento della raccolta:

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

Spero che questo risolva il tuo problema.


inoltre puoi aggiungere $ _productCollection-> setPageSize ($ itemsLimit) -> setCurPage ($ currPage);
Ahsan Horani,

1

Devi usare anche i seguenti filtri:

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

Quindi il tuo codice completo diventa:

    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

Questa potrebbe non essere la situazione nel tuo caso, ma potrebbe aiutare qualcun altro a riscontrare questo problema. Ho riscontrato questo problema durante il test delle modifiche personalizzate in getProductCollection().

Sono stato in grado di risolverlo rimuovendo il codice di registrazione che avevo aggiunto che annotava il conteggio della raccolta restituita. Credo che tutto ciò che interroga i risultati del caricamento della raccolta nel getProductCollection()metodo costringerà la raccolta a caricare effettivamente i suoi prodotti prematuramente e impedirà l'applicazione di modifiche a valle all'ordinamento della raccolta e la limitazione dei risultati per i controlli di paging.


1
Per poter ancora registrare il conteggio delle raccolte senza caricare gli elementi della raccolta, utilizzare $collection->getSize(). Eseguirà un separato SELECT COUNT(*)con i filtri di raccolta correnti.
Jan Papenbrock,

Grazie @Jan Papenbrock. È utile. Il punto più grande che stavo cercando di chiarire rimane comunque. Se si causa il caricamento della raccolta, interferirà con il paging e l'ordinamento che verranno applicati in seguito alla raccolta se non è stata caricata.
Matt B

0

Devi sovrascrivere _prepareLayout()e impostare i dati come sotto lo snap.

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

fammi sapere se hai qualche domanda.


non funziona ancora. dopo averlo aggiunto visualizza una schermata bianca.
Piyush,

non sarà solo come copiare e incollare amico
Keyul Shah

0

Vai alla sezione Gestisci categoria e imposta l'opzione di ancoraggio su "Sì".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.