Magazine

De la pagination dans les "objets" ou Navigating across objects

Publié le 19 décembre 2008 par David Epely

Pour ceux qui comme moi se retrouve devant la "belle" documentation de symfony et plus précisement à l'explication sur l'utilisation de sfPropelPager (la classe de pagination spécial big up Symfony tout ça), je suppose que vous dû avoir la même réaction que moi :

"How the hell can that code work ???!!!!"

On voit un bout de truc qui ne veut rien dire ... et qui forcement ne fonctionne pas :

$article = $pager->getObjectByCursor($this->getRequestParameter('cursor'));

Bin ouais $pager n'est pas instancié. Alors on se casse les dents sur google à s'apercevoir que tout le monde réécrit les mêmes erreurs ou dans le moins pire des cas s'arrête avant.

Voilà comment réaliser une belle pagination sur liste et sur chacun des enregistrements :

version symfony : toutes avec quelques adaptations

D'abord on reprend le code de la doc qui fonctionne puis on l'améliore un poil pour rendre ce que l'on attend :

Le controller

app/frontend/modules/article/action/action.class.php

class articleActions extends sfActions
{
   public function executeList($request)
   {
       $this->pager = new sfPropelPager('Article');
       $this->pager->setPage($request->getParameter('page', 1);
       $this->pager->init();
   }
 
   public function executeShow($request)
   {
        $this->executeList($request);     //eh oui c'est ça qu'il manquait hahahaha!
        $this->article = $this->pager->getObjectByCursor( $request->getParameter('cursor') );
        //Ce qui suit pourrait être remplacé par une joulie évolution de sfPager
        if( ($previousCursor = $request->getParameter('cursor') - 1) >= 1 )
        {
           $this->pager->setParameter('previousCursor', $previousCursor);
         }
        if( ($nextCursor = $request->getParameter('cursor') + 1) <= $this->pager->getNbresults() )
        {
           $this->pager->setParameter('previousCursor', $previousCursor);
         }
    }
} 

Il ne reste plus qu'à  réaliser les vues.

Les vues

app/frontend/modules/article/templates/listSuccess.php

//je ne note volontairement pas les balises php comme il faut hein.
$cursor = $pager->getFirstIndice();
foreach($pager->getResults() as $article) :
   echo $article->getTitle();
   echo link_to('Read', 'article/read?cursor=' . $cursor);
endforeach;
//pagination sur liste
echo link_to('previous', 'article/list?page=' . $pager->getPreviousPage() );
echo link_to('next', 'article/list?page=' . $pager->getNextPage() );
//EOF
Et maintenant l'affichage de l'article plus des liens de navigation s'pas!
 app/frontend/modules/article/templates/showSuccess.php
echo $article->getTitle();
echo $article->getContent();
if( $pager->hasParameter('previousCursor')) : 
echo link_to('previous', 'article/show?cursor=' . $pager->getParameter('previousCursor') );
endif; 
if( $pager->hasParameter('nextCursor')) :  
echo link_to('next', 'article/show?cursor=' . $pager->getParameter('nextCursor') );
endif; 
//EOF

Paf

C'est comment dire, un peu magique. Une fois qu'on sait qu'il suffit d'instancier le pager depuis la méthode executeList (c'est mieux que de noter "..." et de voir que rien ne fonctionne).

Un autre évolution de sfPager serait de corriger $page lorsque l'on instancie un article depuis getObjectByCursor() (Chose que je vais proposer dès que j'aurais un peu de temps).

PS : le code présenté ici est écrit  plus ou moins from scratch et surtout pas du tout testé, donc merci à celui ou celle qui m'indiquera une erreur.


Retour à La Une de Logo Paperblog

A propos de l’auteur


David Epely 3 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte