UtilisationPaginer des collections de données
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 :
Adaptateurs pour Zend_PaginatorAdaptateurDescriptionArrayUtilise un tableau PHPDbSelectUtilise une instance de Zend_Db_Select
qui retourne un tableauDbTableSelectUtilise 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.IteratorUtilise une instance implémentant IteratorNULLN'utilise pas Zend_Paginator pour la
pagination. En revanche, les options et capacités de contrôle de la
pagination restent disponibles.
Plutôt que de sélectionner chaque ligne correspondant à une requête fournie,
les adaptateurs DbSelect et DbTableSelect ré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'adaptateur DbSelect pour de plus amples
informations.
Pour créer une instance de Zend_Paginator, vous devez
spécifier un adaptateur à son constructeur:
Pour une meilleure intégration, vous pouvez utiliser la fabrique
factory():
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.
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:
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 :
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 :
view->paginator = $paginator;
]]>The DbSelect and DbTableSelect adapter
The usage of most adapters is pretty straight-forward. However, the
database adapters require a more detailed explanation regarding
the retrieval and count of the data from the database.
To use the DbSelect and DbTableSelect adapters you don't have to retrieve the data upfront from
the database. Both adapters do the retrieval for you, aswell as the counting of the total pages.
If additional work has to be done on the database results the adapter getItems() method
has to be extended in your application.
Additionally these adapters do not fetch all records from the database
Instead, the adapters manipulates the original query to produce the corresponding
COUNT query. Paginator then executes that COUNT query to get the number of rows.
This does require an extra round-trip to the database, but this is many times
faster than fetching an entire result set and using count(). Especially with
large collections of data.
The database adapters will try and build the most efficient query that will execute
on pretty much all modern databases. However, depending on your database or even your
own schema setup, there might be more efficient ways to get a rowcount. For this scenario
the database adapters allow you to set a custom COUNT query. For example,
if you keep track of the count of blog posts in a separate table, you could achieve a
faster count query with the following setup:
select()->from('posts'));
$adapter->setRowCount(
$db->select()->from('item_counts', array(Zend_Paginator_Adapter_DbSelect::ROW_COUNT_COLUMN => 'post_count'))
)
$paginator = new Zend_Paginator($adapter);
]]>
This approach will probably not give you a huge performance gain on
small collections and/or simple select queries. However, with complex
queries and large collections, a similar approach could give you a
significant performance boost.
Rendre des pages avec les scripts de vue
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.