6
votes

Magento Custom Collection Breaks Pagination

J'ai créé une collection en ajoutant des éléments à un objet de collecte Varien_Data_Collection.

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


4 commentaires

Veuillez poster le texte du message d'erreur et nous dire quelle version de Magento. v1.4 a changé la façon dont la pagination fonctionne.


Il n'y a pas de message d'erreur. C'est juste que la pagination devient un peu bizarre. Le pager calcule correctement les numéros de page. Il semble que cela ne soit pas capable d'appliquer des limites sur la collection. Tous les articles montrent sur toutes les pages. J'utilise Magento V 1.5.0.1


On dirait que ce problème se produit chaque fois qu'une collection créée en ajoutant des éléments à un objet Varien_Data_Collection vide est fabriqué au paginate.


Pouvez-vous résoudre ce problème?


4 Réponses :


2
votes

Je doute juste sur (peut-être que je me trompe): xxx pré>

qui devrait être comme ceci: p> xxx pré>

laissez-moi savoir Si cela fonctionne pour vous. Merci P>

EDIT: strong>

Enfin je l'ai compris. Voici comment vous devriez le faire: P>

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


3 commentaires

addItem nécessite un Varien_Object , pas un tableau.


D'accord avec @Clockworkek. Je l'ai essayé quand même. M'a donné une erreur. Appelez à une fonction de membre Getid () sur un non-objet dans /var/magento/lib/varien/data/collection.php à la ligne 390. Merci pour les réponses.


Cela ne m'a pas aidé avec la pagination. Comme @ClockworkGek a déclaré, Varien_Data_Collection en tant que telle n'aide pas la pagination. Merci pour la réponse.



6
votes

Le téléavertisseur appelle SetPagesize code> sur votre collection qui - Si vous tracez-la - n'est utilisé que par getlastpagenumber code> . Cela signifie que le pager peut afficher le nombre de pages avec précision, mais c'est tout. C'est varien_data_collection_db code> qui fait réellement quelque chose avec le numéro de page et la taille en cours par Les rendant comme une clause code> code> pour SQL.

Pour créer une collection qui respecte les critères de page, vous devrez créer un descendant à la classe. Pour les idées, regardez La source de varien_data_collection_filesystem code > et comment cela implémente loaddata ​​code>. p>


Je viens de relire votre question et que vous avez réalisé que vous pouvez le faire: P>

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


5 commentaires

Merci, Clockworkek. Votre explication est correcte. Si je peux avoir une bonne solution, je le posterai ici.


Je devais créer une collection personnalisée et fusionner deux collections de magentas ... en réalité, la suggestion ci-dessus a fonctionné bien: il corrige la pagination. Je viens de mettre en place une collection étendue Varien_Data_Collettion et implémenter le LoadData de la même manière décrite dans le système Varien_Data_Collection_FileSystem.


Quelqu'un peut-il poster le code sur la mise en place de "Varien_Data_Collection_FileSystem" LoadData Méthode dans notre Varien_Data_Collection personnalisé? J'essaie de résoudre ce problème de pagination pendant des heures sans succès :( @francesco


Désolé, il est passé beaucoup de temps et je ne me souviens pas. Il suffit de regarder la méthode varien_data_collection_filesystem et sa méthode LoadData ().


Ma suggestion était de regarder loaddata () pour l'inspiration uniquement, à ne pas la mettre en œuvre littéralement, ni de le recréer exactement. Regardez comment il calcule $ à partir de , $ to et $ ispaginé puis les vérifie avant d'appeler $ ceci-> additem () . Le secret consiste à appeler uniquement additem () pour les éléments que vous connaissez figurent dans la page en cours. Si vous avez un problème plus spécifique avec cela, essayez de commencer une nouvelle question.



0
votes

La solution

est fournie.

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


0 commentaires

0
votes

Utilisez la classe suivante pour étendre la classe de collecte de données 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 commentaires