Paginazione dei dati estratti al database

Ciao vagazzi!  :D

Ho sfornato una libreria per la paginazione dei dati, magari può tornare utile a qualcuno! Brevemente vi spiego il funzionamento  e poi riporto il codice!

Si tratta di uno script che preleva i dati dal database e li ordina in base alle vostre preferenze. Inserendo lo script nelle vostre applicazioni vi verranno visualizzati dei link corrispondenti alle pagine in cui sono stati suddivisi i records del db. Allo stato attuale la libreria può funzionare con guestbook, gestione news e simili, non può suddividere, ad esempio, un articolo in più pagine.

Vi scrivo il codice, se poi qualcuno è interessato a capirne in dettaglio il funzionamento sono a disposizione:

<?php

class paginazione {
 
 var $query;
 var $exeQuery;
 var $records;
 var $eachChgPag;
 var $getData = array();
 var $allData;
 var $pagine;
 var $getVar;
 var $showPag;
 var $keepPag = array();
 var $startPage;
 var $numLinkstoPag;
   
   function paginazione($query, $eachChgPag, $getVar, $startPage, $numLinkstoPag) {
      
   $this->query = $query; 
   $this->exeQuery = $exeQuery;
   $this->records = $records;
   $this->eachChgPag = $eachChgPag;
   $this->getData = $getData;
   $this->allData = $allData;
   $this->pagine = $pagine;
   $this->getVar = $getVar;
   $this->showPag = $showPag;
   $this->kepPag = $keepPag;
   $this->numLinkstoPag = $numLinkstoPag;
   
   if(($this->getVar[pagina] == "") || $this->getVar[pagina] <= "1") {
      
   $this->getVar = $startPage;   
      
   }
      
   }

   function contaRecords() {
   
   ##Eseguo la query che mi viene passata tramite la funzione paginazione   
   $this->exeQuery = mysql_query($this->query);
   ##Conto i records restituiti
   $this->records = mysql_num_rows($this->exeQuery);
   
   return $this->records;    
      
   }

   function dataMatrix() {
   
   ##Scorro con i ciclo i records e li associo ad un array   
   while($this->allData = mysql_fetch_assoc($this->exeQuery)) {
   
   ##Racchiudo gli array con i dati di ogni record dentro ad un altro array
   $this->getData[] = $this->allData;   
   
   }

   return $this->getData;

   }

    ##Funzione per disabilitare le freccette destre quando si arriva all'ultima pagina
   function dxDisabled($pagLeft) {
    
    $this->pagLeft = $pagLeft;
      
    $this->leftArrow = "<a href=\"$_SERVER[PHP_SELF]?pagina=1\">&lt;&lt;</a> 
                    <a href=\"$_SERVER[PHP_SELF]?pagina=$this->pagLeft\">&lt;</a>";   
    $this->rightArrow = "&gt;&nbsp;&gt;&gt;";   
      
   }
   
   ##Funzione per disabilitare le freccette sinistre quando si arriva alla prima pagina
   function sxDisabled($pagRight) {
    
    $this->pagRight = $pagRight;
      
    $this->leftArrow = "&lt;&nbsp;&lt;&lt;";   
    $this->rightArrow = "<a href=\"$_SERVER[PHP_SELF]?pagina=$this->pagRight\">&gt;</a>
                     <a href=\"$_SERVER[PHP_SELF]?pagina=$this->pagine\">&gt;&gt;</a>";   
      
   }
   
   ##Funzione utile quando non vi eè necessità delle 2 precedenti
   function unDisabled($pagRight, $pagLeft) {
    
    $this->pagRight = $pagRight;
    $this->pagLeft = $pagLeft;
      
    $this->leftArrow = "<a href=\"$_SERVER[PHP_SELF]?pagina=1\">&lt;&lt;</a> 
                    <a href=\"$_SERVER[PHP_SELF]?pagina=$this->pagLeft\">&lt;</a>";   
    $this->rightArrow = "<a href=\"$_SERVER[PHP_SELF]?pagina=$this->pagRight\">&gt;</a>
                     <a href=\"$_SERVER[PHP_SELF]?pagina=$this->pagine\">&gt;&gt;</a>";   
      
   }

   function linkToPag() {
   
   ##Calcolo il numero di pagine in base ai records totali e al numero di records che         
   ##voglio visualizzare, valore passatomi dalla funzione paginazione
   $this->pagine = ceil($this->records / $this->eachChgPag);
   
   ##Inizio un ciclo che durerà tanto quante son le pagine
   for($i=1;$i<=$this->pagine;$i++) {
   
    if($i <= $this->numLinkstoPag) {
    
      ##Controllo la pagina selezionata che dovrà essere senza link
      if($i == $this->getVar[pagina]) {
      
      ##Associo il numero pagina senza link e la racchiudo in un array
       $this->keepPag[] = "$i";
      
      } else {
    
       ##Associo un link al numero pagina e la racchiudo in un array
       $this->keepPag[] = "<a href=\"$_SERVER[PHP_SELF]?pagina=$i\">$i</a>";
    
      }
   
    } 
    
    ##Calcolo la pagina precedente - per freccetta   
    $this->pagLeft = $this->getVar[pagina] - 1;
    ##Calcolo la pagina successiva - per freccetta
    $this->pagRight = $this->getVar[pagina] + 1;
    
    ##Controllo se è necessario disabilitare le freccette destre
    if($this->getVar[pagina] == $this->pagine) {
    
    ##Disabilito le freccette destre
    $this->dxDisabled($this->pagLeft);      
   
    ##Controllo se è necessario disabilitare le freccette sinistre      
    } elseif($this->getVar[pagina] <= "1") {
   
    ##Disabilito le freccette sinistre
    $this->sxDisabled($this->pagRight);    
   
    } else {
    
    ##Non disabilito alcuna freccetta   
     $this->unDisabled($this->pagRight, $this->pagLeft);
          
    }
    
   }

   ##Utilizzo la funzione implode per mostrare i link in modo ordinato con un separatore -
   ##Tutto questo per non ottenere una cosa tipo (1 - 2 - 3 -) ma per avere (1 - 2 - 3)
   $this->showPag = "".$this->leftArrow." &nbsp;&nbsp;".implode(" - ", $this->keepPag)." &nbsp;&nbsp;".$this->rightArrow." &nbsp;&nbsp;Pagina corrente: ".$this->getVar[pagina]."";
   
   return $this->showPag;   
      
   }
?>

Questa è la "mente" della libreria  :2funny: copiaincollate (voce del verbo copiaincollare) il codice e salvatevi un file chiamato for example paginazione.class.inc.php

Di seguito la spiegazione su come utilizzare la libreria:

Prima di tutto includete la libreria nel vostro script:

include("paginazione.class.inc.php");

Specificate il percorso corretto se salvate il file libreria in una cartella diversa da quella in cui è salvato il vostro script.

Adesso create una variabile chiamata $query contenente appunto  la query per la selezione dei dati, for example:

$query = "SELECT * FROM tabella ORDER BY id DESC;

Poi è necessario creare un oggetto che ci servirà a richiamare le funzioni della classe della nostra libreria (così iniziate pure a masticare quaccheccosa di OOP)  O0

In questo modo:

$pg = new paginazione($query, '1', $_GET[pagina], '1', '10');

I valori tra parentesi sono necessari per il corretto funzionamento della libreria. Tali valori sono dei parametri passati alla classe paginazione ed in ordine da sinistra verso destra corrispondono a:

1 - La query.

2 - Il numero di records da visualizzare in ogni pagine.

3 - Numero pagina corrente / cliccata.

4 - Pagina di partenza (impostare a 1).

5 - Numero di link alle pagine.

Nel momento in cui utilizzate la libreria vi verranno visualizzati i link alle pagine in questo modo:

<< < 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 > >>

10 numeri perchè nell'esempio è utilizzato il numero 10, se inserissimo 5 avremmo:

<< < 1 - 2 - 3 - 4 - 5  > >>

E sarà possibile selezionale le pagine superiori a quelle visualizzate semplicemente cliccando sulle freccine.

Ora all'interno del vostro script createvi una funzione con un nome a piacimento, io la chiamerò showResults e inseriteci il codice seguente:

function showResults() {

##$pg varia in base al nome che avete assegnato all'oggetto - vale anche per le righe sottostanti

global $pg;
      
   $pg->refArray = $pg->getVar[pagina] * $pg->eachChgPag;
   $pg->refArray = $pg->refArray - $pg->eachChgPag;
   
   $j = $pg->refArray;
   
   for($i=1;$i<=$pg->eachChgPag;$i++) {
   
      if($pg->getData[$j] != "") {
    
      ##Qui dobbiamo inserire la riga della nostra tabella che verrà generata dal ciclo for
        
        $j++;
   
       }   
    
   }   
    
}

Di seguito inserirò il codice completo con un esempio al posto del commento.

Arrivati a questo punto vi create una tabella html per organizzare i dati estratti dal db, for example:

echo"
<table border=\"1\"  cellspacing=\"0\" cellpadding=\"3\" width=\"100%\" bgcolor=\"#878777\">
<tr>
<td>Icona:</td>
<td>News:</td>
<td>Data:</td>
<td>Autore:</td>
</tr>";

Subito dopo richiamate la funzione showResults:

showResults();

e chiudete la tabella html:

echo"</table><br>";

Infine visualizzate i link alle pagine:

echo $pg->showPag;

Vediamo in codice completo, giutso per rendere tutto più chiaro:

<?php

include("paginazione.class.inc.php");

$query = "SELECT * FROM news ORDER BY news_id DESC";

$pg = new paginazione($query, '3', $_GET[pagina], '1', '3');

$pg->contaRecords();
$pg->dataMatrix();
$pg->linkToPag();


function showResults() {

##$pg varia in base al nome che avete assegnato all'oggetto - vale anche per le righe sottostanti

global $pg;
      
   $pg->refArray = $pg->getVar[pagina] * $pg->eachChgPag;
   $pg->refArray = $pg->refArray - $pg->eachChgPag;
   
   $j = $pg->refArray;
   
   for($i=1;$i<=$pg->eachChgPag;$i++) {
   
      if($pg->getData[$j] != "") {
    
      echo"
      <tr>
      <td>".$pg->getData[$j][icona]."</td>
      <td>".$pg->getData[$j][news]."</td>
      <td>".$pg->getData[$j][data]."</td>
      <td>".$pg->getData[$j][autore]."</td>
      </tr>";
        
        $j++;
   
       }   
    
   }   
    
}


echo"<table border=\"1\" bordercolor=\"#ffffff\" cellspacing=\"0\" cellpadding=\"3\" width=\"100%\" bgcolor=\"#878777\">
<tr>
<td>Icona:</td>
<td>News:</td>
<td>Data:</td>
<td>Autore:</td>
</tr>";

showResults();

echo"</table><br>";
echo $pg->showPag;

?>

Sarà possibile richiamare i dati del db utilizzando l'array $pg->getData.

Tale array dovrà avere la seguente forma: $pg->getData[$j][nome_campo_tabella]

In questo esempio infatti aggiungiamo una riga di tabella con i dati del db inserendo questo codice nel ciclo for:

      echo"
      <tr>
      <td>".$pg->getData[$j][icona]."</td>
      <td>".$pg->getData[$j][news]."</td>
      <td>".$pg->getData[$j][data]."</td>
      <td>".$pg->getData[$j][autore]."</td>
      </tr>";

icona, news, data, autore corrispndono ai campi della tabella presente nel db.

E' tutto vagazzi, spero di essere sato spiegato  :2funny: fate tutte le domande che volete se qualcosa non vi è chiaro, perdonatemi ma vado un po' di fretta!  O0

inviato 9 anni fa
Lex84
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda