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


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.