As the question is quoted that the answer should provide a solution for beginning users, then I tried to make the simplest possible example with the simplest calculation I could think of.
Step by step
Paging is the process of separating many results from some search, so it is mandatory to have an object to be manipulated in that paging. In the example this object is a array
simple of string
where each string
represents a page (be it an article, or list of products, etc.).
Another thing to keep in mind is to save the current page the user is in, the demonstration uses GET
of PHP
to store and inform the user of the current page value.
The last thing is to think about the goal, which is in addition to displaying the contents of the selected page, shows the link to X
previous pages and X
later pages of the current page. We soon define some variables, such as:
-
display
- which stores the value defined as the maximum amount of
page links.
-
middle
- which is just the previous variable divided by 2 for
how many pages before and after the current page we will go
search.
After learning the requirements to do such pagination, we start with the code:
pager.php :
<?php
// array que simula o objeto a ser paginado, que normalmente é resultado de uma busca na persistência
$pages = array
(
'page01', 'page02', 'page03', 'page04', 'page05',
'page06', 'page07', 'page08', 'page09', 'page10',
'page11', 'page12', 'page13', 'page14', 'page15',
'page16', 'page17', 'page18', 'page19', 'page20',
'page21', 'page22', 'page23', 'page24', 'page25',
'page26', 'page27', 'page28', 'page29', 'page30',
);
// Resgata número página atual da URL, o padrão é 1
$current = isset($_GET['page']) ? $_GET['page'] : 1;
// Informa número de links para navegação de páginas a ser mostrado
// de preferência ser ímpar, para que possa haver um meio exato para página atual
$display = 7;
// se a página existir
if(array_key_exists($current - 1, $pages)):
// exibe conteúdo da mesma
echo "<h1>Current page: {$pages[$current - 1]}</h1>";
// define o meio dos links, defino um contador com o mesmo valor
// ele auxiliara na hora de mandar x links para direito e x para esquerda
$middle = $cont = (int)($display/2);
// Percorre de 0 até o limite de links
for($pg = 0; $pg < $display; $pg ++):
// Se não é o meio da quantidade de links
if($pg != $middle)
{
// Se for uma página anterior
if($pg < $middle)
{
// Página será igual a atual menos o contador
$page = $current - $cont;
// Decrementa contador, para que a proxima pagina seja +1
$cont --;
}
// Se for uma página posterior
else if($pg > $middle)
{
// Define numero da página, como atual + contador + 1 (que indica que já passou a página atual também)
$page = $current + $cont + 1;
// Incrementa contador, para que a proxima pagina seja +1
$cont ++;
}
// Exibe o link apenas se a página tiver no intervalo de resultados
if($page > 0 and $page <= count($pages))
echo "<a href='pager.php?page={$page}'>{$page}</a> | ";
}
// Se for a página atual (estará no meio)
else
{
// Exibe o link em negrito
echo "<strong><a href='pager.php?page={$current}'>{$current}</a></strong> | ";
}
endfor;
// Se a página não existir
else:
echo "<h1>Page not exists!</h1>";
endif;
?>