E-learn.ro
Panou utilizatori
Utilizator Parola
Creeaza cont nou    Recupereaza parola
Login
Newsletter
Introdu adresa ta de email
Inscrie-te
Inchide panoul de utilizatori
Add to Google

Tutoriale PHP

Descarca toolbar

Toolbar E-learn.ro Facebook Twitter

WEB DEVELOPMENT  /  PHP  /  Diverse (10)

Cum sa paginezi date in PHP

08.03.2009
Cum sa paginezi date in PHP

O problema ce trebuie rezolvata destul de frecvent este redarea unui set de date de dimensiuni mari. Fie ca este vorba de lista de clienti a unei mari companii sau un playlist cu mp3-uri, afisarea tutoror inregistrarilor pe o singura pagina nu este de dorit. Ce iti ramane de facut? Pagineaza.

Total vizualizari: 8845 8845 afisari   |   Comentarii  1   |   Rating   |   (3 voturi)   |   Timp necesar: 40 min 40 min   |   Nivel de cunostiinte necesar: Mediu  Mediu

Sursa:  www.nettuts.com  
Autor:  Jason
Download
Adauga la tutoriale favorit Adauga la tutoriale favorite
Pagina:
1 23 »
comenteaza printeaza

O problema ce trebuie rezolvata destul de frecvent este redarea unui set de date de dimensiuni mari. Fie ca este vorba de lista de clienti a unei mari companii sau un playlist cu mp3-uri, afisarea tutoror inregistrarilor pe o singura pagina nu este de dorit. Ce iti ramane de facut? Pagineaza.

Paginarea datelor

Paginarea consta in prelucrarea unui set de date si impartirea lor pe mai multe pagini pentru a fi mai usor de vizualizat.

Sa presupunem ca avem 500 de randuri de informatii pe care trebuie sa le afisam. Daca ele ar aparea pe o singura pagina, nu numai ca ar fi dificil pentru cineva sa le vizualizeze, dar majoritatea browserelor le-ar afisa dupa un timp prea lung (mai mult de cinci secunde). Pentru a rezolva aceasta problema poti crea un cod SQL care sa extraga seturi de date si butoane de tipul "inapoi" si "inainte" pentru a naviga printre pagini. Desigur, aceasta metoda de a integra codul in fiecare proiect nu este tocmai optima, deci ar fi de dorit definirea unei clase PHP care sa faca in mod automat toata aceasta munca.

Bazele de date

Mysql este unul dintre cele mai utile sisteme de baze de date, cu atat mai mult cu cat iti ofera pe http://dev.mysql.com/doc/#sampledb o serie de modele cu care poti sa experimentezi. Avantajul scriptului PHP pe care il vei crea este ca poate fi folosit cu orice baza de date. Cred ca esti de acord ca fara paginare ai putea ajunge la un rezultat final asemanator cu cel prezentat mai jos.

Deci trebuie sa incepi sa imparti datele in portiuni mici, usor de vizualizat, precum aceasta.

Frumos nu-i asa? Odata ce ai integrat clasa de paginare in codul tau, poti transforma foarte usor un set imens de date in pagini usor de navigat, si asta doar cu cateva linii de cod.

Paginator.class.php

In exemplul dat au fost folosite doar doua scripturi: scriptul reutilizabil de paginare si index.php.

<?php   
  
class Paginator{   
 
    var $items_per_page;     // numarul de elemente pe pagina ($_GET['ipp'] sau default_ipp)
    var $items_total;     // numarul total de elemente
    var $current_page;     // pagina curenta
    var $num_pages;    // numarul total de pagini
    var $mid_range;     // numarul de linkuri afisate pentru navigare     
    var $return;     // codul HTML pentru afisarea linkurilor
    var $default_ipp = 25;     // numarul de elemente pe pagina (default)
    
    // variabile pentru limitarea interogarii din baza de date
    var $low;   
    var $high;   
    var $limit; 
  
    // ----------------------------------------------------------------------------------- //
    
    // constructorul clasei
    function Paginator()   
    {   
        $this->current_page = 1;   
        $this->mid_range = 7;   
        $this->items_per_page = (!empty($_GET['ipp'])) ? $_GET['ipp']:$this->default_ipp;   
    }   
  
    // ----------------------------------------------------------------------------------- //
      
    // functie care afiseaza linkurile pentru navigare
    function paginate()   
    {   
        if($_GET['ipp'] == 'Toate')   
        {   
            // afiseaza toate inregistrarile pe o singura pagina
            $this->num_pages = ceil($this->items_total/$this->default_ipp);   
            $this->items_per_page = $this->default_ipp;   
        }   
        else  
        {   
            // daca items_per_page nu este numeric sau < 0, items_per_page ia valoare default
            if(!is_numeric($this->items_per_page) || $this->items_per_page <= 0) 
                $this->items_per_page = $this->default_ipp;   
                
            // nr. de pagini = nr. de elemente / nr. de elemente pe pagina    
            $this->num_pages = ceil($this->items_total/$this->items_per_page);   
        }   
        
        // pagina curenta ia valoarea $_GET['page'] din URL
        $this->current_page = (int) $_GET['page'];    
        
        // pagina trebuie sa fie o valoare numerica intre 1 si nr. total de pagini
        if($this->current_page < 1 || !is_numeric($this->current_page)) 
            $this->current_page = 1;   
        
        if($this->current_page > $this->num_pages) 
            $this->current_page = $this->num_pages;   
        
        // calculeaza numarul paginii anterioare si urmatoare
        $prev_page = $this->current_page-1;   
        $next_page = $this->current_page+1;   
  
        if($this->num_pages > 10)   
        {   
            // daca nu ne aflam pe prima pagina si numarul de elemente este > 10, atunci afisam linkul Inapoi            
            if ($this->current_page != 1 && $this->items_total >= 10)
                $this->return = "<a class="paginate" href="$_SERVER[PHP_SELF]?page=$prev_page&ipp=$this->items_per_page">« Inapoi</a> ";
            else
                // altfel linkul Inapoi este dezactivat
                $this->return =  "<span class="inactive" href="#">« Inapoi</span> ";   
  
            // calculeaza intervalul de linkuri care trebuiesc afisate (pagina curenta este la mijlocul seriei afisate)
            $this->start_range = $this->current_page - floor($this->mid_range/2);   
            $this->end_range = $this->current_page + floor($this->mid_range/2);   
  
            if($this->start_range <= 0)   
            {   
                $this->end_range += abs($this->start_range)+1;   
                $this->start_range = 1;   
            }   
            
            if($this->end_range > $this->num_pages)   
            {   
                $this->start_range -= $this->end_range-$this->num_pages;   
                $this->end_range = $this->num_pages;   
            }   
            
            // defineste intervalul
            $this->range = range($this->start_range,$this->end_range);   
  
            // parcurge toate paginile
            for($i=1;$i<=$this->num_pages;$i++)   
            {   
                if ($this->range[0] > 2 && $i == $this->range[0])
                    $this->return .= " ... ";   
                    
                // daca este prima pagina, ultima sau o pagina din interval, atunci afiseaza linkul  
                if ($i==1 || $i==$this->num_pages || in_array($i,$this->range))   
                {   
                    if ( $i == $this->current_page && $_GET['page'] != 'Toate') )
                        $this->return .= "<a title="Pagina $i din $this->num_pages" class="current" href="#">$i</a> ";
                    else
                        $this->return .= "<a class="paginate" title="Pagina $i din $this->num_pages" href="$_SERVER[PHP_SELF]?page=$i&ipp=$this->items_per_page">$i</a> ";   
                }   
                
                if ( $this->range[$this->mid_range-1] < $this->num_pages-1 && $i == $this->range[$this->mid_range-1] ) 
                        $this->return .= " ... ";   
            }   
            
            // daca nu ne aflam pe ultima pagina si numarul de elemente este > 10 si page != Toate, atunci afisam linkul Inainte
            if ($this->current_page != $this->num_pages && $this->items_total >= 10) && ($_GET['page'] != 'Toate'))
                $this->return .= "<a class="paginate" href="$_SERVER[PHP_SELF]?page=$next_page&ipp=$this->items_per_page">Inainte »</a>n";
            else
                // altfel linkul Inainte este dezactivat
                $this->return .= "<span class="inactive" href="#">» Inainte</span>n";   
            
            // daca sunt afisate toate elementele pe o singura pagina (page = Toate), atunci linkul Toate este dezactivat
            if ($_GET['page'] == 'Toate')
                $this->return .= "<a class="current" style="margin-left:10px" href="#">Toate</a> n";
            else    
                // altfel linkul Toate este dezactivat
                $this->return .= "<a class="paginate" style="margin-left:10px" href="$_SERVER[PHP_SELF]?page=1&ipp=Toate">Toate</a> n";   
        }   
        else  
        {   
            // daca avem mai putin de 10 pagini, afisam linkul pentru fiecare
            for($i=1;$i<=$this->num_pages;$i++)   
            {   
                if ($i == $this->current_page) 
                    // linkul pentru pagina curenta este inactiv
                     $this->return .= "<a class="current" href="#">$i</a> ";
                else
                    $this->return .= "<a class="paginate" href="$_SERVER[PHP_SELF]?page=$i&ipp=$this->items_per_page">$i</a> ";   
            }   
            
            // afiseaza linkul pentru Toate
            $this->return .= "<a class="paginate" href="$_SERVER[PHP_SELF]?page=1&ipp=Toate">Toate</a> n";   
        }   
        
        // limitele pentru interogarea bazei de date
        $this->low = ($this->current_page-1) * $this->items_per_page;   
        $this->high = ($_GET['ipp'] == 'Toate') ? $this->items_total:($this->current_page * $this->items_per_page)-1;   
        $this->limit = ($_GET['ipp'] == 'Toate') ? "":" LIMIT $this->low,$this->items_per_page";   
    }   
  
    // ----------------------------------------------------------------------------------- //
    
    // functie care afiseaza dropdown-ul pentru selectarea numarului de elemente pe pagina
    function display_items_per_page()   
    {   
        $items = '';   
        $ipp_array = array(10,25,50,100,'Toate');   
        
        foreach ($ipp_array as $ipp_opt) {
            if ($ipp_opt == $this->items_per_page)
                // afiseaza numarul curent de elemente pe pagina ca fiind selectat
                $items .= "<option selected value="$ipp_opt">$ipp_opt</option>n";
            else
                $items .= "<option value="$ipp_opt">$ipp_opt</option>n";   
        }        
        
        // returneaza codul html pentru meniul dropdown
        return "<span class="paginate">Randuri pe pagina:</span><select class="paginate" onchange="window.location='$_SERVER[PHP_SELF]?page=1&ipp='+this[this.selectedIndex].value;return false">$items</select>n";   
    }   
  
    // ----------------------------------------------------------------------------------- //
    
    // functie care afiseaza dropdown-ul pentru selectarea paginii
    function display_jump_menu()   
    {   
        for($i=1;$i<=$this->num_pages;$i++)   
        {   
            if ($i == $this->current_page)
                // afiseaza numarul paginii curente ca fiind selectat
                $option .= "<option value="$i" selected>$i</option>n";
            else
                $option .= "<option value="$i">$i</option>n";   
        }   
        
        return "<span class="paginate">Pagina:</span><select class="paginate" onchange="window.location='$_SERVER[PHP_SELF]?page='+this[this.selectedIndex].value+'&ipp=$this->items_per_page';return false">$option</select>n";   
    }   
 
    // ----------------------------------------------------------------------------------- //  
    
    // functie care returneaza codul HTML pt paginatie
    function display_pages()   
    {   
        return $this->return;   
    }   
}   
?>

Este un cod destul de lung, dar nu te ingrijora pentru ca in continuare vor fi explicate toate functiile.

Pagina:
1 23 »
comenteaza printeaza
Alte tutoriale PHP:
Noteaza acest tutorial
Rating tutorial
 
(3 voturi)
Pentru a nota acest tutorial, trebuie sa fii logat!
COMENTARII (1) spune-ti parerea
adrian , Duminica, 22 Martie 2009
#1

Este excelenta ideea ta .Chiar lucrez la o baza de date si aveam nevoie de asa ceva.Singura mea problema este ca nu-mi prea iese cu "pasul 3"(eu fiind de altfel incepator in php),nu stiu cum si unde sa introduc COUNT.Ti-as ramane indatorat daca ai putea sa imi dai ceva sfaturi in problema asta.Oricum,iti multumesc pentru codul postat.

Raporteaza acest comentariu ca injurios!
Posteaza un comentariu
Pentru a posta un comentariu, trebuie sa fii logat!
0 TOP UTILIZATORI* 0 0
Tutoriale scrise de claibornelara
claibornelara Rang utilizator claibornelara - Incepator
5340
Tutoriale scrise de mcuemica
mcuemica Rang utilizator mcuemica - Incepator
5300
Tutoriale scrise de ellarichards
ellarichards Rang utilizator ellarichards - Incepator
5135
Tutoriale scrise de emonclercheap
emonclercheap Rang utilizator emonclercheap - Incepator
5130
Tutoriale scrise de beacherrosa
beacherrosa Rang utilizator beacherrosa - Incepator
4875
* Acest top reprezinta punctajele acumulate in ultimele 30 de zile.
Fotografie SEO Lightroom StyleSheet Sony Vegas RoR HTML PHP PSD JSON Powerpoint Flash Vista Photoshop Javascript Swift 3D Fireworks Ruby on Rails AJAX Outlook COREL DRAW Java MySQL Dreamweaver CSS Illustrator Python XHTML Bridge Excel Action Script Word XML Gimp SWF Verilog
Promovare:
Daca faci parte din comunitatea E-learn.ro si doresti promovarea acesteia, poti accesa pagina de promovare.
Arhiva newsletter:
Daca ai ratat un numar mai vechi, sau vrei sa revezi care au fost noutatile E-learn.ro la un moment dat, poti accesa arhiva de newslettere.
  Copyright © 2008-2013 E-LEARN.ro. Toate drepturile rezervate. Termeni si conditii.
Conceput si realizat de Neokinetics Software