2013-04-10 3 views
0

Я показываю список продуктов Bestseller на странице CMS, используя XML-макет для рендеринга блока. Вместе с разбиением на страницы мне нужно отобразить панель инструментов (разбиение на страницы и сортировку), как в других списках продуктов. Поэтому я создал для этого настраиваемый модуль. При этом я могу отображать список продуктов и панель инструментов. Но Сортировка (или любые функции), похоже, не работает. Пожалуйста, помогите мне. Мой код выглядит следующим образом.Magento Custom Product Collection Pagination Не работает

class MyCompany_Bestseller_Block_Bestseller extends Mage_Catalog_Block_Product_Abstract //Mage_Core_Block_Template 
{ 
    public function __construct() 
    { 
    parent::__construct(); 
     $collection = $this->getBestsellerProduct(); 
     $this->setCollection($collection); 
    } 

    protected function _prepareLayout() 
    { 
     parent::_prepareLayout(); 

    $toolbar = $this->getToolbarBlock(); 

     // called prepare sortable parameters 
     $collection = $this->getCollection(); 

     // use sortable parameters 
     if ($orders = $this->getAvailableOrders()) { 
      $toolbar->setAvailableOrders($orders); 
     } 
     if ($sort = $this->getSortBy()) { 
      $toolbar->setDefaultOrder($sort); 
     } 
     if ($dir = $this->getDefaultDirection()) { 
      $toolbar->setDefaultDirection($dir); 
     } 
     if ($modes = $this->getModes()) { 
      $toolbar->setModes($modes); 
     } 

     // set collection to toolbar and apply sort 
     $toolbar->setCollection($collection); 

     $this->setChild('toolbar', $toolbar); 

     $this->getCollection()->load(); 
     return $this; 
    } 

    public function getToolbarBlock() 
    { 
     $block = $this->getLayout()->createBlock('bestseller/toolbar', microtime()); 
     return $block; 
    } 
    public function getMode() 
    { 
     return $this->getChild('toolbar')->getCurrentMode(); 
    } 

    public function getToolbarHtml() 
    { 
     return $this->getChildHtml('toolbar'); 
    } 

    function getBestsellerProduct() 
    { 

    // store ID 
    $storeId = Mage::app()->getStore()->getId();  

    // get most ordered products 
    $products = Mage::getResourceModel('reports/product_collection') 
        ->addAttributeToSelect('*')  
        ->addOrderedQty() 
        ->setStoreId($storeId) 
        ->addStoreFilter($storeId)      
        ->setOrder('ordered_qty', 'desc');          

    Mage::getSingleton('catalog/product_status') 
      ->addVisibleFilterToCollection($products); 
    Mage::getSingleton('catalog/product_visibility') 
      ->addVisibleInCatalogFilterToCollection($products); 

    return $products; 
    } 
} 

Блочный код Toolbar.php для моего модуля выглядит следующим образом:

class MyCompany_Bestseller_Block_Toolbar extends Mage_Catalog_Block_Product_List_Toolbar 
{ 
    public function getPagerHtml() 
    { 
     $pagerBlock = $this->getLayout()->createBlock('page/html_pager'); 

     if ($pagerBlock instanceof Varien_Object) { 

      /* @var $pagerBlock Mage_Page_Block_Html_Pager */ 
      $pagerBlock->setAvailableLimit($this->getAvailableLimit()); 

      $pagerBlock->setUseContainer(false) 
      ->setShowPerPage(false) 
      ->setShowAmounts(false) 
      ->setLimitVarName($this->getLimitVarName()) 
      ->setPageVarName($this->getPageVarName()) 
      ->setLimit($this->getLimit()) 
      ->setCollection($this->getCollection()); 
      return $pagerBlock->toHtml(); 
     } 
     return ''; 
    } 
} 

Вот блок XML, который я использовал.

<reference name="content"> 
      <block type="bestseller/bestseller" name="bestseller_list" template="bestseller/bestseller.phtml"> 
       <block type="catalog/product_list_toolbar" name="product_list_toolbar" template="catalog/product/list/toolbar.phtml"> 
        <block type="page/html_pager" name="product_list_toolbar_pager"/> 
        <!-- The following code shows how to set your own pager increments --> 
        <!-- 
         <action method="setDefaultListPerPage"><limit>4</limit></action> 
         <action method="setDefaultGridPerPage"><limit>9</limit></action> 
         <action method="addPagerLimit"><mode>list</mode><limit>2</limit></action> 
         <action method="addPagerLimit"><mode>list</mode><limit>4</limit></action> 
         <action method="addPagerLimit"><mode>list</mode><limit>6</limit></action> 
         <action method="addPagerLimit"><mode>list</mode><limit>8</limit></action> 
         <action method="addPagerLimit" translate="label"><mode>list</mode><limit>all</limit><label>All</label></action> 
        --> 
       </block> 
       <action method="addColumnCountLayoutDepend"><layout>empty</layout><count>6</count></action> 
       <action method="addColumnCountLayoutDepend"><layout>one_column</layout><count>5</count></action> 
       <action method="addColumnCountLayoutDepend"><layout>two_columns_left</layout><count>4</count></action> 
       <action method="addColumnCountLayoutDepend"><layout>two_columns_right</layout><count>4</count></action> 
       <action method="addColumnCountLayoutDepend"><layout>three_columns</layout><count>3</count></action> 
       <action method="setToolbarBlockName"><name>product_list_toolbar</name></action> 
      </block> 
     </reference> 

Я не мог решить проблему с кодом. Пожалуйста, помогите мне.

+0

Показать также код XML для блока ?? –

+0

Я также добавил код xml для блока. – Rujen

ответ

1

У меня была аналогичная проблема с загрузкой моей коллекции. Это предотвращает применение всех фильтров в пейджере. Попробуйте изменить конструктор на

public function __construct() 
{ 
    parent::__construct(); 
    $collection = $this->getBestsellerProduct()->clear(); 
    $this->setCollection($collection); 
} 

Если вы загружаете коллекцию бестселлеров еще раз, где говорят по вызову, рассчитывая на нее. Тогда попробуйте

public function __construct() 
{ 
    parent::__construct(); 
    $collection = clone $this->getBestsellerProduct(); 
    $this->setCollection($collection->clear()); 
} 

Надежда это получает вам, где вы должны быть