2012-01-20 14 views
6

Creé una colección al agregar elementos a un objeto de colección Varien_Data_Collection.La colección personalizada de Magento rompe la paginación

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

Sin embargo, cuando este objeto se pasa al bloque localizador Magento como se indica a continuación, se rompe la paginación en mi página personalizada.

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

P.S nunca he tenido problemas con colecciones obtienen de colecciones de modelos como el Mago :: getModel ('módulo/ModelName') -> getCollection(). Solo se trata de colecciones creadas al agregar elementos a un Objeto Varien_Data_Collection.

+0

fija por favor el texto del mensaje de error, y nos dice qué versión de Magento. v1.4 cambió la forma en que funciona la paginación. –

+1

No hay ningún mensaje de error. Es solo que la paginación se vuelve un poco extraña. El buscapersonas calcula los números de página correctamente. Parece que no puede aplicar límites a la colección. Todos los artículos se muestran en todas las páginas. Uso Magento v 1.5.0.1 – Adheesh

+1

Parece que este comportamiento se produce cuando una colección creada al agregar elementos a un objeto Varien_Data_Collection vacío se hace para paginar. – Adheesh

Respuesta

6

El localizador está llamando setPageSize en su colección que - si se traza - sólo es utilizado por getLastPageNumber. Esto significa que el buscapersonas puede mostrar el número de páginas con precisión, pero eso es todo. Es Varien_Data_Collection_Db que realmente hace algo con el número y tamaño de página actual presentándolos como una cláusula LIMIT para SQL.

Para crear una colección que respete los criterios de la página, deberá crear un descendiente para la clase. Para ideas, vea the source of Varien_Data_Collection_Filesystem y cómo implementa loadData.


acabo de releer su pregunta y se dio cuenta que puede hacer esto:

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

esta colección página felizmente.

+0

Gracias, clockworkgeek. Tu explicación es correcta Si puedo obtener una buena solución de esto, la publicaré aquí. – Adheesh

+1

Tuve que crear una Colección personalizada e integrarme en ella dos Colecciones de Magento ... En realidad, la sugerencia anterior funcionaba bien: arreglaba la paginación. Acabo de implementar una colección que extiende Varien_Data_Colletion e implemento loadData de forma similar a la descrita en Varien_Data_Collection_Filesystem. – WonderLand

+0

¿Alguien puede publicar el código sobre cómo implementar el método loadData "Varien_Data_Collection_Filesystem" en nuestra Varien_Data_Collection personalizada? Estoy tratando de resolver este problema de paginación durante horas sin éxito :(@Francesco –

2

acabo en duda (puede ser estoy equivocado):

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

que debe ser así:

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

Avísame si funciona para usted. Gracias

EDIT:
Finalmente lo he descubierto. Así es como debe hacerlo:

<?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); 
} 
+2

['addItem'] (http://docs.magentocommerce.com/Varien/Varien_Data/Varien_Data_Collection.html#addItem) requiere un' Varien_Object', no una matriz. – clockworkgeek

+0

De acuerdo con @clockworkgeek. Lo intenté de todos modos. Me dio un error. Llamada a una función miembro getId() en un no objeto en /var/www/magento/lib/Varien/Data/Collection.php en la línea 390. Gracias por las respuestas. – Adheesh

+0

Esto no me ha ayudado con la paginación. Como dijo @clockworkgeek, Varien_Data_Collection como tal no ayuda a la paginación. Gracias por la respuesta. – Adheesh

0

Se proporciona la solución.

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

Gracias, Kashif

0

Usar la siguiente clase para extender la clase de colección de datos 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; 
    } 
} 
Cuestiones relacionadas