Čo si myslíte, aké zložité je urobiť stránkovanie záznamov, ktoré môžete vidieť na nasledujúcom príklade ?
S mojou PHP triedou je to veľmi jednoduché. Ak chcete vedieť ako na to, tak čítajte ďalej.
Nebudem tu do detialov opisovať ako to funguje, len uvediem nejaké príklady použitia a na zvyšok tu máte zdrojáky ;).
Takže najprv kód z hore uvedeného príkladu. Máme pole so 150 záznamami a vypisujeme ich po 10 záznamov na stránku. O to ktorá stránka sa má zobraziť a takisto aj o vygenerovanie „stránkovača“ sa stará objekt triedy MyPaginator
.
-
<?
-
require('MyPaginator.class.php');
-
-
$i = 1;
-
/**
-
* pole $a bude obsahovať všetky záznamy,
-
* ale my budeme vypisovať len 10 záznamov na stránku
-
*/
-
for($i = 1; $i <= 150; $i++) {
-
$a[] = 'Záznam číslo ' . $i;
-
}
-
-
/**
-
* vytvorenie novej inštancie "stránkovača"
-
* prvý argument určuje celkový počet záznamov
-
* druhý argument určuje počet záznamov na stránku
-
*/
-
$paginator = new MyPaginator($i-1, 10);
-
-
/**
-
* vypísanie html kódu pre stránkovač
-
*/
-
$paginator->Render();
-
-
/**
-
* vypísanie konkrétnych záznamov na základe údajov zo stránkovača
-
*/
-
for($j = 0; $j < $paginator->ItemsPerPage; $j++) {
-
echo $a[$paginator->Offset+$j] . "<br />\n";
-
}
-
-
$paginator->Render();
-
?>
Tu máte celý zdroják príkladu a zdroják triedy MyPaginator.
Vzhľad stránkovača si môžete upraviť pomocou CSS, alebo samotné html, ktoré sa generuje môžete zmeniť úpravou metód Render()
a PrintIndex()
.
Ak je vám moj stránkovač povedomý, tak vedzte, že som sa inšpiroval QPaginator
om z výborného frameworku Qcodo, avšak ten môj sa dá použiť samostatne…
Príklad využitia pri SQL dotaze
Ukážem čiste len príklad selectu. Predpokladá sa, že $objPaginator
už bol inicializovaný s celkovým počtom záznamov a s počtom záznamov na stránku.
-
$sqlQuery = printf("SELECT * FROM tabulka LIMIT %s, %s", $objPaginator->Offset, $objPaginator->ItemsPerPage);
Uvedené príklady sú síce jednoduché, ale verím, že na pochopenie toho ako to funguje sú postačujúce ;). Ak máte nejaké otázky tak do komentárov s nimi!
Stránkovanie vo WordPresse
WordPress poskytuje pre stránkovanie podobnú funkciu, ktorá dokáže vygenerovať linky na jednotlivé podstránky či už ako HTML linky, HTML zoznam s linkami, alebo PHP pole… Funkcia sa volá paginate_links.
dobrý deň, ja sa chcem spytať ako dam z databazy tovary tak aby sa zobrazovali napr. pomocou mysql_fetch_array($sql){include(„tovary_box.php“);}; kde $sql je výber z tabulky mysql_query(…)
dakujem
papco akosi som nepochopil co presne myslis ;), ale ak potrebujes poradit len s mysql_fetch_array() tak sa pozri na php dokumentaciu: http://www.php.net/manual/en/
ma to chybicku ked pridem na stranku zo strankovanim tak sa mi maju ukazat najnovsie zaznami a nie najstarsie
dalsia vec pri ulozeni stranky povedzme page 9 by mal jej obah zostat aj pri pridany novych zaznamov
Tak tá chybička tam nie je, treba si to presnejšie pozriet :) Nie je problém, aby na stránke so stránkovanim boli najnovšie záznamy, stačí tomu prispôsobiť napríklad SQL select…
A s tým druhým bodom tiež nesuhlasím, je to vec pohľadu, mne vyhovuje, že sa staršie veci posúvajú ďalej a nie sú stále na rovnakej stránke, a mnoho mnoho iných webov to má rovnako
UPDATE: do článku som pridal link na wordpress funkciu pre stránkovanie a takisto som opravil chybný SQL príklad…
Zdravim, :-)
Strankovac je super len mam jednu otazocku. Poradte mi prosim ako mam aplikovat strankovac na result z mysql_query().LIMIT v dotaze sa pravdepodobne asi nepouzije.
Tu je moj pokus:
$result=mysql_query(„SELECT * FROM komentar“);
if(!$result):
echo mysql_errno($spojenie) . „:“ . mysql_error($spojenie). „\n“;
else:
$j=0;
while($row = mysql_fetch_row($result)):
$j=$j++;
echo $row[$paginator->Offset+$j];
endwhile;
endif;
Opravte ma prosim. Vopred Vam dakujem,
Najprv sa spytam, ze preco nemozete pouzit limit v dotaze ? Je to ovela efektivnejsie ako vyselectovat vsetko a potom to filtrovat…
A ku kodu: nepojde to. mysql_fetch_row vrati jeden riadok z vystupu ako asociativne pole, cile $row[$paginator->Offset+$j] nema ziadny zmysel…
Jednoznacne by som to spravil cez zmenu selectu (pridanie LIMIT $objPaginator->Offset, $objPaginator->ItemsPerPage).