Impaginare i records contenuti all'interno di una tabella può essere veramente comodo se si deve lavorare alla visualizzazione di un gran numero di dati; però gli scripts per l'impaginazione sono in genere molto ricchi di codice e si rischia di complicare eccessivamente il listato delle nostre applicazioni.
Una soluzione ideale potrebbe essere quella di affidare le funzioni di impaginazione ad una classe salvata in una pagina esterna, in questo modo potremmo richiamare in modo semplice i metodi previsti senza "affogare" le nostre pagine in un mare di codice.
Ciò che rende molto lunghi, e spesso complicati, i codici per l'impaginazione sono i tanti casi che sarebbe necessario prevedere: qual'è il numero d'ordine della pagina corrente? Quante pagine dobbiamo gestire in totale? Quanti records devono essere visualizzati per ogni pagina? Come evidenziare la pagina corrente? Come linkare le altre pagine?... e via dicendo.
A questo scopo una classe che preveda tutti i casi possibili rappresenta un'ottima soluzione riutilizzabile da richiamare con una semplice inclusione e le istanze dei metodi via via necessari.
Cominciamo subito col dare uno sguardo al codice della nostra classe:
<?php
// definiamo una costante per la pagina corrente
define("SELF", $_SERVER['PHP_SELF']);
// definiamo la classe
class Paging
{
// definiamo la pagina di partenza
function paginaIniziale($max_row)
{
if ((!isset($_GET['p'])) || ($_GET['p'] == "1"))
{
$parti_da = 0;
$_GET['p'] = 1;
}else{
$parti_da = ($_GET['p']-1) * $max_row;
}
return $parti_da;
}
// contiamo le pagine e stabiliamo quanti records devono essere impaginati
function contaPagine($conta, $max_row)
{
$pgg = (($conta % $max_row) == 0) ? $conta / $max_row : floor($conta / $max_row) + 1;
return $pgg;
}
// mostriamo l'elenco delle pagine
function listaPagine($p_corrente, $pgg)
{
$listapgg = "";
if (($p_corrente != 1) && ($p_corrente))
{
$listapgg .= " <a href=\"".SELF."?p=1\">Prima pag.</a> ";
}
if (($p_corrente-1) > 0)
{
$listapgg .= "<a href=\"".SELF."?p=".($p_corrente-1)."\"><</a> ";
}
for ($i=1; $i<=$pgg; $i++)
{
if ($i == $p_corrente)
{
$listapgg .= "<b>".$i."</b>";
}else{
$listapgg .= "<a href=\"".SELF."?p=".$i."\">".$i."</a>";
}
$listapgg .= " ";
}
if (($p_corrente+1) <= $pgg)
{
$listapgg .= "<a href=\"".SELF."?p=".($p_corrente+1)."\">></a> ";
}
if (($p_corrente != $pgg) && ($pgg != 0))
{
$listapgg .= "<a href=\"".SELF."?p=".$pgg."\">Ultima pag.</a> ";
}
$listapgg .= "</td>\n";
return $listapgg;
}
// permettiamo la navigazione per pagine precedenti e successive
function precedenteSuccessiva($p_corrente, $pgg)
{
$impaginazione = "";
if (($p_corrente-1) <= 0)
{
$impaginazione .= "Precedente";
}else{
$impaginazione .= "<a href=\"".SELF."?p=".($p_corrente-1)."\">Pag. precedente</a>";
}
$impaginazione .= " | ";
if (($p_corrente+1) > $pgg)
{
$impaginazione .= "Prossima";
}else{
$impaginazione .= "<a href=\"".SELF."?p=".($p_corrente+1)."\">Prossima pag.</a>";
}
return $impaginazione;
}
}
?>
Quello che vogliamo ottenere è un sistema di impaginazione e numerazione di tipo classico:
1 | 2 | 3 | ...la nostra classe è inoltre in grado di evidenziare e non linkare la pagina corrente, di permettere gli spostamenti per pagine precedenti e successive (i classici links "Next" e "Prev" che nel nostro caso sono chiamati "Prossima pag." e "Pag. precedente") e di accedere velocemente alla prima e all'ultima pagina qualsiasi sia la posizione corrente.
La navigazione per numero di pagina e quella per pagine precedenti e successive sono regolate da funzioni diverse. Sarà quindi possibile abilitare anche solo uno dei tipi di impaginazione.
| Corso Linux Guida completa al sistema open-source. A partire da 39 €. | |
| Corso MySQL Gestione del database open-source. A partire da 49 €. | |
| Corso PHP Corso completo per la creazione di siti Web dinamici. Sconto -25% sino al 15/02/2012. |