[sr] PHP Paginacija

Većina početnika se muči sa paginacijom u PHP-u. Obično to opisuju kao “ono što ima na sajtovima pa kada klikneš na broj ode na tu stranu” :) Evo najprostijeg primera kako to odraditi, postoje i naprednije tehnike ali se plašim da početnici, kojima je i namenjen ovaj tekst, ne bi lako razumeli, a oni koji nisu početnici to ionako već znaju.

Imate varijablu $page koja je na početku uvek 1 (ne moemo da brojimo strane od 0 – gde ste videli knjigu koja počinje od nulte strane :) ) a kasnije $_GET['page'] jer se prenosi kao GET parametar, zatim se racuna koliko ima recorda u tabeli na kojoj se radi i to na početku strane u svakom izvršenju scripta jer je moguce da se broj recorda promeni izmedju 2 egzekucije scripta.

na primer: "select count(*) AS Cnt from ime_tabele";

Dobije se, na primer $total_records = 475;
ako recimo odlučimo da imamo po 50 recorda po strani, postavimo varijablu

$records_per_page = 50;

i računamo:

$total_pages = ceil($total_records / $records_per_page);

Znači dobićemo u primeru ceil(9,5) što daje rezultat od ukupno 10 strana.

Zašto ceil (ceiling, eng. plafon)? Kada bi matematički zaokruivali (round()), dešavalo bi se da imamo podatke koji se nikada ne prikau. Na primer, za 55 record-a u tabeli, kada bi računali

$total_pages = round ($total_records / $records_per_page);

dobijamo $total_pages = round (1.1) što daje 1, očigledno pogrešan rezultat jer 55 recorda bi trebalo da proizvede 2 strane, 50 record-a prikazanih na prvoj i još 5 na drugoj strani.

Dalje, poređamo linkove:

for ($i = 1; $i < = $total_pages; $i++)
echo "<a href='".$_SERVER['PHP_SELF']."?page=".$i."'>$i ";

Dobićemo ispisane linkove: 1 2 3 4 5 6 7 8 9 10

Kada neko klikne na 3 prebacuje se varijabla $_GET['page'] = 3. Da bi saznali odakle-dokle treba da radimo mysql query, moramo još malo da računamo:

$from = ($_GET['page']-1) * $records_per_page

Zašto $page – 1? Zato što se recordi broje od 0 pa na dalje… Pošto smo odlučili da ne počinjemo paginaciju od strane 0, moramo da uvedemo slučaj za prvu stran, gde moraju biti prikazani podaci od 0 do 49.

Znači, za $page = 1 dobijemo $from = 0, za $page = 2, dobijemo $from = 50… itd. Zatim izvršimo mysql query:

"SELECT * FROM ... LIMIT $from, $records_per_page";

I to bi bilo to – ni malo komplikovano.

Hint: moramo da pazimo jer je moguće da imamo recimo 3045 strana što je totalno suludo prikazati kao linkove. Dakle, treba da odlučimo i koje strane prikazujemo pa stoga uvodimo još i $display_page_count = 20 pa će se uvek prikazivati samo 20 strana. Odakle – dokle? Opet malo matematike za osnovnu školu:

$page_start = $page - intval ($display_page_count / 2);
$page_end = $page + intval ($display_page_count / 2);

ali moramo da pazimo da ne odemo u minus, jer za $page = 3 dobićemo $page_start = -7 sto je glupo, pa radimo proveru:

if ($page_start < 1) $page_start=1;

ali onda opet moramo da promenimo i $page_end = $page_start + $display_page_count;

Isto tako moramo da proverimo da li je $page_end > $total_pages jer bi odveli posetioca na strane veće od maksimalnog broja strana: u našem primeru, za maksimalno 10 strana na strani 7 bi imali:

$page_end = $page + intval ($display_page_count / 2);

pa bi dobili $page_end = 7 + 10 = 17; što bi korisnika odvelo na nepostojeću 17. stranu od maksimalno 10. Ništa strašno se neće dogoditi, osim što će se prikazati strana bez rezultata. Da bi to sprečili, proveravamo:

if ($page_end > $total_pages) $page_end = $total_pages;

pa se pravilno ispisivanje linkova ka stranama (paginacija) u stvari radi ovako:

for ($i = $page_start; $i < = $page_end; $i++)
echo "<a href='".$_SERVER['PHP_SELF']."?page=".$i."'>$i ";

// napomena: ovo je pisano ovako iz glave, mozda ima neka slovna greska, da ne bude posle “kod ne radi”. Ako ste očekivali “gotov script” (jeim se od te dve reči)... sorry, ovo je namenjeno onima koji ele da nauče, pre nego onima koji vole sve gotovo i nemaju pojma šta tu piše i čemu slui.

Naravno, $page moe da se prenosi i kao POST parametar ali se to retko radi. Kod je skoro identičan.

Have fun :)

6 Responses to “[sr] PHP Paginacija”

  1. Janko Says:

    Joj odvratnog li prevoda “paginacija”. Nesmem ni da zamislim kako se ostale stvari kau na “srpskom”. Pa stavite ljudi PHP paging …. bolje all in english , nego ni tamo ni ovamo. :)

  2. bluesman Says:

    Paginacija je termin koji se koristi u izdavatvu i tampi mnogo pre nego to smo se ti i ja rodili. Zato bih ja izmiljao novi termin?

  3. Ljuba Says:

    Ovaj tip paginacije sam umeo i sam ranije da napravim.
    Zanima me kako se realizuje paginacija na velikim tekstualniom clancima npr. Benchmark.

    Da li korisnik sam bira sta ce ici na koju stranu?

  4. mVeliki Says:

    “Paginacija” je termin za obeležavanje (postojećih) stranica brojevima,
    isto što i “numerisanje”,
    piše u sva tri rečnika koja sam pogledao.

    Ovde je jednostavno pogrešna primena tog termina,
    ono što je ovde potrebno imenovati je naziv za proces razbijanja dugačke liste na više kraćih stranica sa navigacijom.

    Ja sam, eto slobode jer adekvatan termin ne postoji, to u svojim skriptama nazvao
    “straničenje”, a klasu “Stranicar”.

  5. DoVla Says:

    E al si ga ti nazvao lol :) )

  6. NIko kao ja Says:

    Jebo te skript, sto ga nisi dao u celosti a ne ovako u parcicima, kao da hranis afrikance

Leave a Reply


Copyright 2005 © Goran Pilipovic fka bluesman