|
|
Afin de pouvoir paginer des éléments, Zend_Paginator doit posséder une manière générique
d'accéder aux sources de données. De ce fait, tous les accès aux données se font via des adaptateurs de sources.
Plusieurs adaptateurs existent par défaut :
| Adaptateur | Description |
|---|---|
Array |
Utilise un tableau PHP |
DbSelect |
Utilise une instance de Zend_Db_Select
qui retourne un tableau |
DbTableSelect |
Utilise une instance Zend_Db_Table_Select, qui retournera une
instance de Zend_Db_Table_Rowset_Abstract. Ceci fournit aussi des informations
supplémentaires sur le jeu de résultats, tel que les noms de colonne. |
Iterator |
Utilise une instance implémentant » Iterator |
Null |
N'utilise pas Zend_Paginator pour la pagination. En revanche, les options et
capacités de contrôle de la pagination restent disponibles. |
Note:
Plutôt que de sélectionner chaque ligne correspondant à une requête fournie, les adaptateurs
DbSelectetDbTableSelectrécupèrent seulement la quantité de données nécessaire pour l'affichage de la page courante.A cause de ceci, une seconde requête est générée dynamiquement pour déterminer le nombre total de lignes correspondantes. Cependant, il est possible de directement fournir un nombre ou un requête de dénombrement vous-même. Regardez la méthode
setRowCount()de l'adaptateurDbSelectpour de plus amples informations.
Pour créer une instance de Zend_Paginator, vous devez spécifier un adaptateur à son
constructeur:
$paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Array($array));
Pour une meilleure intégration, vous pouvez utiliser la fabrique factory():
$paginator = Zend_Paginator::factory($array);
Note:
Pour l'adaptateur
Null, il faut spécifier un chiffre à son constructeur en lieu et place de la collection de données.
Bien que l'instance soit techniquement utilisable dans l'état, dans votre contrôleur d'action vous devrez informer le paginateur du numéro de page demandé par l'utilisateur. Ceci lui permet d'avancer à travers les données paginées.
$paginator->setCurrentPageNumber($page);
La manière la plus simple de suivre et scruter cette valeur est via l'URL. Nous recommandons l'utilisation
d'un routeur compatible avec Zend_Controller_Router_Interface, mais ceci n'est pas
nécessaire.
Voici une route que vous pourriez définir dans un fichier de configuration INI:
routes.example.route = articles/:articleName/:page routes.example.defaults.controller = articles routes.example.defaults.action = view routes.example.defaults.page = 1 routes.example.reqs.articleName = \w+ routes.example.reqs.page = \d+
Avec une telle route (et en utilisant les composants MVC de Zend Framework), vous pourriez spécifier le numéro de la page de cette manière :
$paginator->setCurrentPageNumber($this->_getParam('page'));
Il y a d'autres options disponibles, voyez la configuration pour plus de détails.
Enfin, il faut passer l'instance du paginateur à votre vue. Si vous utilisez Zend_View avec
l'aide d'action ViewRenderer, ceci fonctionnera :
$this->view->paginator = $paginator;
Le script de vue va être utilisé pour rendre les éléments de la page (bien sûr si
Zend_Paginator est utilisé à cet effet), et pour afficher les éléments relatifs au contrôle de la
pagination.
Comme Zend_Paginator implémente l'interface SPL » IteratorAggregate,
boucler sur les éléments et les afficher est très simple.
Example
paginator)): ?>
Notez l'appel à l'aide de vue en fin de script. PaginationControl accepte jusqu'à quatre
paramètres : l'instance du paginateur, un type de défilement (optionnel), un partial de vue (optionnel) et un
tableau de paramètres additionnels.
Les second et troisième paramètres sont très importants. Alors que le partial est utiliser pour déterminer comment présenter les données, le type de défilement définira la manière dont ils se comportent. Disons que le partial ressemble à un contrôle de recherche, comme ce qui suit :
Que se passe-t-il lorsque l'utilisateur clique sur le lien "next" quelques fois? Plusieurs choses peuvent arriver. Le numéro de la page courante pourrait rester au milieu (comme c'est le cas sur Yahoo!), ou il pourrait aussi bien avancer à la fin de la fourchette des pages et apparaître encore à gauche lorsque l'utilisateur clique alors sur "next". Le nombre de pages pourrait alors s'étendre ou se comprimer alors que l'utilisateur avance ("scroll") à travers (comme chez Google).
Il existe 4 types de défilement intégrés dans Zend Framework :
| Type de défilement | Description |
|---|---|
| All | Retourne toutes les pages. Très pratique lorsqu'il y a peu de pages totales. |
| Elastic | Un défilement de type Google qui s'étend et se contracte au fur et à mesure que l'utilisateur avance dans les pages de résultats. |
| Jumping | Alors que l'utilisateur défile, le nombre de pages avance à la fin d'une échelle donnée, puis recommence au début de l'échelle suivante. |
| Sliding | Un défilement de type Yahoo! qui positionne la page en cours au centre d'une échelle de pages, le plus justement et près possible. Ce type de défilement est le type par défaut. |
Le quatrième et dernier paramètre est réservé pour un tableau associatif optionnel de variables
supplémentaires que vous voulez rendre disponible dans vos partiels de vues (disponible via $this).
Par exemple, ces valeurs permettent d'inclure des paramètres d'URL supplémentaires pour les liens de
pagination.
En spécifiant le partial de vue par défaut, le défilement et l'instance de vue, vous pouvez alors vous
affranchir totalement des appels à PaginationControl :
Zend_Paginator::setDefaultScrollingStyle('Sliding');
Zend_View_Helper_PaginationControl::setDefaultViewPartial(
'my_pagination_control.phtml'
);
$paginator->setView($view);
Utilisez dès lors un simple echo dans le script de vue pour le rendu du paginateur
complet:
= $this->paginator; ?>
Note:
Bien sûr, il est possible d'utiliser Zend_paginator avec d'autres moteurs de templates. Par exemple, avec Smarty vous pourriez faire ceci :
$smarty->assign('pages', $paginator->getPages());Vous pouvez ainsi accéder aux valeurs du paginateur grâce à un template comme ceci :
{$pages.pageCount}
Voici quelques exemples qui vous aideront à démarrer avec le paginateur:
Pagination de recherche :
pageCount): ?>previous)): ?> < Previous | < Previous | pagesInRange as $page): ?> current): ?> = $page; ?> | = $page; ?> | next)): ?> Next > Next >
Pagination d'objets :
pageCount): ?>= $this->firstItemNumber; ?> - = $this->lastItemNumber; ?> of = $this->totalItemCount; ?> previous)): ?> First | First | previous)): ?> < Previous | < Previous | next)): ?> Next > | Next > | next)): ?> Last Last
Pagination Dropdown :
pageCount): ?>
Les options suivantes sont disponibles pour contrôler la pagination dans les partials de vue :
| Propriété | Type | Description |
|---|---|---|
| first | entier | Numéro de la première page |
| firstItemNumber | entier | Numéro absolu du premier objet(item) dans cette page |
| firstPageInRange | entier | Première page dans l'échelle retournée par le type de défilement |
| current | entier | Numéro de la page en cours |
| currentItemCount | entier | Nombre d'objets sur cette page |
| itemCountPerPage | integer | Nombre d'objets maximum à afficher par page |
| last | entier | Numéro de la dernière page |
| lastItemNumber | entier | Numéro absolu du dernier objet sur cette page |
| lastPageInRange | entier | Dernière page dans l'échelle retournée par le type de défilement |
| next | entier | Numéro de la page suivante |
| pageCount | entier | Nombre de pages |
| pagesInRange | tableau (array) | Tableau des pages retournées par le type de défilement |
| previous | entier | Numéro de la page précédente |
| totalItemCount | entier | Nombre total d'objets |
|
|
Copyright © 2005-2011 Zend Technologies Inc (compiled by mikaelkael with ZFDocumentor - SVN 12579).

