Lo script PHP che segue, paginazione.php, è costituito da tre funzioni che concorrono alla realizzazione dei link di navigazione. Si è scelto di separare il codice per la creazione dei link da quello di estrazione dei dati per semplificarne l'utilizzo anche in altri contesti.
La funzione crea_url(), già introdotta in precedenza, ha il compito di accodare il parametro che specifica il numero di pagina all'$url_base. Per effettuare tale operazione è necessario controllare se nell'$url_base siano già presenti dei parametri. In caso positivo il parametro "pag" va accodato con una "&" altrimenti con un "?". Ovviamente la "&" va riportata nell'URL utilizzando la sua entità HTML "&".
La funzione crea_link() invece serve a creare l'HTML che costituisce un link ad una pagina dei risultati. Se il link da mostrare è alla pagina corrente allora viene generato solo il numero di pagina racchiuso tra parentesi quadre (es.: [4]), altrimenti viene restituito un vero e proprio link (es.: <a href="index.php?pag=4">4</a>)
La funzione paginazione() è il cuore del sistema di creazione dei link di navigazione. Tale funzione realizza un set di link piuttosto elaborato, secondo la seguente logica:
Tutti i link realizzati vengono di volta in volta accodati alla stringa $link_paginazione che al termine dell'esecuzione della funzione paginazione() viene restituita al chiamante.
<?php
function crea_url($url_base, $pagina) {
if(strpos($url_base,'?') === false) {
return $url_base . '?pag=' . $pagina;
} else {
return $url_base . '&pag=' . $pagina;
}
}
function crea_link($url_base, $pagina_corrente, $numero_pagina) {
if($pagina_corrente == $numero_pagina) {
return "[$numero_pagina]";
} else {
return '<a href="' . crea_url($url_base, $numero_pagina) . '">' . $numero_pagina . '</a>';
}
}
// funzione che crea i link alle pagine dei risultati
function paginazione($tot_pagine, $url_base, $pagina_corrente, $pagine_vicine) {
$link_paginazione = "Pagine: ";
// link alla pagina precedente
if($pagina_corrente != 1) {
$link_paginazione .= '<a href="' . crea_url($url_base, $pagina_corrente - 1) . '">«</a> ';
}
// mostriamo sempre il link alla prima pagina
$link_paginazione .= crea_link($url_base, $pagina_corrente, 1);
// se il prossimo link non è alla seconda pagina aggiungo dei puntini ...
// oppure la sola pagina mancante
if($pagina_corrente - $pagine_vicine > 2) {
if($pagina_corrente - $pagine_vicine == 3) {
$link_paginazione .= " " . crea_link($url_base, $pagina_corrente, 2);
} else {
$link_paginazione .= " ... ";
}
}
// creo i link alla pagina corrente ed a quelle ad essa vicine
for($i = $pagina_corrente - $pagine_vicine; $i <= $pagina_corrente + $pagine_vicine; $i++) {
// se tra quelle vicine c'è la prima pagina (già riportata)
if($i < 2) continue;
// se tra quelle vicine c'è l'ultima pagina (che mostrerò con le prossime istruzioni)
if($i > $tot_pagine - 1) continue;
$link_paginazione .= " " . crea_link($url_base, $pagina_corrente, $i);
}
// se il precedente link non era alla penultima pagina aggiungo dei puntini ...
// oppure la sola pagina mancante
if($pagina_corrente + $pagine_vicine < $tot_pagine - 1) {
if($pagina_corrente + $pagine_vicine == $tot_pagine - 2) {
$link_paginazione .= " " . crea_link($url_base, $pagina_corrente, $tot_pagine - 1) . " ";
} else {
$link_paginazione .= " ... ";
}
}
// mostriamo il link all'ultima pagina se questa non coincide con la prima
if($tot_pagine != 1) {
$link_paginazione .= " " . crea_link($url_base, $pagina_corrente, $tot_pagine);
}
// link alla pagina successiva
if($pagina_corrente != $tot_pagine) {
$link_paginazione .= ' <a href="' . crea_url($url_base, $pagina_corrente + 1) . '">»</a>';
}
return $link_paginazione;
}
?>