ページネーションとソートが機能しない


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

回答:


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()メソッドでコレクションのロード結果を問い合わせると、コレクションが実際にその製品を時期尚早にロードし、ページングコントロールにコレクションの順序と結果の制限に対する下流の変更が適用されなくなると思います。


1
コレクション項目をロードせずにコレクション数を記録できるようにするには、を使用します$collection->getSize()SELECT COUNT(*)現在のコレクションフィルターで個別に実行されます。
Jan Papenbrock、2016

@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

[カテゴリセクションの管理]に移動し、アンカーオプションを[はい]に設定します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.