PROJET AUTOBLOG


Portail Yosko.net

Site original : Portail Yosko.net

⇐ retour index

Mise à jour

Mise à jour de la base de données, veuillez patienter...

[Snippet #03 - PHP] pagination

mardi 14 mai 2013 à 16:00

Lorsqu'on réalise un site web, on a toujours, à un moment ou à un autre, besoin de réaliser une pagination avec des liens vers les autres pages.

Comme ce genre de code se ressemble toujours, et qu'on a vite tendance à y oublier un +1/-1, j'ai décidé de me faire une petite fonction dédiée et de vous la partager :
/**
* Generate an array of pagination link where the key is a page number
* and the value is a type of link (current page, normal link, first/last page link)
* @param integer $currentPage the current displayed page
* @param integer $totalPages the total number of pages (can be replaced by the two following params)
* @param integer $itemPerPage the number of item displayed on each page
* @param integer $totalItems the total number of existing items
* @param integer $nbPagesAround the maximum number of links (excluding first/last) that should be displayed before or after the current page
* @return array the pagination array (key = page to link to, value = type of link)
*/
function generatePagination(
$currentPage,
$totalPages = 0,
$itemPerPage = 0,
$totalItems = 0,
$nbPagesAround = 2
) {
$pagination = array();

if($totalPages == 0) {
if($itemPerPage == 0 || $totalItems == 0) {
return false;
} else {
$totalPages = (int)ceil($totalItems / $itemPerPage);
}
}

if($currentPage > $nbPagesAround + 2) {
$pagination[1] = self::PAGINATION_FIRST;
} elseif($currentPage > $nbPagesAround + 1) {
$pagination[1] = self::PAGINATION_LINK;
}
for($i = ($currentPage - $nbPagesAround); $i < $currentPage; $i++) {
if($i > 1 || ($i == 1 && $currentPage <= $nbPagesAround + 1)) {
$pagination[$i] = self::PAGINATION_LINK;
}
}
$pagination[$currentPage] = self::PAGINATION_CURRENT;
for($i = ($currentPage + 1); $i < ($currentPage + $nbPagesAround + 1); $i++) {
if($i < $totalPages
|| ($i == $totalPages && $currentPage >= $totalPages - $nbPagesAround)
) {
$pagination[$i] = self::PAGINATION_LINK;
}
}
if($currentPage < ($totalPages - $nbPagesAround - 1)) {
$pagination[$totalPages] = self::PAGINATION_LAST;
} elseif($currentPage < ($totalPages - $nbPagesAround)) {
$pagination[$totalPages] = self::PAGINATION_LINK;
}

// ksort($pagination);

return $pagination;
}
Ce code vous retournera un tableau avec la liste des pages vers lesquels vous devrez faire des liens. Pour chaque élément du tableau
Il n'y a ensuite plus qu'à gérer l'affichage dans votre vue (ici, exemple réalisé avec le gestionnaire de template rainTPL) :


Avec un peu de CSS, on arrive à un résultat sympa :


En espérant que ça puisse être utile à quelqu'un.

Keep cool & rock on.
Error happened! 0 - Call to a member function query() on null In: /var/www/ecirtam.net/autoblogs/autoblogs/autoblog.php:200 http://www.ecirtam.net/autoblogs/autoblogs/wwwyoskonet_39296e46d42dce00b6c8fda59e3c365e3bea6524/?Snippet-03-PHP-pagination #0 /var/www/ecirtam.net/autoblogs/autoblogs/autoblog.php(414): VroumVroum_Config->setDisabled() #1 /var/www/ecirtam.net/autoblogs/autoblogs/autoblog.php(999): VroumVroum_Blog->update() #2 /var/www/ecirtam.net/autoblogs/autoblogs/wwwyoskonet_39296e46d42dce00b6c8fda59e3c365e3bea6524/index.php(1): require_once('...') #3 {main}