分页和排序不起作用


10

对于我的自定义模块,我已按制造商提供产品。对于模板,我已复制list.phtml

在模板文件上出现分页,但它显示所有产品,而不是每页选择的限制。排序也不起作用。

我该如何运作?

这是我的阻止文件:

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

Answers:


2

使用以下代码片段在您的自定义集合上添加分页和排序。对于每个自定义集合列表,您还必须创建自定义工具栏寻呼程序。

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

之后,更换

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

显示底部分页器和顶部排序工具栏。

对于排序顺序,请在收集加载之前执行以下操作:

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

我希望这可以解决您的问题。


也可以添加$ _productCollection-> setPageSize($ itemsLimit)-> setCurPage($ currPage);
Ahsan Horani

1

您还必须使用以下过滤器:

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

因此,您的完整代码将变为:

    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

这可能不是您的情况,但可能会帮助遇到此问题的其他人。在测试中的自定义更改时遇到了这个问题getProductCollection()

我可以通过删除添加的记录代码来修复它,该记录代码记录了返回的集合的数量。我相信,任何查询该getProductCollection()方法的Collection加载结果的方法都将迫使Collection实际过早加载其产品,并且将阻止对Collection排序的下游修改和结果限制应用于分页控件。


1
要仍然能够在不加载收集项目的情况下记录收集计数,请使用$collection->getSize()。它将SELECT COUNT(*)使用当前收集过滤器执行单独的操作。
Jan Papenbrock

谢谢@Jan Papenbrock。那很方便。我试图提出的更大观点仍然存在。如果使集合加载,则将干扰分页和排序,如果尚未加载,则分页和排序将在以后应用于集合。
Matt B

0

您必须覆盖_prepareLayout()和设置数据,如下所示。

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

让我知道您是否有任何疑问。


它仍然无法正常工作。添加后,它将显示白屏。
Piyush

它不仅会像复制和粘贴好友
Keyul Shah

0

转到“管理类别”部分,然后将“锚选项”设置为“是”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.