A paginação e a classificação não estão funcionando


10

Para o meu módulo personalizado, recebo o produto por fabricante. Para o modelo que eu copiei list.phtml.

No arquivo de modelo, a paginação aparece, mas mostra todo o produto, em vez do limite selecionado por página. A classificação também não está funcionando.

Como posso fazer funcionar?

É o meu arquivo de bloco:

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

Respostas:


2

Use o snippet abaixo para adicionar paginação e classificação à sua coleção personalizada. Para cada listagem de coleção personalizada, você também deve criar um pager personalizado da barra de ferramentas.

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

Depois disso, substitua

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

para exibir o pager inferior e a barra de ferramentas de classificação superior.

Para ordem de classificação, faça isso antes do carregamento da coleção:

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

Espero que isso resolva seu problema.


também é possível adicionar $ _productCollection-> setPageSize ($ itemsLimit) -> setCurPage ($ currPage);
Ahsan Horani 2/16

1

Você também deve usar os seguintes filtros:

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

Portanto, seu código completo se torna:

    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

Pode não ser a situação no seu caso, mas pode ajudar alguém que está tendo esse problema. Eu tive esse problema ao testar alterações personalizadas no getProductCollection().

Consegui corrigi-lo removendo o código de log que eu adicionei que anotava a contagem da coleção retornada. Acredito que tudo o que interroga a carga da coleção resulta no getProductCollection()método forçará a coleção a carregar seus produtos prematuramente e impedirá que modificações posteriores na ordem da coleção e na limitação do resultado sejam aplicadas aos controles de paginação.


1
Para ainda poder registrar a contagem da coleção sem carregar os itens da coleção, use $collection->getSize(). Ele executará uma separação SELECT COUNT(*)com os filtros de coleção atuais.
Jan Papenbrock

Obrigado @ Jan Papenbrock. Isso é útil. O ponto maior que eu estava tentando enfatizar permanece. Se você fizer com que a coleção seja carregada, ela interferirá na paginação e na classificação aplicadas posteriormente à coleção, caso não tenha sido carregada.
Matt B

0

Você deve substituir _prepareLayout()e definir os dados como abaixo do 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;
}

entre em contato se você tiver alguma dúvida.


ainda não está funcionando. depois de adicionar isso, exibe a tela branca.
Piyush

ele não vai apenas como copiar e colar amigo
Keyul Shah

0

Vá para a seção Gerenciar categoria e defina a opção Âncora como "Sim".

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.