[ cronewbie @ 09.08.2007. 08:05 ] @
Postovanje svima,

Radim na jednom projektu koji ima dosta zapisa u bazi (nekih 60k) i sad nailazim na problem jer je kupac zamislio samo 10 rezultata po stranici, i tada mi paginacija naraste u cudoviste od 9604 stranice! :) Zato sam mislio da bih trebao odraditi tu paginaciju na nacin kao sto je na ES-u kad se listaju postovi po forumima, dakle nešto ovako otprilike:

[<Pocetna] [<Prethodna] 2 | 3 | 4 | 5 | [6] | 7 | 8 | 9 | ... [Slijedeca>] [Posljednja]

Ima li itko ikakav link na nekakav tutorial koji to objasnjava ili kakav kvalitetan hint gdje da trazim?
[ karas @ 09.08.2007. 09:41 ] @
Za PostgreSQL i MySQL pogledaj LIMIT i OFFSET koji se koriste uz SELECT: http://www.postgresql.org/docs/8.2/static/sql-select.html, http://dev.mysql.com/doc/refman/5.0/en/select.html. Naravno, treba ih koristiti uz ORDER da bi bio siguran u redosled kojim se očitavaju.
[ dakipro @ 09.08.2007. 09:58 ] @
Cini mi se da ga nisi bas najbolje razumeo. On hoce samo 10-ak strana da prikaze u paginaciji. Mada, nije to nikakva nauka ako se malo bolje razmisli o tome, samo treba da se malo matematike ubaci u kod koji "crta" te linkove, i ogranici se broj prikazanih strana. Treba samo da se izadje iz petlje ako je nacrtano 10 linkova, nista komplikovano, cista logika...
[ karas @ 09.08.2007. 10:17 ] @
Aha, pa onda sa count(*) može da se prebroji koliko ima redova, da se izračuna koliko je to stranica i prikaže npr. prva stranica i linkovi za narednih 10. Čitanje sledeće stranice može preko LIMIT i OFFSET tako što je limit broj redova koje treba prikazati a ofset računa kao tekuća stranica * limit. Naravno, linkove za unapred prikazuje za onoliko stranica koliko ih ima što nije problem jer ih je izbrojao na početku. Linkovi za stranice mogu da sadrže parametre oblika page=$currentpage, page=$currentpage+1 itd. za redni broj stranice na osnovu kojeg će posle klika znati šta da povuče iz baze.
[ Ivan.Markovic @ 09.08.2007. 10:28 ] @
Navigator klasa: http://www.netsector.net/index.php?p=146
[ cronewbie @ 14.08.2007. 13:26 ] @
Hvala svima na odgovorima i uputama. Pronašao sam klasu koja mi radi posao (adresa je: http://www.mis-algoritmos.com/...7/digg-style-pagination-class/).
Međutim, iako pozovem klasu čini mi se pravilno, ona se pojavi ali nije funkcionalna. Pretpostavljam da griješim negdje u samom kodu, pa ako bi mogao dobiti malo pomoći puno bi mi značilo.

Imam slijedeći kod koji mi je radio paginaciju prije pokušaja implementacije ovog novog tipa paginacije:
Code:

function div ($a, $b) {return ($a-$a%$b)/$b;} */

$po_stranici = 10; // broj podataka po stranici

$vijesti = mysql_query("SELECT COUNT(MBO) AS broj FROM tusmo_baza");

$r = mysql_fetch_array($vijesti, MYSQL_ASSOC);

$broj_redova = $r['broj'];

$broj_stranica = div($broj_redova+$po_stranici-1, $po_stranici);

$stranica = @$_GET['str'];

    if (!isset($stranica)) $stranica = 1; else $stranica = intval($stranica);

    if ($stranica < 1 || $stranica > $broj_stranica) $stranica = 1;

$x = ($stranica - 1) * $po_stranici;

// konacni upit koji daje trazene podatke

//$subjekti=@mysql_query("SELECT * FROM tusmo_baza ORDER BY MBO DESC LIMIT $x, $po_stranici;"); 



I sama paginacija je išla jednostavno pozivanjem ovog bloka koda:
Code:

// prikaz linkova na ostale stranice
for ($i = 1; $i <= $broj_stranica; ++$i)

if ($i == $stranica) echo "<b>[$i]</b> ";
     else echo " <a href=\"index.php?&str=$i\">$i </a>";
?>


I to je radilo korektno. Tada sam došao do problema kojeg sam prvi put opisao i pokušao stvar zamjeniti gore spomenutom klasom, ali mi ne radi. Pojavi mi se navigacija, ali ne radi - kada pritisnem slijedecu stranicu ona se kao pozove ali se rezultati ne mijenjaju, iako sam pravilno (imho) editirao samu klasu. Gdje griješim? Da li moram promijeniti query negdje ili šta? Ne razumijem..

Eh, da, zaboravio sam spomenuti kako izgleda kod kojim sam zamijenio pozivanje stare paginacije novom:
Code:
<?php 
include('includes/pagination.class.php');
$p = new pagination;
$p->items(1000);
$p->limit(10);
if(isset($_GET['page'])){
                $page = $_GET['page'] / 10;
                $p->currentPage($page);
        }else
                $p->currentPage(1);

$p->show();?>