페이지 매김 및 정렬이 작동하지 않습니다


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 2016 년

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

감사합니다 @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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.