Creare una paginazione con PHP

Suddividere in pagine una lista di contenuti quando è troppo lunga da visualizzare.

Pubblicato da ,
Ultima modifica

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("&amp;", $otherquery);
  if ($otherquery)
    {
        $otherquery.= "&amp;";
    }

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

    echo "</p>";
}

 

View Demo