Pro Smarty několik pluginů pro paginaci existuje, ale žádný mi nevyhovoval. Napsal jsem si proto vlastní.
Pro základní vypsání paginace stačí např. zapsat (čísla zřejmě nahradíme proměnnými)
{pagination total=47 page=2}
Vygenerovaná paginace bude vypadat nějak jako
Defaultní stránkování je po 20 položkách a mění se parametrem
count. Url se vytváří ze dvou parametrů: url se
automaticky prependuje do všech kotev a linkparam se zapojí za
url. Linkparam má formát řetězce pro sprintf (defaultně
?page=%d), kde se jediný parametr nahrazuje číslem stránky.
Pokud chceme zobrazit čísla položek místo čísel stránek, ovlivníme to
parametrem output, kterému nastavíme hodnotu item.
Tento parametr může nabývat ještě hodnoty page, která je ale
defaultní, tudíž se specifikovat nemusí. Pokud nastavíme jinou hodnotu,
Smarty vyhodí warning. Vypišme tedy kustomizovanou paginaci:
{pagination
total=47 page=2 count=10
url="/blog/archiv" linkparam="?stranka=%d"
output="item"
}
Způsobí
Lze změnit i text místo šipečky odkazující na
první/předchozí/následující/poslední stránku, a to
parametrem firstText, respektive previousText,
nextText a lastText. Možná hodnota je libovolný
řetězec.
Parametr separator určuje, co se bude zobrazovat mezi
položkami. v základu je nastaveno ` | `.
Plugin také automaticky vynechává některé stránky, které jsou příliš daleko od stránky aktuální. Způsob vyhazování závisí na rozdílu aktuální a vypisované stránky a na nastavení prahu.
| Práh | Parametr | Implicitní hodnota |
|---|---|---|
| Nízký | lowOmmitOffset |
3 |
| Střední | middleOmmitOffset |
7 |
| Vysoký | highOmmitOffset |
50 |
Vypouštění stránek lze vypnout parametrem ommit="no".
Tudíž poslední příklad:
{pagination
total=2000 page=3 count=10
url="/blog/archiv" linkparam="?stranka=%d"
firstText="První" lastText="Poslední"
lowOmmitOffset=2 middleOmmitOffset=20 highOmmitOffset=50
}
Celý kód lze samozřejmě s lehkými úpravami použít i mimo Smarty. A zdroják? Nainstalovat zvládnete jistě sami.
RSS feed komentářů k tomuto článku
#1 - Jan Tichý Přemýšlíme stejně :)
parametr u odkazu na první stránku je důvod, proč jsem ještě
neuvolnil zdroják, chci to nejdřív opravit. Pak to fixnu i ve
článku.
A k dělení url – zase přemýšlíme stejně. A mně prostě přišlo hezčí dělit url, než nechat napsat celé url do jednoho parametru a pak nechat definovat další parametr, který by se použil jen jednou.
Taky se mi pagination líbí a už jsem ho na jednom projektu použil. Dovolím si publikovat svou mírně upravenou verzi (není to tak hezky barevné, ČH .phps zjevně nevybarvuje). Změny jsou následující:
container – definice „obalu“
stránkování. Není tam tedy natvrdo <div
class="pagination"> (to je defaultní hodnota), ale dá se nastavit
cokoli.displayrulers – udává, jestli se mají
zobrazovat mimo čísel stránek i „šipečky“ (defaultně
ano).displayinactiverulers – udává, jestli
se mají zobrazovat neaktivní „šipečky“ (tedy přechod na
předchozí/první stránku, jsme-li na první stránce, a analogicky pro
poslední). Je-li zobrazování vypnuto (předchozí parametr), nezobrazí se,
podle očekávání, nikdy nic.displaysinglepage – udává, zda se má
stránkování zobrazovat, existuje-li pouze jedna stránka.smarty_function_pagination_url, takže kdyby si je někdo chtěl
upravit, je potřeba to udělat jenom na jednom místě.smarty_function_pagination_url jsem změnil na typ boolean. Přijde
mi to logičtější a v důsledku flexibilnější. Jenom si moc
nedokážu představit, proč by někdo za aktivní označoval jinou než
aktuální stránku…Poznámka k diskusi – pokud se stránkování nezobrazí (celkový
počet je 0 nebo existuje pouze jedna stránka a parametr
displaysinglepage = false), nezobrazí plugin nic, ani prázdný
container. To může potenciálně způsobit problémy
v layoutu. V tom případě je třeba příslušně upravit řádky
53 a 56.
Legal Disclaimer: Neručím za bugy :-)
Opravil jsem pár (dvě) chyby a přidal jednu drobnost – definici
parametru zadávejte jako pg=%d (tedy bez ampersandu nebo otazníku
na začátku), o to, jestli se má použít ampersand nebo otazník, se
postará plugin sám. Ta detekce není žádná rocket-science, ale fungovat by
mela spolehlivě.
Ahoj, vypadá to moc slibně.
První dotaz se týká konstrukce URL. Proč je rozděleno na dvě části, tedy na url a linkparam? Napadá mě jeden důvod, kdy by toto bylo potřeba (viz dále), ale ten jsem ve Tvém článku nezahlédl. Nestačil by tedy pro veškeré popisované funkčnosti jen jediný parametr ve smyslu url=„/blog/archiv?stranka=%d“ ?
Pak jedna připomínka a návrh na TODO. Odkaz pod číslem 1 směřuje na /blog/archiv?page=1. To je ale špatně, protože se vytváří duplicity první stránky. Měla by se respektovat primární URL první stránky, takže i odkaz pod tou jedničkou by měl směřovat na /blog/archiv.
Což je ten jediný důvod pro rozdělení URL do dvou parametrů, o kterém jsem mluvil výše – tady by se to právě elegantně využilo. Jinou možností by pak bylo ve smyslu stávajících parametrů firstText a lastText udělat i speciální parametr firstUrl.