Paginación y clasificación no funciona

10

Para mi módulo personalizado tengo producto por fabricante. Para la plantilla que he copiado list.phtml.

En la plantilla aparece la paginación del archivo, pero muestra todos los productos en lugar del límite seleccionado por página. La clasificación tampoco funciona.

¿Cómo puedo hacer que funcione?

Es mi archivo de bloque:

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

Respuestas:

2

Use el fragmento a continuación para agregar paginación y clasificación en su colección personalizada. Para cada lista de colección personalizada, también debe crear un localizador de barra de herramientas personalizado.

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

Después de esto, reemplace

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

para mostrar el localizador inferior y la barra de herramientas de clasificación superior.

Para ordenar, haga esto antes de cargar la colección:

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

Espero que esto resuelva tu problema.

Ahsan Horani
fuente
también puede agregar $ _productCollection-> setPageSize ($ itemsLimit) -> setCurPage ($ currPage);
Ahsan Horani
1

También debe usar los siguientes filtros:

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

Entonces su código completo se convierte en:

    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;
    }
Ajay Bisht
fuente
1

Puede que esta no sea la situación en su caso, pero podría ayudar a alguien más que tenga este problema. Tuve este problema al probar cambios personalizados en getProductCollection().

Pude solucionarlo eliminando el código de registro que había agregado que señalaba el recuento de la colección devuelta. Creo que cualquier cosa que cuestione los resultados de la carga de la Colección en el getProductCollection()método obligará a la colección a cargar sus productos de forma prematura y evitará que se apliquen modificaciones posteriores al pedido de la colección y la limitación de los resultados para los controles de paginación.

Matt B
fuente
1
Para poder seguir registrando el recuento de la colección sin cargar los elementos de la colección, use $collection->getSize(). Realizará una separación SELECT COUNT(*)con los filtros de colección actuales.
Jan Papenbrock
Gracias @ Jan Papenbrock. Eso es útil. El punto más grande que estaba tratando de aclarar sigue siendo. Si hace que la colección se cargue, interferirá con la paginación y la clasificación que se aplicarán a la colección más adelante si no se ha cargado.
Matt B
0

Debe anular _prepareLayout()y establecer los datos como se muestra a continuación.

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

Avísame si tienes alguna consulta.

Keyul Shah
fuente
Todavía no funciona. después de agregar esto, muestra una pantalla en blanco.
Piyush
no solo querrá copiar y pegar amigo
Keyul Shah
0

Vaya a la sección Administrar categoría y establezca la opción de anclaje en "Sí".

usuario3917822
fuente