La pagination et le tri ne fonctionnent pas


10

Pour mon module personnalisé, j'ai un produit par fabricant. Pour le modèle que j'ai copié list.phtml.

Sur le fichier modèle, la pagination apparaît mais elle montre tous les produits au lieu de la limite sélectionnée par page. Le tri ne fonctionne pas trop.

Comment puis-je le faire fonctionner ??

C'est mon fichier de blocage:

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

Réponses:


2

Utilisez l'extrait ci-dessous pour ajouter la pagination et le tri à votre collection personnalisée. Pour chaque liste de collection personnalisée, vous devez également créer un pager de barre d'outils personnalisé.

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

Après cela, remplacez

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

pour afficher le téléavertisseur inférieur et la barre d'outils de tri supérieure.

Pour l'ordre de tri, procédez comme suit avant le chargement de la collecte:

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

J'espère que cela résout votre problème.


vous pouvez également ajouter $ _productCollection-> setPageSize ($ itemsLimit) -> setCurPage ($ currPage);
Ahsan Horani

1

Vous devez également utiliser les filtres suivants:

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

Ainsi, votre code complet devient:

    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

Ce n'est peut-être pas le cas dans votre cas, mais cela pourrait aider quelqu'un d'autre qui a ce problème. J'ai rencontré ce problème lors du test des modifications personnalisées dans getProductCollection().

J'ai pu le corriger en supprimant le code de journalisation que j'avais ajouté qui notait le nombre de la collection retournée. Je crois que tout ce qui interroge les résultats de la charge de collecte dans la getProductCollection()méthode forcera la collection à charger ses produits prématurément et empêchera les modifications en aval de l'ordre de collecte et la limitation des résultats d'être appliquées pour les contrôles de pagination.


1
Pour pouvoir toujours enregistrer le nombre de collectes sans charger les éléments de collection, utilisez $collection->getSize(). Il effectuera une séparation SELECT COUNT(*)avec les filtres de collection actuels.
Jan Papenbrock

Merci @Jan Papenbrock. C'est bien pratique. Le point le plus important que j'essayais de faire demeure cependant. Si vous provoquez le chargement de la collection, cela interférera avec la pagination et le tri qui seront appliqués à la collection ultérieurement si elle n'a pas été chargée.
Matt B

0

Vous devez remplacer le _prepareLayout()et définir les données comme ci-dessous.

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

faites-moi savoir si vous avez des questions.


cela ne fonctionne toujours pas. après avoir ajouté cela, il affiche un écran blanc.
Piyush

il ne sera pas juste comme copain copier-coller
Keyul Shah

0

Accédez à la section Gérer la catégorie et définissez l'option d'ancrage sur "Oui".

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.