[ php ]
Prima di tutto, definiamo 'paginazione'.
Per paginazione, da non confondere con 'impaginazione', si intende la suddivisione in pagine di un elenco.
Per esempio, se abbiamo un elenco di 100 prodotti, presentarli tutti in una sola pagina diventa assai scomodo e di non facile lettura.
Come si procede?
Per realizzare una paginazione sono necessarie alcune informazioni riguardanti i dati che dobbiamo gestire. Tra queste dobbiamo sapere il numero totale dei dati da visualizzare, il numero di dati da visualizzare per ogni pagina e, conseguenzialmente a queste prime due informazioni, il numero di pagine generate e la pagina corrente.
Partendo dal presupposto di sapere le prime due informazioni, possiamo ricavarci la terza, cioè il numero di pagine sviluppate; il calcolo da fare sarà:
$totali_pagine=ceil($dati_totali/$dati_per_pagina);
Abbiamo usato il metodo 'ceil', che restituisce un valore numerico arrotondato per eccesso.
Esempio pratico, se dovessimo avere 100 prodotti e volessimo visualizzare 15 prodotti per pagina, allo script di sopra corrisponderebbe:
$totali_pagine=ceil(100/15);
che restituirà 7.
Ovviamente abbiamo bisogno di arrotondare perché dobbiamo avere un numero intero e che sia sufficiente da comprendere tutti i prodotti.
E' necessario che la pagina corrente sia di volta in volta passata tramite link, e rappresenterà, in genere, l'unica fonte da cui calcolare tutto il resto della paginazione. Ovviamente si potrebbe adattare la paginazione per ricevere tramite link anche il numero di dati visualizzati, ma in questa occasione non prenderemo in considerazione questa possibilità.
A questo punto saremmo pronti per creare una paginazione di base, ma non ci accontentiamo; domanda: cosa accadrebbe se i dati da paginare fossero centinaia o migliaia? Accadrebbe che le pagine generate sarebbero tante, troppe. Il rimedio? Dare un tocco di dinamismo in più alla nostra paginazione. Facciamo in modo che visualizzi un numero massimo di pagine (con pagine ovviamente intendo i link alle stesse). Per fare ciò dobbiamo stabilire naturalmente il numero massimo di link visualizzati, lo facciamo tramite la variabile $max_link.
Dobbiamo quindi stabilire la pagina di partenza e la pagina finale visualizzati, cioè il numero minimo e quello massimo che devono essere stampati, oltre i quali andremmo a stampare dei puntini di sospensione (…).
Per il primo dato necessitiamo di un indice, per ottenerlo eseguiamo il seguente calcolo:
$i_start=floor(($max_link-1)/2);
Per il secondo una cosa analoga:
$i_end=ceil(($max_link-1)/2);
Possiamo quindi determinare il numero minimo e massimo che dovranno comparire:
if($pag<($max_link-$i_end)){
$page_end=$max_link;
}else{
$page_end=$pag+$i_end;
}
if($page_end>$pagine_totali){
$page_start=($pagine_totali-$max_link)+1;
}else{
$page_start=$pag-$i_start;
}
Aggiungiamo alcuni controlli per evitare di stampare i puntini quando non ce ne sia bisogno, quando cioè le pagine visualizzate (precedenti o successive a quella attuale) sono tutte (che rientrano quindi nel valore di $max_link).
Ma non siamo ancora contenti, un'altra piccola chicca che vogliamo aggiungere sono due link aggiuntivi, che portino, rispettivamente, alla prima e all’ultima pagina (ovviamente sempre che ci siano pagine non stampate).
Detto fatto:
if($pag>1 && $page_start>1){
$pagine="<a title=\"1\" href=\"index.php?pag=1\">[«]</a> ... | ";
}else{
$pagine="| ";
}
(omissis)
if($pag==$pagine_totali || $page_end>($pagine_totali-1)){
$pagine.="";
}else{
$pagine.="... <a title=\"$pagine_totali\" href=\"index.php?pag=$pagine_totali\">[»]</a>";
}
Bene, siamo arrivati alla parte 'calda' di questo articolo, ecco l’intero script:
if($dati_totali<=$dati_per_pagina){
$pagine=" 1 "; // non c'è bisogno di paginazione
}else{
$pagine_totali=ceil($dati_totali /$ dati _per_pagina);
$i_start=floor(($max_link-1)/2);
$i_end=ceil(($max_link-1)/2);
if($pag<($max_link-$i_end)){
$page_end=$max_link;
}else{
$page_end=$pag+$i_end;
}
if($page_end>$pagine_totali){
$page_start=($pagine_totali-$max_link)+1;
}else{
$page_start=$pag-$i_start;
}
if($pag>1 && $page_start>1){
$pagine="<a title=\"1\" href=\"index.php?pag=1\">[«]</a> ... | ";
}else{
$pagine="| ";
}
for($p=$page_start;$p<=$page_end;$p++){
if($p<=0 || $p>$pagine_totali){
}else{
if($p==$pag){
$pagine.="<b>$pag</b> | ";
}else{
$pagine.="<a href=\"index.php?pag=$p\">$p</a> | ";
}
}
}
if($pag==$pagine_totali || $page_end>($pagine_totali-1)){
$pagine.="";
}else{
$pagine.="... <a title=\"$pagine_totali\" href=\"index.php?pag=$pagine_totali\">[»]</a>";
}
}
scritto il 21/08/2005
« torna agli articoli