Коллекция под заказ Magento ломает нумерацию страниц - PullRequest
6 голосов
/ 20 января 2012

Я создал коллекцию, добавив элементы в объект коллекции Varien_Data_Collection.

$collection = new Varien_Data_Collection();
  foreach($array_of_products as $productId){
    $collection->addItem(Mage::getModel('catalog/product')->load($productId));
}

Однако, когда этот объект передается в блок пейджера Magento, как показано ниже, он нарушает нумерацию страниц на моей пользовательской странице.

$pager = $this->getLayout()->createBlock('page/html_pager', 'retailerfe.analysis.pager')
            ->setCollection($collection);

PS У меня никогда не было проблем с коллекциями, полученными из коллекций моделей, таких как Mage :: getModel ('module / modelname') -> getCollection ().Это просто коллекции, созданные путем добавления элементов в объект Varien_Data_Collection.

Ответы [ 4 ]

6 голосов
/ 20 января 2012

Пейджер вызывает setPageSize в вашей коллекции, которая - если вы ее отслеживаете - используется только getLastPageNumber. Это означает, что пейджер может точно показывать количество страниц, но это все. Это Varien_Data_Collection_Db, который на самом деле что-то делает с текущим номером и размером страницы, представляя их как условие LIMIT для SQL.

Чтобы создать коллекцию, соответствующую критериям страницы, вам нужно создать потомка класса. Для идей посмотрите на источник Varien_Data_Collection_Filesystem и как он реализует loadData.


Я только что перечитал ваш вопрос и понял, что вы можете сделать это:

$collection = Mage::getModel('catalog/product')->getCollection()
            ->addIdFilter($array_of_products);

Эта коллекция будет отображаться довольно счастливо.

2 голосов
/ 20 января 2012

Я просто сомневаюсь (может быть, я ошибаюсь):

$collection->addItem(Mage::getModel('catalog/product')->load($productId));

что должно быть так:

$collection->addItem(Mage::getModel('catalog/product')->load($productId)->getData());

Дайте мне знать, если это работает для вас. Спасибо

РЕДАКТИРОВАТЬ:
Наконец я понял это. Вот как вы должны это сделать:

<?php
$collection = new Varien_Data_Collection();
foreach($array_of_products as $productId){
    $product = Mage::getModel('catalog/product')->load($productId); 
    $_rowObject = new Varien_Object();
    $_rowObject->setData($product->getData());
    $collection->addItem($_rowObject);
}
0 голосов
/ 05 октября 2015

Используйте следующий класс для расширения класса сбора данных Varien:

class Pageable_Varien_Data_Collection extends Varien_Data_Collection
{
    /**
     * Load data
     *
     * @param   bool $printQuery
     * @param   bool $logQuery
     *
     * @return  Pageable_Varien_Data_Collection
     */
    public function load($printQuery = false, $logQuery = false)
    {
        if ($this->isLoaded()) {
            return $this;
        }
        $this->_renderLimit();
        $this->_setIsLoaded();
        return $this;
    }

    /**
     * @return  Pageable_Varien_Data_Collection
     */
    protected function _renderLimit()
    {
        if ($this->_pageSize) {
            $currentPage = $this->getCurPage();
            $pageSize = $this->_pageSize;
            $firstItem = (($currentPage - 1) * $pageSize + 1);
            $lastItem = $firstItem + $pageSize;
            $iterator = 1;
            foreach ($this->getItems() as $key => $item) {
                $pos = $iterator;
                $iterator++;
                if ($pos >= $firstItem && $pos <= $lastItem) {
                    continue;
                }
                $this->removeItemByKey($key);
            }
        }
        return $this;
    }

    /**
     * Retrieve collection all items count
     *
     * @return int
     */
    public function getSize()
    {
        if (is_null($this->_totalRecords)) {
            $this->_totalRecords = count($this->getItems());
        }
        return intval($this->_totalRecords);
    }

    /**
     * Retrieve collection items
     *
     * @return array
     */
    public function getItems()
    {
        return $this->_items;
    }
}
0 голосов
/ 17 декабря 2013

Решение предоставляется.

class Test_Featuredsalons_Block_Featuredsalons extends Mage_Core_Block_Template
{

    public function __construct()
    {
        parent::__construct();
        $collection = Mage::getModel('featuredsalons/featuredsalons')->getCollection();
        $this->setCollection($collection);
    }

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

        $pager = $this->getLayout()->createBlock('page/html_pager', 'custom.pager');
        $pager->setCollection($this->getCollection());
        $this->setChild('pager', $pager);
        $this->getCollection()->load();

        return $this;
    }

    public function getPagerHtml()
    {
        return $this->getChildHtml('pager');
    }

    public function getCollection()     
     {            
        $limit      =   10;
        $curr_page  =   1;

        if(Mage::app()->getRequest()->getParam('p'))
        {
            $curr_page  =   Mage::app()->getRequest()->getParam('p');
        }
        //Calculate Offset  
        $offset     =   ($curr_page - 1) * $limit;

        $collection =   Mage::getModel('featuredsalons/featuredsalons')->getCollection()
                                                    ->addFieldToFilter('status',1);     
        $collection->getSelect()->limit($limit,$offset);

        return $collection;
    }   
}

Спасибо, Kashif

...