Pagina 1 di 5 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 41
  1. #1

    [PILLOLA] Impaginazione su colonne

    Leggendo alcuni interventi sul forum ho visto che la maggior parte dei codici usati per impaginare i risultati di una query, su due o più colonne, non generavano un html pulito.

    Molto spesso, magari per colpa del numero dispari dei risultati, c'erano tr non chiusi e lasciati aperti e così via.

    Intendiamoci, nella maggior parte dei browser questo non crea grossi problemi (a parte una riga invisibile che non dovrebbe esserci) ma se volete un codice pulito a prescindere dal numero di risultati bisogna fare un po' di semplici calcoli matematici.
    Io l'ho dovuto fare per alcuni script e quindi rendo pubblico.... sono finiti i tempi in cui gm mi passò un suo codice che faceva la stessa cosa


    Come al solito il mio è solo un esempio di codice... ce ne sono di migliori in giro e questo può essere sicuramente migliorato.

    Codice PHP:
    //partiamo dalla query per selezionare i dati
    $query = @mysql_query("FATE VOBIS");

    //con mysql_num_rows contiamo i risultati ottenuti. 
    //questo valore ci servirà per la paginazione
    $num_record mysql_num_rows($query);

    //adesso dichiaro un po' di variabili utili allo script

    //colonne è il numero di celle per riga che dovà avere la nostra tabella
    $colonne 3;

    //calcoliamo le righe della tabella che ci dovrebbero venire in base al numero di record
    /*se ho 6 risultati e ho scelto 3 celle per riga avrò due righe totali*/
    $tot_righe $num_record/$colonne;

    //dichiaro tre indici che mi serviranno
    $i_x 0;
    $x_x 0;
    $k_x 0;

    /*questo mi serve per determinare la lunghezza delle celle della tabella. 
    questo valore deve essere variabile ovviamente in base al numero di colonne. 
    mi spiego: se ho due colonne la singola cella dovrà 
    essere lunga il 50%; se metto tre colonne 
    dovrà essere il 33% e così via*/
    $cell_width floor(100/$colonne);


    //adesso scrivo il codice di inizio tabella
    echo
    '<table width="80%" border="0" cellspacing="1" cellpadding="3">
     <tr>'
    ;

    //adesso scorriamo i risultati ottenuti con un ciclo while
            
    while($array mysql_fetch_array($query)){

    //incremento gli indici perchè mi serviranno dopo
    $i_x++;
    $k_x++;
    $x_x++;

    //stampo le celle dei risultati
    echo'<td width="$cell_width%">$array[nome]</td>';

    /*ogni volta che l'indice $i_x è uguale al numero 
    di colonne scelto vuol dire che devo chiudere una riga*/
    if($i_x == $colonne) {
        
        echo
    '</tr>';
        
    /*se invece l'indice $i_x è uguale al numero di colonne
    scelto ma l'indice $x_x diviso le colonne è diverso 
    dalle righe che dovremmo avere vuol dire che ci sono 
    ancora dei risultati da stampare. quindi apro una nuova riga*/

    if ($i_x == $colonne && (($x_x/$colonne) != $tot_righe)) {

            echo
    '<tr>'

                 
    }
    //riazzero l'indice $i_x per riniziare i calcoli fin quando mi serve
    $i_x 0;
                                        } 
    // fine $i_x == $colonne

    //fine del ciclo

    /*a questo punto devo vedere che tipo di tabella mi è venuta fuori. 
    in pratica devo vedere se ci sono delle celle vuote 
    da stampare oppure posso chiudere la tabella. 
    per fare questo faccio due controlli

    se il numero di celle scelte per riga è superiore ai risultati ottenuti per riga stampo o meno le celle mancanti.
     
    questo può succedere perchè magari abbiamo scelto di 
    avere 3 celle per riga ma i risultati ottenuti sono 4 
    e quindi c'è l'inizio di una seconda riga che 
    deve avere per forza tre celle... 
    un po' contorto ma dovreste aver capito*/

    if ($colonne <= $x_x){

    /*stampo le celle mancanti se la divisione dei risultati per le colonne dà il resto. 
    questo vuol dire appunto che 
    ci sono meno risultati per riga rispetto alle celle scelte*/
    if (($k_x%$colonne) != 0){

        
    $indice $k_x;

    /*inizio un breve ciclo che in pratica fa questo: 
    "per ogni riga, se vedi che i risultati ottenuti 
    sono inferiori alle celle scelte con $colonne, 
    stampami delle celle vuote fino ad arrivare 
    al completamento della riga*/
    while (($indice%$colonne) != ){

    echo
    '<td>[img]immagine_vuota.gif[/img]</td>';

    //incremento il nuovo indice per ripetere l'operazione fin quando necessario
    $indice++;

                 } 
    //fine ciclo while

    /*se invece la divisione non dà resto vuol dire che 
    il numero di risulati va bene in base alle celle scelte
     (ad esempio 3 celle per riga con 6 risulati: 6/3 = 2)*/

      
    if(($indice%$colonne) == ){

    echo
    '</tr>';
             
              }

            } 
    //fine ($k%$colonne)!= 0

                   
    /*stessa cosa qui: il numero di risulati va bene in base
    alle celle scelte e quindi posso chiudere la riga*/
    } else{ //fine if $colonne <= $x
     
    echo '</tr>';
                    
                     }

    //adesso posso finalmente chiudere la tabella
    echo '</table>'


    questo stesso ciclo, con quale piccola modifica,
    può essere adattato anche senza database..
    magari scorrendo i risultati dopo aver letto il contenuto di una cartella. io l'ho usato nella saibal_gallery per esempio.

    ho scritto il codice senza provarlo...spero di non aver sbagliato qualcosa o aver dimenticato qualche parentesi aperta.

    enjoy it!
    w la topa

  2. #2
    Utente di HTML.it L'avatar di RokStar
    Registrato dal
    Dec 2001
    Messaggi
    937
    Anche io avevo fatto uno script per la paginazione su colonne.... ma dato che l'hai postato te fa niente =)
    che ce l'hai tre e cinco? Tre e cinco?!?

  3. #3
    bhè... puoi sempre postarlo. male non fa
    w la topa

  4. #4
    Appena ho un po' di tempo me la studio x benino

    Io sono alle primissime armi in PHP, avevo provato ad incollonare così:

    Codice PHP:
    <?
    if ($num_ris3>0) {
    mysql_data_seek($ris3,0);

    $i=0;
    while (
    $row3 mysql_fetch_object($ris3)) {
    echo
    '                                                        
                                                                
                                                                    <td class="bordo1" width="50" height="70" valign="top">[img]'
    .$row3->foto.'[/img]</td>
                                                                    <td height="70" valign="top" align="left"><font face="verdana" size="1">'
    .$row3->tipo.'
    '
    .$row3->nome.' '.$row3->cognome.'</font></td>';
                                                                
                                                            
     
    $i++;
            if (
    $i%== 0)
                echo 
    "<TR>";

    }
    }
    ?>
    Che dici, grande Saibal?
    Fa proprio pena vero?

  5. #5
    Aggiunta al thread in rilievo :adhone:
    Addio Aldo, amico mio... [03/12/70 - 16/08/03]

  6. #6
    x coach

    non è che fa pena però con un codice così avrai sempre un <tr> aperto che non dovrebbe esserci...

    inoltre se hai 3 celle ma 4 risultati avrai una tabella non proprio pulita come codice html
    w la topa

  7. #7

  8. #8
    Utente di HTML.it L'avatar di chris
    Registrato dal
    Sep 1999
    Messaggi
    1,568
    faccio la mia piccola aggiuntina, anche se non riguarda strettamente l'argomento della pillola

    spesso si vuole poter dividere un testo unico in modo da impaginarlo su due colonne, questa funzioncina prende un testo e ritorna le due parti:

    codice:
    function dividiInDue($testo){
        $len = strlen($testo);
        $centro = intval($len / 2);
    
        if( $centro == ' ' ){
            $pos = $centro;
        }
        else{
            $l = strrpos(substr($testo, $centro), ' ');
            $r = strpos($testo, ' ', $centro);
       
            $pos = (abs($centro-$l) >= abs($centro-$r)) ? $r : $l;
        }
    
        return array(substr($testo, 0, $pos), substr($testo, $pos+1));
    }
    "Nei prossimi tre anni col mio governo vogliamo vincere anche il cancro, che colpisce ogni anno 250.000 italiani e riguarda quasi due milioni di nostri concittadini"

  9. #9
    Tutti d'accordo che saibal e' un mago, (sicuramente nelle pubblic relation) ma come hai fatto a trasformare:

    //dichiaro tre indici che mi serviranno
    $i = 0;
    $x = 0;
    $k = 0;

    in:

    //incremento gli indici perchè mi serviranno dopo
    $i_x++;
    $k_x++;
    $x_x++;



    comunque utile. ed e' quello che conta.


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  10. #10
    Originariamente inviato da piero.mac
    Tutti d'accordo che saibal e' un mago, (sicuramente nelle pubblic relation) ma come hai fatto a trasformare:

    //dichiaro tre indici che mi serviranno
    $i = 0;
    $x = 0;
    $k = 0;

    in:

    //incremento gli indici perchè mi serviranno dopo
    $i_x++;
    $k_x++;
    $x_x++;



    comunque utile. ed e' quello che conta.


    scusa... ho sbagliato.

    correggo
    w la topa

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.