14. 11. 2007, 13.16
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.
Computer$, (Web)design
Komentáře
Jan Tichý
14. 11. 2007, 15.00
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.
Finwe
14. 11. 2007, 15.04
#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.
Andrew
13. 12. 2007, 12.43
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 :-)
Andrew
19. 12. 2007, 14.36
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ě.Elektricman
22. 10. 2009, 14.48
Zdravím, možnás stupidní dotaz, ale jak se to instaluje? Se smarty teprve začínám. Stačí to nahrát do plugins a to nějakýho tpl napsat např. {pagination total=47 page=2} a už to pojede? .. jestli jo, tak mě to nevalí , a aspon vím že je problém někde u mě :)
likvi
3. 4. 2012, 16.47
Ahoj,
našel jsem nějaké chybky (v php 5.3.3 to háže chybky).
if (empty($params[‚output‘])){
$outputStyle = ‚page‘;
} elseif (in_array($params[‚output‘], array(‚page‘, ‚item‘))){
$outputStyle = $params[‚output‘];
} else {
$smarty->trigger_error(„pagination: ‚output‘ parameter must be ‚page‘ or ‚item‘“);
// Style of outputting items. Either ‚page‘ (1, 2, 3) or ‚item‘ (1–20, 21–40, 41–60)
}
#původní kód
/*
$outputStyle = empty($params[‚output‘])
? ‚page‘
: (in_array($params[‚output‘], array(‚page‘, ‚item‘)))
? $params[‚output‘]
: $smarty->trigger_error(„pagination: ‚output‘ parameter must be ‚page‘ or ‚item‘“);
*/
$ommit = (isset ($params[‚ommit‘]) && $params[‚ommit‘] == ‚no‘)
? false
: true;
/*
$ommit = $params[‚ommit‘] == ‚no‘)
? false
: true;
*/
Vložit komentář
K tomuto příspěvku není povoleno přidávat komentáře.