Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 23-02-2013 16:20:45

mtcocktail
Membre
Date d'inscription: 20-09-2012
Messages: 71

Bug sur Paginator ?

J'ai l'impression d'avoir levé un lièvre sur le module Paginator de zf2. Et j'ai ce comportement bizarre que ce soit en 2.0.* ou 2.1.3

Quand je passe de la page 1 à la page 2, le dernier éléments de la page 1 est présent en page 2 comme premier élément.

C'est un bug ou un comportement normal ?

mon bout de code dans le controler :

Code:

$mesobjets=$this->getObjetTable()->fetchall();        
$mesobjets->buffer();

$paginator = new \Zend\Paginator\Paginator(
                                     new \Zend\Paginator\Adapter\Iterator($mesobjets)
                     );
$paginator->setPageRange(9);
$paginator->setItemCountPerPage(9);
$paginator->setCurrentPageNumber($this->params()->fromRoute('page'));
        
$view = new ViewModel(array(
            'paginator' => $paginator,
             ));

Dernière modification par mtcocktail (24-02-2013 08:27:37)

Hors ligne

 

#2 23-02-2013 23:10:31

Bouks
Membre
Lieu: Paris
Date d'inscription: 31-08-2012
Messages: 241

Re: Bug sur Paginator ?

Je n'ai pas ce problème en 2.0.*.


22914720

Hors ligne

 

#3 24-02-2013 08:29:43

mtcocktail
Membre
Date d'inscription: 20-09-2012
Messages: 71

Re: Bug sur Paginator ?

argh je sens que je vais me sentir seul sad ... et tu as quel type d'objet dans paginator qui fonctionne ? un recordset ?

tu voies quelque chose de bizarre dans mon bout de code ?

Hors ligne

 

#4 24-02-2013 12:56:21

Bouks
Membre
Lieu: Paris
Date d'inscription: 31-08-2012
Messages: 241

Re: Bug sur Paginator ?

je passe un arrayAdapter dans le paginator.

Il semble que tu récupères toutes les lignes de ta table par un fetchAll et qu'après ce soit ton paginator qui sélectionne les éléments à afficher.
Je ne pense pas que cela soit une bonne solution. Une meilleure pratique est de filtrer tes éléments dans la requête sur ta base de données et de ne récupérer que le nécessaire à la demande utilisateur.

Voici une code vite fait. Juste pour voir le principe.

Code:

[lang=php]
// récupération du nombre total d'objets
$totalObjects = totalObjects($where);
// récupération de tous tes objets.
$mesObjets = selectObjets($where, $limit, $limit * $page);

$paginator = new Paginator(new ArrayAdapter(range(1, $totalObjects)));
$paginator->setItemCountPerPage($limit)->setCurrentPageNumber($page);

Je ne comprends pas pourquoi les devs n'ont pas laissé la possibilité dep passer directement un array, voire même un nombre, quand on peut faire compliqué...

Dernière modification par Bouks (24-02-2013 12:59:54)


22914720

Hors ligne

 

#5 24-02-2013 16:00:19

mtcocktail
Membre
Date d'inscription: 20-09-2012
Messages: 71

Re: Bug sur Paginator ?

Hum d'après la doc c'est l'adapter du paginator qui peut se débrouiller pour récupérer uniquement ce qu'il a besoin. En tous ca c'est ce qui est indiqué pour l'adapter DbSelect
: http://zf2.readthedocs.org/en/latest/mo … t-adapter.

Moi je lui passer une instance resultset d'un TAbleGateway :

Code:

class ObjetTable extends AbstractTableGateway
{
    protected $table ='objets';

    public function __construct(Adapter $adapter)
    {
        $this->adapter = $adapter;
        $this->resultSetPrototype = new ResultSet();
        $this->resultSetPrototype->setArrayObjectPrototype(new Objet());
        $this->initialize();
    }

    public function fetchAll()
    {
        $resultSet = $this->select();
        return $resultSet;
    }

...

Donc un adapter iterator, Et là effectivement y'a pas beaucoup de doc sur ce type d'adapter du paginator. Pour moi il s'occupait de faire le count et le limit.

Hors ligne

 

#6 24-02-2013 16:36:12

Bouks
Membre
Lieu: Paris
Date d'inscription: 31-08-2012
Messages: 241

Re: Bug sur Paginator ?

La doc que tu mets en lien fait la même chose que ma solution : requête sur la base pour compter les résultats (pour la paginator).

Maintenant il y a une différence entre la doc et ton exemple :

Dans l'exemple de la doc, le dev implémente une classe étendue de Zend\Paginator\Adapter\DbSelect alors que toi tu utilises une classe étendue de AbstractTableGateway. La fonction count est implémentée à la main par le dev.

Je te rappelle que le paginator n'a besoin que du compte des résultats et pas les résultats eux-même.

Et je le rappelle, tu ne requêtes pas toute ta table pour ensuite compter les éléments et éventuellement faire un filtre en php. C'est totalement contre-productif et peut faire "tomber" un serveur en moins de deux.


22914720

Hors ligne

 

#7 24-02-2013 16:57:09

mtcocktail
Membre
Date d'inscription: 20-09-2012
Messages: 71

Re: Bug sur Paginator ?

Oui j'ai vue que dans la doc c'était pas la même chose, pour ça que je disais a la fin de ma réponse que moi j'utilisait un adapter "Iterator" et que pour ce dernier il n'y avait pas autant de documentation que le DbSelect.

Par contre pour moi mon objet TableGateway ne contient pas toute la data, il contient juste le select, le nombre d'élément et le prototype de l'objet associé.

Effectivement si c'est pas le cas c'est clairement contre-productif smile

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages