Utilisation avancée
Adaptateurs de source de données personnalisée
À partir d'un moment, vous pourriez avoir besoin de parcourir un type de données qui n'est pas couvert par
les adaptateurs fournis par défaut. Dans ce cas, vous devrez écrire vos propres adaptateurs.
Pour faire ceci, vous devez implémenter Zend_Paginator_Adapter_Interface. Il existe deux
méthodes requises :
count()
getItems($offset, $itemCountPerPage)
De plus, vous voudrez peut-être implémenter un constructeur qui prend votre source de données comme
paramètre et le stocke comme propriété protégée ou privée. La manière suivant laquelle vous allez spécifiquement
faire ceci, vous incombe.
Si vous avez déjà utilisé l'interface SPL Countable, vous êtes
familier avec count(). Utilisé avec Zend_Paginator, il s'agit du nombre total
d'éléments dans la collection de données. De plus, l'instance Zend_Paginator fournit une méthode
countAllItems() qui proxie vers la méthode count() de l'adaptateur.
La méthode getItems() est seulement légèrement plus compliquée. Pour ceci, les paramètres
sont un point de départ et un nombre d'éléments à afficher par page. Vous devez retourner la portion appropriée
de données. Pour un tableau, il s'agirait :
_array, $offset, $itemCountPerPage);
]]>
Regardez les adaptateurs fournis par défaut (ils implémentent tous
Zend_Paginator_Adapter_Interface) pour avoir une idée de la manière d'implémenter votre propre
adaptateur.
Styles de défilement personnalisés
Créer votre propre style de défilement requiert que vous implémentiez
Zend_Paginator_ScrollingStyle_Interface, qui définit une seule méthode, getPages(). Et
plus spécifiquement :
Cette méthode doit calculer des bornes inférieures et supérieures des numéros de page dans la plage des
pages dites "local" (c'est-à-dire qui sont proches de la page courante).
A moins que votre style étende un autre style de défilement (voir
Zend_Paginator_ScrollingStyle_Elastic par exemple), votre style personnalisé devra inévitablement
se terminer par quelque chose de similaire à ceci :
getPagesInRange($lowerBound, $upperBound);
]]>
Il n'y a rien de spécial au sujet de cet appel ; c'est simplement une méthode pratique pour vérifier la
validité de la limite inférieure et supérieure et pour renvoyer un tableau de ces bornes au paginateur.
Quand vous êtes prêt à utiliser votre style de défilement, vous devez informer Zend_Paginator
dans quel dossier le chercher, en réalisant ceci :
Fonctionnalité de mise en cache
Zend_Paginator peut mettre en cache les données qu'il a déjà fourni, empêchant ainsi
l'adaptateur de les rechercher chaque fois qu'ils sont demandés. Pour informer le paginateur de mettre en cache
automatiquement les données issues de l'adaptateur, fournissez simplement une instance de
Zend_Cache_Core à sa méthode setCache() :
3600, 'automatic_serialization' => true);
$bO = array('cache_dir'=>'/tmp');
$cache = Zend_cache::factory('Core', 'File', $fO, $bO);
Zend_Paginator::setCache($cache);
]]>
Tant que Zend_Paginator possède une instance de Zend_Cache_Core, les données seront mises en cache.
Parfois vous ne voudrez pas mettre en cache les données même si vous avez déjà fourni un instance de cache. Vous
pourrez alors utiliser la méthode setCacheEnable() :
setCacheEnable(false);
// le cache est maintenant désactivé
]]>
Quand un cache est paramétré, les données y sont automatiquement stockées et extraites. Il peut alors être
utile de vider le cache manuellement. Vous pouvez réaliser ceci en appelant
clearPageItemCache($pageNumber). Si vous ne passer aucun paramètre, le cache entier sera vidé. Vous
pouvez fournir optionnellement un paramètre représentant le numéro de page à enlever du cache :
getCurrentItems();
// la page 1 est maintenant en cache
$page3Items = $paginator->getItemsByPage(3);
// la page 3 est maintenant en cache
// effacer le cache associé à la page 3
$paginator->clearPageItemCache(3);
// effacer tout le cache
$paginator->clearPageItemCache();
]]>
Changer le nombre d'éléments par page videra tout le cache comme s'il était devenu invalide :
getCurrentItems();
// toutes les données vont être effacées du cache :
$paginator->setItemCountPerPage(2);
]]>
Il est aussi possible de voir les données en cache et de les appeler directement grâce à la méthode
getPageItemCache() :
setItemCountPerPage(3);
Zend_Paginator::setCache($cache);
// récupérer des éléments
$items = $paginator->getCurrentItems();
$otherItems = $paginator->getItemsPerPage(4);
// voir ces éléments sous la forme d'un tableau à 2-dimensions :
var_dump($paginator->getPageItemCache());
]]>