Fonction de pagination en PHP
Article ajouté le 25/12/2018

Lorsqu'on veut diviser une page en plusieurs parce qu'on a trop de contenu à afficher, avoir une pagination avec des numéros de pages peut être très utile.
Pour ma part, j'utilise assez régulièrement la même fonction qui n'est peut-être pas très optimisée mais qui fait clairement le job qu'on lui demande à savoir parcourir les pages par le biais de flèches et de numéros.
Grâce à cette fonction que j'ai trouvé sur le web puis modifié, on peut donc facilement se rendre en page suivante ou précédente, en dernière ou en première page, et dans les pages qui précédent ou succèdent la page courante.
La fonction PHP
<?php
function numero_page($nbresult, $per_page=15, $page=1, $url, $version='desktop')
{
global $nextpage;
global $urlnextpage;
global $urlprevpage;
// Récupération et traitement de l'url courrante en supprimant la variable "p"
$url = str_replace('&p=', '[*p=]', $url);
$url = str_replace('?p=', '[!p=]', $url);
$url = str_replace('&p', '&[p]', $url);
$url = str_replace('?p', '?[p]', $url);
$url = str_replace('[*p=]', '&p=', $url);
$url = str_replace('[!p=]', '?p=', $url);
$url = preg_replace('/&p(=[^&]*)?|^p(=[^&]*)?&?/', '', $url);
$url = preg_replace('/&p(=[^&]*)?|^p(=[^&]*)?&?/', '', $url);
$url = preg_replace('/\?p(=[^&]*)?|^p(=[^&]*)?&?/', '', $url);
$url = str_replace('&[p]', '&p', $url);
$url = str_replace('?[p]', '?p', $url);
$url = str_replace('&', '&', $url);
$separator = '&';
if(strrpos($url, '?') === false){ $separator = '?'; }
$url = $url.$separator;
$adjacents = "2";
$prevlabel = "‹";
$nextlabel = "›";
$page = ($page == 0 ? 1 : $page);
$start = ($page - 1) * $per_page;
$prev = $page - 1;
$next = $page + 1;
$lastpage = ceil($nbresult/$per_page);
$lpm1 = $lastpage - 1; // //last page minus 1
$pagination = "";
if($lastpage > 1){
$pagination .= "<div class=\"separator\"></div><ul class=\"pagination\">";
if ($page > 1){
$pagination.= "<li><a href=\"{$url}p={$prev}\">{$prevlabel}</a></li>";
$urlprevpage = "{$url}p={$prev}";
}
if ($lastpage < 7 + ($adjacents * 2)){
for ($counter = 1; $counter <= $lastpage; $counter++){
if ($counter == $page)
$pagination.= "<li><a class=\"current\">{$counter}</a></li>";
else
$pagination.= "<li><a href=\"{$url}p={$counter}\">{$counter}</a></li>";
}
} elseif($lastpage > 5 + ($adjacents * 2)){
if($page < 1 + ($adjacents * 2)) {
for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++){
if ($counter == $page)
$pagination.= "<li><a class=\"current\">{$counter}</a></li>";
else
$pagination.= "<li><a href=\"{$url}p={$counter}\">{$counter}</a></li>";
}
$pagination.= "<li><a href=\"{$url}p={$lastpage}\">››</a></li>";
} elseif($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2)) {
$pagination.= "<li><a href=\"{$url}p=1\">‹‹</a></li>";
for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++) {
if ($counter == $page)
$pagination.= "<li><a class=\"current\">{$counter}</a></li>";
else
$pagination.= "<li><a href=\"{$url}p={$counter}\">{$counter}</a></li>";
}
$pagination.= "<li><a href=\"{$url}p={$lastpage}\">››</a></li>";
} else {
$pagination.= "<li><a href=\"{$url}p=1\">‹‹</a></li>";
for ($counter = $lastpage - (2 + ($adjacents * 2)); $counter <= $lastpage; $counter++) {
if ($counter == $page)
$pagination.= "<li><a class=\"current\">{$counter}</a></li>";
else
$pagination.= "<li><a href=\"{$url}p={$counter}\">{$counter}</a></li>";
}
}
}
if($page<$counter-1)
{
$pagination.= "<li><a href=\"{$url}p={$next}\">{$nextlabel}</a></li>";
$urlnextpage = "{$url}p={$next}";
if(isset($_GET['nbpp']) && $_GET['nbpp']=='all')
{
$nextpage = "<a class=\"nextlink\" href=\"{$url}p={$next}\">{$nextlabel}</a>";
}
}
$pagination.= "</ul>";
}
return $pagination;
}
?>