Pagination - Guide de personnalisation

Introduction

La mise en oeuvre du plugin, avec une navigation par défaut et un thème relativement standard, est triviale.

Comme indiqué sur la page de configuration du plugin Pagination, il suffit d'ajouter dans le fichier list.php, avant et/ou apèrs la boucle while(...), la ligne suivante :

    <?php if ($mode == 'pagination')
    	dcPagination::showNavigation(); ?>
    

Après cet ajout, votre fichier list.php devrait ressemble à quelque chose d'approchant :

<?php if ($mode == 'pagination') dcPagination::showNavigation(); ?>
<!-- Boucle sur la liste de billets -->
<?php while ($news->fetch()) : ?>
	<div class="post">
		<?php dcDayDate('<p class="day-date">%s</p>'); ?>
(...)
	</div>
<?php endwhile; ?>
<?php if ($mode == 'pagination') dcPagination::showNavigation(); ?>

Vous obtiendrez alors ce résultat :

copie d'écran de la navigation par défaut

Mais il faut reconnaitre que la navigation présentée n'est pas très "sexy", et l'on peut parier que de nombreux utilisateurs souhaiteront lui donner une apparence plus personnelle.

Personnaliser la barre de navigation

Fonctions pour les gabarits

Evidemment, le plugin met à votre disposition des fonctions pour les gabarits.
Ces dernières vont vous permettre d'affiner facilement la présentation de cette navigation multipage.

dcPagination::showNavigation

Il s'agit de la fonction d'affichage de cette fameuse navigation.
Appelée sans arguments, comme c'est le cas par défaut, vous obtenez la barre illustrée plus haut.

Cette fonction accepte les arguments suivants :

ParamètreDescription
$blocUne chaine de formatage représentant le bloc XHTML englobant la navigation.
Par défaut, ce paramètre contient '<p>%s</p>'
$currentUne chaine de formatage représentant le bloc XHTML englobant le numéro de la page courant.
Par défaut, ce paramètre contient '<strong>%s</strong>'
$page_linkUne chaine de formatage représentant le bloc XHTML englobant les liens vers les autres pages '<a href="%s">%s</a>'
$prev_linkUne chaine de formatage représentant le bloc XHTML englobant le lien vers la page précédente '<a href="%s">&lt;</a>'
$next_linkUne chaine de formatage représentant le bloc XHTML englobant le lien vers la page suivante '<a href="%s">&gt;</a>'

dcPagination::showCleanNavigation

Fonction alternative d'affichage de la navigation.
Cette version présente une liste condensée de liens, idéale avec une liste de billets longue comme la muraille de Chine (et plus si affinités... ).

Cette fonction accepte les arguments suivants :

ParamètreDescription
$prevChaine pour le nom du lien page précédente 'Page précédente'
$currentChaine de formatage pour les informations de page courante 'Page %1$d sur %2$d'
$nextChaine pour le nom du lien page suivante 'Page suivante'
$blocChaine de formatage du bloc XHTML englobant.
Par défaut, ce paramètre contient '<p class="pagenav">%s</p>'
$sepChaine de séparation entre les éléments de navigation ' - '

dcPagination::getInfos

Elle permet l'affichage des informations relatives à la position et l'état actuel de la pagination.

ParamètreDescription
$sUne chaine de formatage de la sortie.
Par défaut, ce paramètre contient '%1$d %2$d'
Les informations disponibles sont :
  • la page courante (%1$d)
  • le nombre total de pages (%2$d)
  • le numéro d'enregistrement débutant le lot (%3$d)

Exemples

Rendons notre navigation un peu plus séduisante.

Commençons par une petite modification du fichier list.php :

<?php if ($mode == 'pagination') dcPagination::showNavigation('<p class="pagenav">%s</p>'); ?>
<!-- Boucle sur la liste de billets -->
<?php while ($news->fetch()) : ?>
(...)
<?php endwhile; ?>
<?php if ($mode == 'pagination') dcPagination::showNavigation('<p class="pagenav">%s</p>'); ?>

Parallèlement, modifions la feuille de styles du thème et rajoutons les styles suivants :

.pagenav {
	font: 0.9em;
}

p.pagenav a {
	background : #ddd;
	color: black;
	padding:2px;
	border: 1px solid #bbb;
	text-decoration: none;
	font-size:90%;
}

p.pagenav a:hover {
	background:#598F9A;
	color:white;
}

p.pagenav strong {
	color: black;
	padding:2px;
	border: 1px solid #bbb;
}

Nous obtiendrons alors une navigation visuellement plus acceptable :

copie d'écran d'une navigation personnalisée

C'est tout de même plus joli, non ? ...

Utilisons une navigation condensée.

Pour les blogueurs prolixes, la liste de pages peut devenir rapidement encombrante et inesthétique. C'est alors l'occasion d'utiliser la méthode dcPagination::showCleanNavigation.

Une fois encore, nous effectuerons une modification du fichier list.php :

<?php if ($mode == 'pagination') dcPagination::showCleanNavigation(); ?>
<!-- Boucle sur la liste de billets -->
<?php while ($news->fetch()) : ?>
(...)
<?php endwhile; ?>
<?php if ($mode == 'pagination') dcPagination::showCleanNavigation(); ?>

Appelé avec les paramètres par défaut et sans style spécifique, cette méthode produira un affichage tel que montré ci-après :

copie d'écran de la navigation courte par défaut

Vous trouvez cela encore trop important ? Condensons, condensons.
Par exemple, remplaçons les textes "Page précédente" et "Page suivante" par "<<" et ">>" respectivement. Au passage, enlevons également les informations de pagination "Page n sur m".
Notre fichier list.php ressemblera cette fois à ceci :

<?php if ($mode == 'pagination') dcPagination::showCleanNavigation('<<','','>>'); ?>
<!-- Boucle sur la liste de billets -->
<?php while ($news->fetch()) : ?>
(...)
<?php endwhile; ?>
<?php if ($mode == 'pagination') dcPagination::showCleanNavigation('<<','','>>'); ?>

Nous obtiendrons alors ce type de navigation page à page :

copie d'écran de la navigation courte personnalisée

Evidemment, la navigation courte peut, au même titre que la navigation complète, voir son apparence améliorée via un recours aux CSS. A vous de jouer !

Mise en oeuvre avancée

Réutilisation du mode initial

Pour fonctionner, le plugin de Pagination intercepte les modes standards de DotClear. Aussi, lors de l'interception d'un mode, la variable DotClear $mode forcée avec la valeur "pagination".

Vous utilisez peut être un template personnalisé qui ne présente pas les listes de la même manière pour les archives et les rubriques. Dans un tel cas de figure, les probabilités sont élevées que vous utilisiez des tests sur la variable $mode, avec un code ressemblant plus ou moins à :

<?php if ($mode == 'cat') : ?>
	<?php include(dirname(__FILE__).'/list_categories.php'); ?>
<?php elseif ($mode == 'month') : ?>
	<?php include(dirname(__FILE__).'/list_archives.php'); ?>
<?php endif; ?>

Si vous avez configuré le plugin Pagination pour intercepter ces 2 modes, vos tests ne fonctionneront plus et des listes par défaut seront probablement affichées en lieu et place de vos listes spécifiques.

Pour gérer ce type de situations, le plugin met à votre disposition une nouvelle variable globale dc_orig_mode contenant le nom du mode intercepté. Vous pouvez alors ajouter à votre template le code suivant :

<?php
if ($mode == 'pagination') {
	if ($dc_orig_mode == 'cat') {
		include(dirname(__FILE__).'/list_categories.php');
	}
	elseif ($dc_orig_mode == 'month') {
		include(dirname(__FILE__).'/list_archives.php');
	}
}
?>

Vous retrouverez ainsi le comportement désiré, même lorsque la pagination est activée.