Stránkování v PHP a MySQL univerzálně
- Vložil Trupík 5/3/2006 9:26:56 PM
-
Strankování je na webovém serveru potřeba dělat každou
chvíli – výpisy diskuzí, obrázky z fotogalerie,
komentáře nebo čisté tabulky s daty. Uživatel stránek stejně
málokdy touží po tom vidět všechna data najednou a stránkovanému výpisu
dá přednost. Navíc stránkovaný výpis je kompaktnější, hezčí, rychleji
se přenese ze serveru ke klientovi a prohlížeč ho rychleji zobrazí.
Protože je stránkování tak běžným požadavkem, je podpora pro
stránkování zabudovaná přímo do MySQL – serveru, který je běžně
dostupný v kombinaci s PHP.
O původní Pager projevilo zájem pro mě celkem nečekané množství lidí. Mnozí
mě upozornili na různé problémy (za to děkuji) a navrhli další možná vylepšení.
Mezi nejčastěji zmiňované problémy patřilo to, že Pager nebyl příliš
vhodný pro sady s velkým počtem stránek . Protože přidáváním dalších
parametrů by se třída stala příliš nepřehlednou, zvolil jsem jinou metodu -
Pager lze teď konfigurovat pomocí módů, které jde mezi sebou libovolně
kombinovat. Každá část stránkovací logiky je vytknuta do samostatného módu.
Všechny módy mají stejný interface a nebude problém napsat případně další -
já jsem přichystal následující základní módy:
- DefaultPagerMode - vypisuje odkazy na všechny stránky (např. 1 2 3 4 5 )
- PrevNextPagerMode - vypisuje odkazy na sousední stránky (např. < >
)
- FirstLastPagerMode - vypisuje odkazy na první a poslední stránku
(např. << >> )
- NeighbourPagerMode - vypisuje odkazy na několik sousedních stránek
(např. ...3 4 5... )
- SkipperPagerMode - vypisuje odkazy na vzdálenější stránky - třeba
o 10 stránek vpřed a 10 vzad (např -10 + 10 )
- SparsePagerMode - vypisuje odkazy na každou n-tou stránku (např.
10 20 30 40 50 )
Starý způsob stránkování lze stále použít - interně je teď ale
implementován kombinací módů Default, PrevNext a FirstLast.
Protože vím, že člověk vše vždy nejlépe pochopí na příkladě, připravil jsem
sadu příkladů, na kterých jasně uvidíte, jak třídu použít.
Příklad 1
Příklad 2
Příklad 3
Příklad 4
Příklad 5
Příklad 6
Příklad 7
Příklad 8
Příklad 9
Příklad 10
Nepodezřívám tu nikoho, že by si stránkování nedokázal napsat
sám, není na tom nic těžkého a stačí jen základní znalost PHP
a SQL. Svůj kód sem dávám proto, že věřím, že nikoho (včetně mě)
už nebaví psát každou chvíli podobný kód. Takže jsem si po
napsání několika prvních stránkovaných výpisů vytvořil třídu, která
mně stránkování obstará a je dostatečně univerzální.
Je to jednoduché. Třídu je potřeba nejprve nainicializovat a předat jí
SQL dotaz, který vrací výsledkovou sadu. Upozorňuji, že SQL dotaz nesmí
obsahovat klauzuli LIMIT, protože právě ta je později použita pro
stránkování. Pak stačí jen navolit velikost stránek a jejich zobrazovaný
počet a některé další věcičky kolem.
Poté, co je třída nainicializována, zavolá se metoda DataBind(), která
získá výsledkovou sadu z databáze. Opakovaným voláním metody
GetOne() se získávají jednotlivé záznamy výsledkové sady a
v momentě, kdy chceme vypsat odkazy na další stránky, zavoláme metodu
DrawPager().
Na další stránky se odkazuje pomocí parametru v URL (atribut
UrlParameterName).
Jednoduché a snadné. Pokud chcete Pager stylovat pomocí CSS, máte tu
možnost (stačí správně nastavit vlastnosti třídy Pager).
Příklad použití (komplexnější příklady viz podbarvený rámeček výše):
//vytvoreni objektu, jako parametry konstruktoru se
//predavaji SQL dotaz a parametr URL, ktery bude pager
//pouzivat pro odkazy na dalsi stranky
$cp = new Pager('SELECT * FROM uzivatele', 'page');
//ziska z databaze pozadovanou cast vysledkove sady
$cp->DataBind();
//postupne ziskavani jednotlivych zaznamu z vysledkove sady
while ($obj = $cp->GetOne())
{
echo $obj->id_uziv." ".$obj->nick." <br />";
}
//vypsani pageru
$cp->DrawPager();
A takovýhle je potom výsledek:
Denial Čekan (DJDaca) přidal některá další možnosti nastavení pro třídu
- Přibyla možnost výstupu přez echo nebo přez return (takže je možno
pager využít v jiné třídě, nejen přímo v šabloně)
- Přibyla možnost SeoURL prefixu
- Přibyla možnost Connect Linku
- Přibyla možnost výstupu v array
Použití modifikované verze:
1 <?php
2 $qp = new Pager($SQL,'page',$db->dbh);
3 $qp->DataBind();
4 $qp->OutputFormat = ARRAY_A;
5 $qp->SeoPrefix = FOTOREPORTY."{seo}";
6 /** {seo} = $_GET['seo'] který bude nahrazen za jeho hodnotu */
7 print_r($qp->GetAll());
8 echo $qp->DrawPager();
9 ?>
10
Kód třídy ke stažení
Ohodnoťte prosím užitečnost článku