Programmer's Reference Guide

Introduction

Utilisation

Paginer 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_Paginator
Adaptateur Description
Array Utilise un tableau PHP
DbSelect Utilise une instance de Zend_Db_Select
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.

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.

Il faut ensuite dire au paginateur quelle page utiliser pour calculer les résultats:

$paginator->setCurrentPageNumber($pageNumber);

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/:pageNumber
routes.example.defaults.controller = articles
routes.example.defaults.action = view
routes.example.defaults.pageNumber = 1
routes.example.reqs.articleName = \w+
routes.example.reqs.pageNumber = \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('pageNumber'));

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;

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.

<html>
<body>
<h1>Example</h1>
<?php if (count($this->paginator)): ?>
<ul>
<?php foreach ($this->paginator as $item): ?>
  <li><?= $item; ?></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>

<?= $this->paginationControl($this->paginator, 'Sliding', 'my_pagination_control.phtml'); ?>
</body>
</html>

Notez l'appel à l'aide de vue en fin de script. PaginationControl prend en paramètre l'instance du paginateur, un type de défilement (optionnel), et un partial de vue (optionnel).

Malgré qu'ils soient optionnels, les 2 derniers éléments sont importants. Alors que le partial va 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 le suivant:

zend.paginator.usage.rendering.control.png

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 :

Types de défilement pour Zend_Paginator
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.

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

Exemples de contrôles de pagination

Voici quelques exemples qui vous aideront à démarrer avec le paginateur:

Pagination de recherche :

<!-- 
Voir http://developer.yahoo.com/ypatterns/pattern.php?pattern=searchpagination
-->

<?php if ($this->pageCount): ?> 
<div class="paginationControl">
<!-- Previous page link --> 
<?php if (isset($this->previous)): ?> 
  <a href="<?= $this->url(array('page' => $this->previous)); ?>">&lt; Previous</a> | 
<?php else: ?> 
  <span class="disabled">&lt; Previous</span> | 
<?php endif; ?> 

<!-- Numbered page links -->
<?php foreach ($this->pagesInRange as $page): ?> 
  <?php if ($page != $this->current): ?>
    <a href="<?= $this->url(array('page' => $page)); ?>"><?= $page; ?></a> | 
  <?php else: ?>
    <?= $page; ?> | 
  <?php endif; ?>
<?php endforeach; ?>

<!-- Next page link --> 
<?php if (isset($this->next)): ?> 
  <a href="<?= $this->url(array('page' => $this->next)); ?>">Next &gt;</a>
<?php else: ?> 
  <span class="disabled">Next &gt;</span>
<?php endif; ?> 
</div> 
<?php endif; ?>

Pagination d'objets :

<!-- 
Voir http://developer.yahoo.com/ypatterns/pattern.php?pattern=itempagination
-->

<?php if ($this->pageCount): ?> 
<div class="paginationControl">
<?= $this->firstItemNumber; ?> - <?= $this->lastItemNumber; ?> 
of <?= $this->totalItemCount; ?>

<!-- First page link -->
<?php if (isset($this->previous)): ?>
  <a href="<?= $this->url(array('page' => $this->first)); ?>">First</a> | 
<?php else: ?>
  <span class="disabled">First</span> |
<?php endif; ?> 

<!-- Previous page link --> 
<?php if (isset($this->previous)): ?> 
  <a href="<?= $this->url(array('page' => $this->previous)); ?>">&lt; Previous</a> | 
<?php else: ?> 
  <span class="disabled">&lt; Previous</span> | 
<?php endif; ?> 

<!-- Next page link --> 
<?php if (isset($this->next)): ?> 
  <a href="<?= $this->url(array('page' => $this->next)); ?>">Next &gt;</a> |
<?php else: ?> 
  <span class="disabled">Next &gt;</span> |
<?php endif; ?>

<!-- Last page link -->
<?php if (isset($this->next)): ?>
  <a href="<?= $this->url(array('page' => $this->last)); ?>">Last</a>
<?php else: ?>
  <span class="disabled">Last</span>
<?php endif; ?> 

</div> 
<?php endif; ?>

Pagination Dropdown :

<?php if ($this->pageCount): ?> 
<select id="paginationControl" size="1"> 
<?php foreach ($this->pagesInRange as $page): ?>
  <?php $selected = ($page == $this->current) ? ' selected="selected"' : ''; ?>
  <option value="<?= $this->url(array('page' => $page)); ?>"<?= $selected ?>><?= $page; ?></option> 
<?php endforeach; ?>
</select>
<?php endif; ?>

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.2/prototype.js"></script>
<script type="text/javascript">
$('paginationControl').observe('change', function() {
    window.location = this.options[this.selectedIndex].value;
})
</script>

Liste des propriétés

Les options suivantes sont disponibles pour contrôler la pagination dans les partials de vue :

Propriétés disponibles aux 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
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

Introduction
blog comments powered by Disqus

Select a Version

Languages Available

Components

Search the Manual