2012-01-20 11 views
6

Ho creato una raccolta aggiungendo elementi a un oggetto di raccolta Varien_Data_Collection.La raccolta personalizzata Magento interrompe l'impaginazione

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

Tuttavia quando questo oggetto viene trasmesso ai Magento blocco cercapersone come indicato di seguito, si rompe l'impaginazione nella mia pagina personalizzata.

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

P.S non ho mai avuto problemi con le collezioni recuperati da collezioni modello come Mage :: getModel ('modulo/ModelName') -> GetCollection(). Sono solo le collezioni create aggiungendo oggetti ad un oggetto Varien_Data_Collection.

+0

si prega di inviare il testo del messaggio di errore, e ci dicono che versione di Magento. v1.4 ha cambiato il modo in cui funziona l'impaginazione. –

+1

Non c'è nessun messaggio di errore. È solo che l'impaginazione diventa un po 'strana. Il cercapersone calcola correttamente i numeri di pagina. Sembra che non sia in grado di applicare limiti alla collezione. Tutti gli oggetti vengono visualizzati su tutte le pagine. Io uso Magento v 1.5.0.1 – Adheesh

+1

Sembra che questo comportamento si verifichi ogni volta che una raccolta creata aggiungendo oggetti a un oggetto Varien_Data_Collection vuoto viene fatta per impaginare. – Adheesh

risposta

6

Il cercapersone sta chiamando setPageSize sulla vostra collezione, che - se si traccia - è usato solo da getLastPageNumber. Ciò significa che il cercapersone può mostrare il numero di pagine in modo accurato, ma il gioco è fatto. È Varien_Data_Collection_Db che in realtà fa qualsiasi cosa con il numero e la dimensione della pagina attuale rendendoli come una clausola LIMIT per SQL.

Per creare una raccolta che rispetti i criteri della pagina, è necessario creare un discendente alla classe. Per idee guarda the source of Varien_Data_Collection_Filesystem e come implementa loadData.


Ho appena riletto la tua domanda e si rese conto che si può fare questo:

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

Questa collezione sarà pagina tranquillamente.

+0

Grazie, clockworkgeek. La tua spiegazione è corretta. Se riuscirò a ottenere una buona soluzione, la posterò qui. – Adheesh

+1

Ho dovuto creare una collezione personalizzata e unirmi a essa in due raccolte Magento ... In realtà, il suggerimento di cui sopra ha funzionato bene: ha risolto l'impaginazione. Ho appena implementato una collezione che estende Varien_Data_Colletion e implementa loadData in un modo simile descritto in Varien_Data_Collection_Filesystem. – WonderLand

+0

Qualcuno può pubblicare il codice su come implementare il metodo loadData "Varien_Data_Collection_Filesystem" nel nostro Varien_Data_Collection personalizzato? Sto cercando di risolvere questo problema di impaginazione per ore senza successo :(@Francesco –

2

Ho appena dubbio (forse mi sbaglio):

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

che dovrebbe essere simile a questo:

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

fatemi sapere se che funziona per voi. Grazie

EDIT:
Infine ho capito. Ecco come si dovrebbe fare:

<?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) richiede un' Varien_Object', non un array. – clockworkgeek

+0

D'accordo con @clockworkgeek. L'ho provato lo stesso. Mi ha dato un errore Chiama una funzione membro getId() su un oggetto non in /var/www/magento/lib/Varien/Data/Collection.php sulla riga 390. Grazie per le risposte. – Adheesh

+0

Questo non mi ha aiutato con l'impaginazione. Come ha detto @clockworkgeek, Varien_Data_Collection in quanto tale non aiuta l'impaginazione. Grazie per la risposta. – Adheesh

0

La soluzione è fornita.

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

Grazie, Kashif

0

Usare la seguente classe di estendere la classe Varien Raccolta dati:

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