Limitando o número de links em uma paginação

Sistemas de paginação são muito usados. Já existem muitos exemplos por aí, tanto em formato de artigos/tutoriais, quanto scripts prontos. Por isso, hoje não vou me ater nas técnicas de realização desse processo. Pretendo mostrar como criar os links para cada página, semelhantemente à maneira usada pelo Google, em que aparecem somente alguns links, para evitar que se mostre uma linha muito extensa.


Estou considerando que o leitor já sabe como fazer paginação. Se não sabe, é bom ler artigos sobre isso antes de continuar com este tutorial. =P

Usarei variáveis com valores estátiocs, somente para mostrar a lógica da coisa. Claro que você usará os valores gerados pelo seu sistema de paginação.

A variável “total” contém o número total de páginas (não de registros) retornadas pela paginação.

1
2
// total de páginas
$total = 50;

A variável “max_links” armazena o número máximo de links que serão mostrados.

1
2
// número máximo de links da paginação
$max_links = 10;

A variaável “pagina” contém o valor da página corrente. Esse é o valor que virá da URL.

1
2
// página corrente
$pagina = 10;

“links_laterais” contém o número de links que serão mostrados, no máximo, antes e depois da página corrente. Esse valor corresponde à metade do valor de “max_links”. Usei ceil() para ter certeza de que será gerado um número inteiro. Se você sempre se lembrar de colocar um número par em “max_links”, pode retirar a função ceil(), reduzindo o trabalho do processador e o tempo de execução do script.

1
2
3
// calcula quantos links haverá à esquerda e à direita da página corrente
// usa-se ceil() para assegurar que o número será inteiro
$links_laterais = ceil($max_links / 2);

Aqui eu crio as variáveis que serão usadas no loop para gerar os links da paginação. É preferível criar essa variáveis em vez de declará-las denrto do loop. Caso contrário $limite seria calculado a cada iteração do laço ($inicio até poderia ser declarada dentro do for, pois só é calculada uma vez).

1
2
3
// variáveis para o loop
$inicio = $pagina - $links_laterais;
$limite = $pagina + $links_laterais;

Agora vem a parte que faz tudo aparecer. Não tem muito o que explicar. Os IF’s se explicam por si só.
Quando $i possui o valor da página corrente, o link não é gerado (até porque ninguém pretende ir para a página em que está. =P ). É necessário verificar se $i é maior que um e menor que o total de páginas, para que não sejam criados link inexistentes. Usei a página pagincao.php somente para exemplificar; mude-a para o nome do seu script.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
for ($i = $inicio; $i <= $limite; $i++)
{
 if ($i == $pagina)
 {
  echo " <strong>" . $i . "</strong> ";
 }
 else
 {
  if ($i >= 1 && $i <= $total)
  {
   echo " <a href=\"paginacao.php?pagina=" . $i . "\">" . $i . "</a> ";
  }
 }
}

O script completo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
 
// total de páginas
$total = 50;
 
// número máximo de links da paginação
$max_links = 10;
 
 
// página corrente
$pagina = 3;
 
// calcula quantos links haverá à esquerda e à direita da página corrente
// usa-se ceil() para assegurar que o número será inteiro
$links_laterais = ceil($max_links / 2);
 
// variáveis para o loop
$inicio = $pagina - $links_laterais;
$limite = $pagina + $links_laterais;
 
for ($i = $inicio; $i <= $limite; $i++)
{
 if ($i == $pagina)
 {
  echo " <strong>" . $i . "</strong> ";
 }
 else
 {
  if ($i >= 1 && $i <= $total)
  {
   echo " <a href=\"paginacao.php?pagina=" . $i . "\">" . $i . "</a> ";
  }
 }
}
 
?>

Espero que tenha ficado tudo bem claro. É algo simples, mas que, frequentemente aparece como dúvida em fóruns.

 

The following two tabs change content below.
Graduado em Ciência da Computação, pela Universidade Federal do Paraná (UFPR), é desenvolvedor de software desde 2008, com foco em Desenvolvimento Web com PHP.