_

Článek o stránkování v PHP už tu jednou byl. Ovšem po nasazení na mnohé projekty knihovna prošla jistým vývojem, proto tuto dokumentaci posouvám na první místo v seznamu článků a návod aktualizuji. Text bude pojat spíše jako návod na použití než mnohdy zbytečné komentáře k blokům kódu. Přibylo mnoho ošetření vstupů, v členských proměnných je uchováváno více dat pro pozdější použití. Tištěním kódu v šablonách se také už nebude potřeba trápit, o to se postará metoda pro převod do HTML s nastavitelným výstupem.

Nejdříve je potřeba vytvořit instanci třídy. Do konstruktoru se nastavují následující parametry:

public function __construct($total, $base = null, $limit = 0, $href_format = null);

Počet všech příspěvku, abychom věděli, kam až budeme stránkovat, základna pro generování odkazů (aktuální kategorie), po kolika stránkujeme a nakonec i formát přidaného parametru. Pro stránkovací parametr je potřeba si rezervovat proměnnou $_GET['page']. Základna je nepovinná, třída si ji umí odvodit z aktuální url. Pokud není uveden limit, je bráno 10 položek na stránku jako výchozí hodnota. Parametr $href_format je nastaven na hodnotu ?page=%s, uvádíme ho tedy pouze v případě, že ho potřebujeme změnit za &page=%s.

Pokud knihovnu nasazujeme na vícejazyčný nebo nečeský web, je potřeba i nastavit formát titulků výstupních odkazů: o to se postará metoda set_title_format(). Výchozí hodnota je "Stránka %s".

Dále už jen nastavíme typ stránkování a typ výstupu (nepovinné) a jsme vlastně hotoví. Ve finále stačí objekt jednoduše vytisknout, čímže se provede přetypování na string a magická metoda __toString() vrátí přednastavený HTML výstup.

Výstup

Stránkování lze exportovat ve čtyřech různých podobách. O nastavení se starají metody set_paging_mode() a set_output_mode(), každá z nich akceptuje nastavení 1 / 0. Ukázka:

1 | 2 | 3 | 4 | 6 (paging_mode = 0 | output_mode = 0)
1-10 | 11-20 | 21-30 | 31-40 (paging_mode = 0 | output_mode = 1)
<< < 5 > >> (paging_mode = 1 | output_mode = 0)
1 ... 5 | 6 | 7 | 8 | 9 ... 50 (paging_mode = 1 | output_mode = 1)

Při stránkování tisíců záznamů je samozřejmě vhodné použít třetí nebo čtvrtý způsob, kde cyklus pro procházení neprojíždí zbytečně všechny záznamy v poli. Zde lze navíc ještě nastavit, kolik odkazů okolo aktuálního se zobrazí. K tomu slouží metoda set_around(). Výchozí hodnota je 5, ovšem pro správné zobrazení třetího způsobu výpisu je potřeba nastavit limit na 1.

Nasazení

Vše důležité už bylo řečeno, takže nyní můžeme jít dál k ukázce kódu, který celý proces spustí. Celkový počet záznamů je potřeba spočítat SQL dotazem, protože jsem nechtěl mít knihovnu závislou ještě na databázové třídě. Po veškerém většinou nepovinné nasazení je potřeba ještě zavolat metodu set_paging(), která celý proces spustí.

$total = mysql_result(mysql_query("SELECT COUNT(*) FROM `tabulka`"), 0);
$limit = 20;
$base = 'http://www.treba.cz/kategorie/';

// celkem | [zakladna] | [po kolika] | [format parametru]
$paging = new Paging($total, $base, $limit, '&page=%s');
$paging->set_title_format('Stránka %s'); // nepovinne
$paging->set_around(2); // nepovinne
$paging->set_paging_mode(1); // 0
$paging->set_output_mode(1); // 0
$paging->set_paging();

// vystup
echo $paging->export_paging(); // echo $paging; // $tpl['paging'] = (string)$paging;

// parametry limit pro sql dotaz:
$sql_start = $paging->get_start();
$sql_limit = $paging->get_limit();

Ukázkový SQL dotaz pro výběr záznamů

SELECT * TABULKA WHERE `sloupec` = 'podminka' ORDER BY id DESC LIMIT {$sql_start}, {$sql_limit}

Celý zdrojový kód si můžete prohlédnout nebo stáhnout:

Poznámka: text se týká PHP 5, článek byl revidován 21. 2. 2010