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: 8456 8456 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 2 3 »
comenteaza printeaza

Clasa Paginator

In primul rand, declara o clasa si da-i un nume. Defineste cateva proprietati dupa cum urmeaza:

<?php class Paginator{   
 
    var $items_per_page; // numarul de elemente pe pagina
    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; 
?>

Incepe aceasta clasa dandu-i un nume, in acest caz "Paginator" si definind variabilele (proprietatile) sale. Cand vei crea o instanta a acestei clase, obiectul respectiv va avea aceste proprietati. Una dintre ele ($default_ipp), care reprezinta numarul de inregistrari pe pagina, are valoarea default 25.

Clasa ta va avea cinci metode care vor face treaba cea mai grea. Ele sunt denumite: Paginator (constructorul clasei), paginate, display_items_per_page, display_jump_menu si display_pages.

Constructorul clasei

<?php 
function Paginator()   
{   
    $this->current_page = 1;   
    $this->mid_range = 7;   
    $this->items_per_page = (!empty($_GET['ipp'])) ? $_GET['ipp']:$this->default_ipp;   
} 
?>

Dupa cum am spus, functia Paginator este de fapt constructorul clasei, ceea ce inseamna ca ea va fi apelata in mod automat la crearea unui obiect. Pentru fiecare instanta a clasei sunt initializate o serie de proprietati, dintre care items_per_page reprezinta numarul de randuri afisate pe pagina, dat de variabila $_GET['ipp']. Daca variabila $_GET nu esta gasita in URL, atunci items_per_page va lua valoarea implicita data de default_ipp.

Functia paginate

Urmatoarea metoda, paginate, este punctul forte al clasei. Aceasta functie calculeaza numarul total de pagini, genereaza linkurile pentru pagini si aplica CSS pentru stilizare.

Prima parte a acestei metode determina numarul de pagini in functie de numarul de inregistrari si de numarul de randuri pe pagina. Mai intai, ea testeaza sa vada daca vrei sa afisezi toata inregistrarile pe o pagina, verificand daca a fost setat parametrul $_GET['Toate']. Daca da, pur si simplu afiseaza toate randurile pe o pagina, iar daca nu, calculeaza numarul de linkuri care vor trebui afisate. In plus, functia efectueaza si cateva validari pentru a se asigura ca numarul de randuri pe pagina este o valoare numerica.

<?php
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);   
}
?>

Urmatoarea parte verifica numarul paginii curente pentru a vedea daca are o valoare valida (intre 1 si numarul total de pagini), apoi calculeaza pagina anterioara si pagina urmatoare.

<?php
// 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;
?>

Restul metodei de paginare face munca cea mai grea. In primul rand, verifica daca exista mai mult de zece pagini (if($this->num_pages > 10)). Daca nu, atunci vor fi generate linkuri pentru fiecare pagina cu ajutorul unei bucle for. In plus, nu este necesar sa afisezi pagina anterioara sau urmatoare deoarece ai deja linkuri catre toate paginile.

<?php
// 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";
?>

Daca ai mai mult de zece pagini, in loc sa afisezi linkuri pentru fiecare in parte, vei afisa prima si ultima pagina si apoi o serie de pagini in jurul celei curente.

Acesta este momentul in care variabila $this->mid_range intra in joc. Ea spune paginatorului cate linkuri sa afiseze pentru a incadra pagina curenta. In mod implicit, acesta este stabilit la 7, dar il poti schimba asa cum doresti. Ca o observatie, valoarea medie ar trebui sa fie un numar impar pentru ca afisarea sa fie simetrica, dar poate lua orice valoare doresti.

Spre exemplu, sa consideram ca avem 4000 de randuri in total si vedem 50 de randuri de date pe pagina. Asta ar insemna ca sunt 79 de pagini de afisat, dar noi vom afisa trei pagini inainte si dupa pagina curenta.

Deci, daca suntem pe pagina 29, paginatorul va afisa 1, 26, 27, 28, 29, 30, 31, 32 si 79 (daca vrei sa treci direct la o pagina care nu este in seria afisata, nu te ingrijora, vei vedea cum sa faci asta putin mai incolo). Pe masura ce te apropii de limitele de inceput sau de sfarsit, afisarea se modifica de la sine astfel incat pagina curenta sa fie la mijlocul seriei afisate.

Indiferent de numarul de linkuri afisate, codul HTML pentru acestea este adaugat in proprietatea return a clasei Paginator.

Functia display_items_per_page

Urmatoarea functie, display_items_per_page, este o metoda optionala care afiseaza un meniu de tip drop down care sa permita utilizatorului sa schimbe numarul de inregistrari afisate pe o pagina. Valorile implicite pentru acest meniu sunt 10, 25, 50, 100 si Toate. Poti modifica valorile numerice dupa cum doresti, dar daca vrei ca optiunea Toate sa functioneze, ea trebuie sa ramana neschimbata.



<?php
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";   
} 
?>

Functia display_jump_menu

Urmatoarea metoda, display_jump_menu, este o alta metoda optionala care afiseaza un meniu de tip drop down care va lista toate paginile disponibile si permite utilizatorului sa ajunga direct la pagina la care doreste. Folosind exemplul dat anterior, daca am avea in total 79 de pagini de afisat, acest meniu de tip drop down le va afisa pe toate pentru ca utilizatorul sa o aleaga direct pe cea pe care sa o vizualizeze.

<?php
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";   
} 
?>


Functia display_pages

Ultima metoda, display_pages, este cea mai scurta, dar este una importanta. Aceasta returneaza codul HTML ce contine atat linkurile pentru pagini, cat si cele doua meniuri optionale descrise anterior. Trebuie sa apelezi aceasta functie macar o data pentru a afisa paginatia, dar ea poate fi folosita si de mai multe ori.

Pagina:
« 1 2 3 »
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
4670
Tutoriale scrise de mcuemica
mcuemica Rang utilizator mcuemica - Incepator
4590
Tutoriale scrise de ellarichards
ellarichards Rang utilizator ellarichards - Incepator
4510
Tutoriale scrise de emonclercheap
emonclercheap Rang utilizator emonclercheap - Incepator
4415
Tutoriale scrise de beacherrosa
beacherrosa Rang utilizator beacherrosa - Incepator
4290
* Acest top reprezinta punctajele acumulate in ultimele 30 de zile.
Lightroom Ruby on Rails Swift 3D PHP Sony Vegas CSS Action Script Gimp XHTML PSD XML Word Photoshop Fireworks AJAX COREL DRAW Bridge Java SEO RoR Illustrator MySQL Excel Dreamweaver Powerpoint Python HTML Vista Fotografie JSON Verilog Javascript Flash Outlook SWF StyleSheet
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