Paginazione dei dati

Link di navigazione

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:

  • se la pagina corrente è diversa da 1 allora mostriamo un link alla pagina precedente contenente il simbolo "«"
  • mostriamo sempre il link alla prima pagina (« 1 )
  • se il successivo link che mostreremo non è alla pagina 2 allora:
    - se è alla pagina 3 allora inseriamo anche il link alla pagina 2, così da non avere discontinuità (« 1 2 3 )
    - altrimenti inseriamo dei punti di sospensione (...) per segnalare la discontinuità (« 1 ... 4 )
  • mostriamo i link alla pagina corrente e alle sue limitrofe (« 1 ... 4 5 [6] 7 8 )
  • Se l'ultimo link mostrato non è alla penultima pagina:
    - se è alla terzultima allora inseriamo anche un link alla penultima in modo da evitare la discontinuità (24 25 [26] 27 28 29 30)
    - altrimenti inseriamo dei punti di sospensione (...) per segnalare la discontinuità (24 25 [26] 27 28 ... 31)
  • mostriamo un link all'ultima pagina, se questa non coincide con la prima
  • se la pagina corrente non è l'ultima allora mostriamo un link alla pagina successiva contenente il simbolo "»"

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 . '&amp;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) . '">&laquo;</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) . '">&raquo;</a>';
    }

    return $link_paginazione;
}
?>
Pagine: precedente 1 ... 3 4 56 7

3 commenti

1 Roberta Roberta mercoledì 12 maggio 2010, ore 08:27
Ciao sto usando il tuo codice per fare la paginazione in un mio sito però ho dei problemi, non segnala nessun errore ma non compaiono i numeri linkabili di conseguenza non posso navigare tra le vaie pagine è come se non funzionasse la funzione paginazione eppure io ho fatto copia incolla del codice e l'ho adattato al mio sito cosa sbaglio?
2 Roberta Roberta mercoledì 12 maggio 2010, ore 09:47
nn metevo l'echo alla fine scusa tutto ok il codice è perfetto
3 stefana stefana sabato 15 gennaio 2011, ore 20:13
magnifico...funziona...solo una questione....se voglio limitare la paginazione solo a 30 records su 60 per esempio e che quindi nella visualizzazione vengono conteggiati solo i 30 ( a partire dal primo records...o anche nel caso si debba partire dal 10...a seconda dei dati che ho bisogno di visualizzare nella pagina) come devo fare???? quali parametri sono da correggere?????
Effettua l'accesso o registrati per inserire un commento