La paginazione diventa utile quando una lista di contenuti, per esempio articoli di un blog, diventa troppo lunga, quindi è buona norma impaginare i contenuti.
In questo esempio vedremo come creare una paginazione usando solo codice php.
La prima cosa che di solito si definisce è il numero di contenuti da visualizzare per ogni pagina, ad esempio 20, e il numero totale di contenuti
<?php
// numero di elementi da visualizzare per pagina
$num_for_page = 20;
// file corrente
$this_page = basename(__FILE__);
// array di dati da impaginare
$data = range(1, 1000);
// numero dei risultati da visualizzare
$num_results = count($data);
la variabile $data è un array di numeri da 1 a 1000 per simulare di avere un totale di 1000 contenuti da impaginare, poi definiamo due variabili $page e $otherquery, la prima sarà il valore del numero di pagina di $_GET['page'], la seconda sono le eventuali altre query presenti nell'url
<?php
.......................
.......................
// $page è il numero di pagina corrente, valore $_GET['page']
if (!isset($_GET['page']) || !$page = intval($_GET['page']))
{
$page = 1;
}
// query extra da aggiungere ai link di navigazione
$otherquery = [];
if(count($_GET) > 1){
foreach($_GET as $key => $val){
//escudiamo la query 'page' del numero pagina
if($key !=='page'){
if ( isset($_GET[$key]) )
{
$link = "{$key}=" . urlencode($val);
array_push($otherquery, $link);
}
}
}
}
$otherquery = implode("&", $otherquery);
if ($otherquery)
{
$otherquery.= "&";
}
adesso creiamo un array costituito dai collegamenti di tutte le pagine
<?php
.................
.................
// costruire un array contenente collegamenti di tutte le pagine
$tmp = [];
for ($p = 1, $i = 0;$i < $num_results;$p++, $i += $num_for_page)
{
if ($page == $p)
{
// pagina corrente mostrata in grassetto, nessun collegamento
$tmp[] = "<b>{$p}</b>";
}
else
{
$tmp[] = "<a href=\"{$this_page}?{$otherquery}page={$p}\">{$p}</a>";
}
}
se il numero delle pagine è eccessivamente grande, è possibile sfoltire i collegamenti in questo modo
<?php
...............
...............
// sfoltire i collegamenti (opzionale)
// count($tmp) - 3, visualizza gli ultimi 3 link della paginazione
// è possibile usare - 4, - 5, - 6, a seconda delle esigenze
for ($i = count($tmp) - 3;$i > 1;$i--)
{
if (abs($page - $i - 1) > 3)
{
unset($tmp[$i]);
}
}
infine creiamo la paginazione solo se il numero di pagine è maggiore di 1
<?php
................
................
// visualizzare la paginazione se il numero di pagine è maggiore di 1
if (count($tmp) > 1)
{
echo "<p>";
if ($page > 1)
{
// visualizzare il collegamento 'Indietro'
echo "<a href=\"{$this_page}?{$otherquery}page=" . ($page - 1) . "\">« Indietro</a> | ";
}
else
{
echo "Pagina: ";
}
$lastlink = 0;
foreach ($tmp as $i => $link)
{
if ($i > $lastlink + 1)
{
echo " ... "; //per i collegamenti omessi
}
elseif ($i)
{
echo " | ";
}
echo $link;
$lastlink = $i;
}
if ($page <= $lastlink)
{
// visualizzare il collegamento 'Avanti'
echo " | <a href=\"{$this_page}?{$otherquery}page=" . ($page + 1) . "\">Avanti »</a>";
}
echo "</p>";
}