|
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;
var $items_total;
var $current_page;
var $num_pages;
var $mid_range;
var $return;
var $default_ipp = 25;
var $low;
var $high;
var $limit;
function Paginator()
{
$this->current_page = 1;
$this->mid_range = 7;
$this->items_per_page = (!empty($_GET['ipp'])) ? $_GET['ipp']:$this->default_ipp;
}
function paginate()
{
if($_GET['ipp'] == 'Toate')
{
$this->num_pages = ceil($this->items_total/$this->default_ipp);
$this->items_per_page = $this->default_ipp;
}
else
{
if(!is_numeric($this->items_per_page) || $this->items_per_page <= 0)
$this->items_per_page = $this->default_ipp;
$this->num_pages = ceil($this->items_total/$this->items_per_page);
}
$this->current_page = (int) $_GET['page'];
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;
$prev_page = $this->current_page-1;
$next_page = $this->current_page+1;
if($this->num_pages > 10)
{
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
$this->return = "<span class=\"inactive\" href=\"#\">« Inapoi</span> ";
$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;
}
$this->range = range($this->start_range,$this->end_range);
for($i=1;$i<=$this->num_pages;$i++)
{
if ($this->range[0] > 2 && $i == $this->range[0])
$this->return .= " ... ";
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 .= " ... ";
}
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
$this->return .= "<span class=\"inactive\" href=\"#\">» Inainte</span>\n";
if ($_GET['page'] == 'Toate')
$this->return .= "<a class=\"current\" style=\"margin-left:10px\" href=\"#\">Toate</a> \n";
else
$this->return .= "<a class=\"paginate\" style=\"margin-left:10px\" href=\"$_SERVER[PHP_SELF]?page=1&ipp=Toate\">Toate</a> \n";
}
else
{
for($i=1;$i<=$this->num_pages;$i++)
{
if ($i == $this->current_page)
$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> ";
}
$this->return .= "<a class=\"paginate\" href=\"$_SERVER[PHP_SELF]?page=1&ipp=Toate\">Toate</a> \n";
}
$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";
}
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)
$items .= "<option selected value=\"$ipp_opt\">$ipp_opt</option>\n";
else
$items .= "<option value=\"$ipp_opt\">$ipp_opt</option>\n";
}
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";
}
function display_jump_menu()
{
for($i=1;$i<=$this->num_pages;$i++)
{
if ($i == $this->current_page)
$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";
}
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.
|