Pagina 1 di 28 1 2 3 11 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 278
  1. #1

    [PILLOLA] Gestire le paginazioni (riveduta e corretta)

    Avevate letto la mia vecchia pillola e vi si rizzavano i capelli man mano che andavate avanti?

    Come promesso + volte, ecco la versione mooooolto meno fagiana... e moooolto + chiara [spero ]

    All'epoca della pillola [manco a farlo apposta quasi un anno fa esatto ] ero poco + che analfabeta in PHP.. adesso che ho ordinato meglio le idee sia sul PHP [sono arrivato alla licenza elementare ] in se stesso che sul problema della paginazione provo a spiegare meglio la cosa.

    Chiariamo innanzitutto che ci sono due tipi di paginazione:
    [list=1][*]Paginazione da query: è sicuramente la + comoda e sull'argomento è stato scritto un ottimo articolo su freephp ad opera del maestro gm.. per cui non mi dilungo ulteriormente se non per sottolineare il fatto che questo tipo di paginazione richiede due interrogazioni del database, a discapito dell'efficienza.. inoltre credo (smentitemi in caso) che le istruzioni usate non siano standard SQL, e quindi non valide per tutti i tipi di database.
    [*]Paginazione da script: questo è il tipo di paginazione che vedremo nel dettaglio, assieme ad un sistema di gestione dei link alle varie pagine dei risultati... rispetto alla prima versione della pillola la cosa è stata notevolmente migliorata [/list=1]


    Cominciamo dunque con il distinguere i due problemi di visualizzazione di un numero di dati limitato ad un intervallo determinato dalla pagina richiesta, e dicreazione dinamica dei link... partiamo proprio da quest'ultimo.

    Creazione dei link
    Personalmente uso un sistema di creazione dinamica dei link incluso in un file esterno, che crea il minimenù nel punto di inclusione generando dinamicamente un numero di link configurabile ad altrettante pagine generate dalla vostra interrogazione e dalla nostra paginazione....
    Ok, è poco chiaro... faccio un esempio: ponendo di avere 3 pagine ci aspettiamo di creare dei link fatti + o meno così: "pag1 - pag2 - pag3"... ma se avessimo 100 pagine? sarebbe scomodo, per non dire improponibile, elencare tutti e 100 i link... il sistema quindi elenca un numero ristretto di link a pagine vicine alla pagina corrente (oltre a degli shrt link alla prima e all'ultima pagina).... ad esempio se fossimo a pagina 48 di 100.. avremmo "pag46 - pag47 - pag48 - pag49 - pag50"... con la pagina corrente evidenziata in colore diverso (mediante l'uso di una classe di stile)

    In + la versione attuale del sistema permette di gestire facilmente la propagazione delle query string. Questo perchè? Ci sono script che di default elencano tutti i dati contenuti nel database, ma in casi particolari [come quello di una ricerca, o dell'ordinamento] devono usare delle query string per modificare la visualizzazione... senza l'attuale modifica, la visualizzazione sarebbe stata modificata solo nella prima pagina, e il resto dei record sarebbe stato mostrato normalmente, e non nel modo desiderato.

    Bando alle ciance e vediamo il codice... che a parte delle piccole impostazioni iniziali è solo una serie metodica di condizionali che prevedono i possibili casi... mi limiterò a commentare le parti significative.

    Codice PHP:
    /*
    salvate tutto il seguente codice in un file esterno e chiamatelo ad esempio paginazione.inc.php

    Create una classe di stile chiamata "selected" e assegnatele un
    colore diverso da quello dei normali link, sarà usato per indicare la pagina corrente nel minimenu' dei link. 
    */

    //inizializzo come stringa vuota una variabile querystring che 
    //appendo sempre ai miei link... quindi la lascio vuota se non mi 
    //serve, la modifico come spiegato più avanti se mi serve
    $querystring "";

    //eventuale modifica alla query string
    //OMESSA PER ORA

    //numero di link da visualizzare.. chiaro no? 
    $n=5

    #tutto il codice seguente non richiede configurazioni :)
     
    $pag = isset($_GET)? $_GET['pag'] : $HTTP_GET_VARS['pag'];
     if (!
    $pag){$pag=1;}//apre di default la prima pagina se non è impostata la variabile $pag
       
         
    if($numpag <= $n)
            {
             if (
    $pag>1)
                {
                    echo(
    "<A HREF=?pag=".($pag-1)."$querystring><</A>");
                }        
             for (
    $pagina 1$pagina <= $numpag$pagina++)
                {
                 if (
    $pagina == $pag)
                   {
                    echo(
    "<SPAN CLASS=selected>$pagina </SPAN>&nbsp");
                   }
                 else
                   {
                      echo(
    "[url="?pag=$pagina$querystring"] $pagina [/url]&nbsp");
                   }
                }
             if (
    $pag<$numpag)
                {            
                 echo(
    "<A HREF=?pag=".($pag+1)."$querystring>></A>");
                }
            }
            
          else if(
    $pag <= ceil($n/2))//prime pag --> stampa primi n
                 
    {
                   if (
    $pag>1)
                     {
                      echo(
    "<A HREF=?pag=".($pag-1)."$querystring><</A>");
                     }             
                  for (
    $pagina=1$pagina<=$n$pagina++)
                      {
                           if (
    $pagina == $pag)
                         {
                          echo(
    "<span CLASS=selected> $pagina </span>&nbsp");
                         }
                       else
                         {
                            echo(
    "[url="?pag=$pagina$querystring"] $pagina [/url]&nbsp");
                         }
                      }
                  echo(
    "<A HREF=?pag=".($pag+1)."$querystring>></A>");                  
                  echo(
    "[url="?pag=$numpag$querystring"] >> [/url]&nbsp");                  
                 }
                 
               else if(
    $pag>$numpag-ceil($n/2))//ultime pag --> stampa ultimi n
                     
    {
                      echo(
    "[url="?pag=1$querystring"] << [/url]&nbsp");
                       echo(
    "<A HREF=?pag=".($pag-1)."$querystring><</A>");              
                      for (
    $pagina=$numpag-$n+1$pagina<=$numpag$pagina++)
                         {
                             if (
    $pagina == $pag)
                             {
                              echo(
    "<span class=selected> $pagina </span>&nbsp");
                             }
                           else
                             {
                                echo(
    "[url="?pag=$pagina$querystring"] $pagina [/url]&nbsp");
                             }
                         }
                      if (
    $pag<$numpag)
                        {            
                         echo(
    "<A HREF=?pag=".($pag+1)."$querystring>></A>");
                        }
                     }
                                   
                       else 
    //pagine centrali --> stampa n/2 prima ed n/2 dopo
                       
    {
                        echo(
    "[url="?pag=1$querystring"] << [/url]&nbsp");
                         echo(
    "<A HREF=?pag=".($pag-1)."$querystring><</A>");                    
                          for (
    $pagina=$pag-ceil($n/2-1); $pagina<=$pag+ceil($n/2-1); $pagina++)
                          {
                             if (
    $pagina == $pag)
                             {
                              echo(
    "<span CLASS=selected> $pagina </span>&nbsp");
                             }
                           else
                             {
                                echo(
    "[url="?pag=$pagina$querystring"] $pagina [/url]&nbsp");
                             }
                          }
                         echo(
    "<A HREF=?pag=".($pag+1)."$querystring>></A>");
                         echo(
    "[url="?pag=$numpag$querystring"] >> [/url] ");
                       } 
    Per la modifica [FACOLTATIVA] della querystring:
    poniamo che abbia fatto un motore di ricerca e lo script mi serva per paginare i risultati. E' chiaro che se la mia pagina prenderà una variabile chiamata $chiave che indichi la chiave di ricerca, questa vada passata A TUTTE LE PAGINE della stampa dei risultati, e non solo alla prima pagina.

    Come fare?

    Semplicissimo:
    if ($chiave != '') $querystring .= "&chiave=$chiave";

    in questo modo la querystring appesa ai link non è + vuota, e fa il suo dovere.

    Sorge però un potenziale problema al di fuori di questo file, ovvero nello script che lo include: la variabile letta da query string è passata con il metodo GET... invece il form per il motore di ricerca che abbiamo ipotizzato potrebbe funzionare con il metodo POST.. avremmo quindi che nella prima pagina la variabile proverrà da un POST, nelle seguenti da un GET... la cosa ci crea qualche problema con le recenti versioni PHp in quanto di default è disattivata la registrazione delle variabili globali e dovremmo estrarre la variabile dall'opportuno array.. ma dato che questo array potrebbe variare, come fare? Beh.. semplice... se non siete certi che il metodo con cui passate variabili usate nell'interrogazione del database sia il metodo GET... nella pagina in cui è inclusa la paginazione usate assegnazioni del genere prima di usare queste variabili:

    $chiave = isset($_POST['chiave'])? $_POST['chiave'] : $_GET['chiave'];

    Ovviamente dovrete farlo per ogni variabile cambiando la parola "chiave" con il nome della variabile in questione.

    E questo è davvero tutto sulla creazione del menu dinamico di link alle pagine.

    Estrazione dal database
    Passiamo quindi alla vera e propria estrazione dal database e la conseguente visualizzazione di un intervallo di dati variabile in base alla pagina corrente. C'è davvero poco da dire e poco da capire... il grosso ce lo siamo preparato con il codice precedente... non dobbiamo fare altro che interrogare il database, otenere il numero dei record e qundi il numero delle pagine, includere lo script precedente, e gestirci un ciclo.
    Vediamo il codice:
    Codice PHP:
    /*
    le modifiche da apportare sono pochissime:
    - configurare a piacimento la variabile $recordxpag 
    - configurare una variaile $query con il codice SQl per l'interrogazione del database
    - Inserire nel punto opportuno il messaggio di avviso in caso di nessun dato trovato
    - Inserire nel punto opportuno il codice che stampa i vostri record dopo averli manipolati come meglio credete
    */

    //per comodità configuriamo qui delle variabili che ci può essere utile modificare:
    //la seguente variabile indica quanti record vogliamo mostrare per ogni pagina.. chiaro no? 
    $recordxpag 5;
    $query "SELECT * FROM tabella";


    //interrogazione del database:
    //quale che sia la vostra query avremo una situazione del genere:
    $res mysql_query($query);
    $righe mysql_num_rows($res);

    $numpag ceil($righe/$recordxpag);
    //con l'ultima istruzione otteniamo il numero di pagine necessarie a
    //visualizzare un numero di record per pagina pari al valore della
    //relativa variabile
     
    //nel punto in cui preferite, ma dopo l'interrogazione del database
    //[volendo anche dopo la visualizzazione dei dati che vedremo a breve]
    //includiamo lo script visto in precedenza che ci crea, come detto,
    //un piccolo menu' di link alle altre pagine generate dalla nostra 
    //interrogazione del database.
    //ovviamente dovrete modificare eventualmente il path del file
    include('include/paginazione.inc.php');

    //per scrupolo ipotizziamo che la nostra interrogazione non abbia 
    //fornito risultati... chiaramente vogliamo segnalare la cosa
    //all'utente.. basta gestire un semplice condizionale
    if ($righe<1)
      {
       echo 
    "non ci sono dati";
       
    //gestite l'evento come meglio credete
      
    }
    else
    {
      
    //a questo punto cosa abbiamo a nstra disposizione?
      //Abbiamo una variabile $pag [creata dallo script incluso] che ci informa 
      //di quale sia la pagina corrente.. cosa ce ne facciamo?
      //semplice: ci basiamo su di essa e sul numero di record che
      //vogliamo mostrare in ogni pagina, per crearci i due estremi
      //dell'intervallo:

      //moltiplicando il numero di record per pagina, per la pagina
      //precedente, otteniamo il numero di record finora mostrati,
      //quindi quello da cui partire nella pagina corrente ;)
      
    $da = (($pag-1) * $recordxpag);

      
    //non credo ci siano difficoltà: il limite destro del nostro
      //intervallo, sarà il limite sinitro incrementato dell'intervallo stesso ;)
      
    $a $da $recordxpag;

      
    //quest'ultima condizione serve a dire allo script che se
      //nell'ultima pagina ci fossero meno record di quelli da visualizzare
      //si deve limitare all'ultimo record dispobnibile.
      //tradotto in algoritmo: se il limite destro dell'intervallo, va
      // oltre il numero dei record, poni il limite destro uguale al
      // numero dei record
      
    if ($a $righe){$a=$righe;}

     for (
    $i $da$i $a$i++)
       {
         
    //inserite qui il codice per la manipolazione e visualizzazione 
         //dei vostri dati   
       
    }



    et voilà... non è così difficile vero?

    Spero che questa pillola sia + chiara e semplice della precedente... di aver risolto definitivamente dei dubbi che ricorrevano spesso [come quello della propagazione delle query string]... e infine di aver coperto il maggior numero possibile di casistiche ^_^

    moderatori, lavorate: lucchettate la vecchia pillola e sostituite nel thread delle pillole.. su su.. che siete pagati per questo!

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    1,965
    Bravo, complimenti!!!
    Ma la pillola non è della mia portata... devo studiare




  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    34
    [COLOR= BLUE]bravo "Alunno }gu|do[z]{®©...olo" [/COLOR]

    la prima non ero mai riuscito ad utilizzarla ora mi leggo questa nuova e spero di capirla a differenza della prima ...

    un saluto dall'alunno delle 1^ Materna sez. "C....iucciarielli" ...

    *** *** ***
    La povertà è un dato di fatto. La ricchezza un opinione.

  4. #4
    Utente di HTML.it L'avatar di Ranma2
    Registrato dal
    Mar 2003
    Messaggi
    2,647
    Cercavo proprio questo :metallica

  5. #5
    Utente di HTML.it L'avatar di jubin
    Registrato dal
    Jan 2002
    Messaggi
    234

    Non male guido...

    e pensare che mi sono fatto il mazzo per fare la paginazione sul mio sito meno di due mesi fa...
    vabbe'...

    (continua cosi' , vediamo se un giorno anche io riusciro' a raggiungere il tuo livello di analfabetismo )

  6. #6
    Bella la pillolina, ma c'è qulache pagina dove sia stata messa in pratica? Sono curioso di vedere il risultato finale, ma non ho tempo di provare lo script

  7. #7
    Originariamente inviato da stella11
    Bella la pillolina, ma c'è qulache pagina dove sia stata messa in pratica? Sono curioso di vedere il risultato finale, ma non ho tempo di provare lo script
    attualmente tutti i miei lavori osno off line... cmq la uso nel mio guestbook [inutile che vai a scaricare quello vecchio... è quasi finito quello nuovo]... da vedere c'è poco.. graficamente crea solo i classici link alle pagine.. gli stessi che puoi vedere qui sul forum.. stessi criteri.. in numero configurabile.

  8. #8
    Utente di HTML.it L'avatar di Ranma2
    Registrato dal
    Mar 2003
    Messaggi
    2,647
    Mi da questo errore

    Warning: Supplied argument is not a valid MySQL result resource in ...

    in questa riga

    $righe = mysql_num_rows($res);

    Cosa posso aver sbagliato?

  9. #9
    Grande }gu|do[z]{®©,
    mi ero letto a suo tempo la tua vecchia pillola e con un po' di fantasia me la ero personalizzata.

    Ora mi leggerò anche questa pillola e vediamo se riesco ad imparare qualcosa in più.

    Ciauzz....
    GNU/Linux is the answer...now, what was your question?

  10. #10
    Originariamente inviato da Ranma2
    Mi da questo errore

    Warning: Supplied argument is not a valid MySQL result resource in ...

    in questa riga

    $righe = mysql_num_rows($res);

    Cosa posso aver sbagliato?
    hum.. strano :\

    scrivi echo mysql_error() dopo l'interrogazione e vedi se da qualche errore :\

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.