Smarty plugin - Pagination

Pro Smarty několik pluginů pro paginaci existuje, ale žádný mi nevyhovoval. Napsal jsem si proto vlastní.

Použití

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=„?stran­ka=%d“ output=„item“ }

Způsobí

Lze změnit i text místo šipečky odkazující na první/předcho­zí/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.

Prahy jsou tři, low, middle a high
položky pod nízkým prahem se vypíšou všechny
položky mezi nízkým a středním se vypisují, pokud je jejich modulo 5 rovno nule
položky mezi středním a vysokým se vypisují, pokud je jejich modulo 10 rovno nule
položky nad vysokým prahem se zobrazují, pokud jsou beze zbytku dělitelné 50
první a poslední položka se vypíše vždy
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=„?stran­ka=%d“ firstText=„První“ lastText=„Poslední“ lowOmmitOffset=2 middleOmmitOf­fset=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/ar­chiv?stranka=%d“ ?

Pak jedna připomínka a návrh na TODO. Odkaz pod číslem 1 směřuje na /blog/archiv?pa­ge=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í:

  • Navíc parametr container – definice „obalu“ stránkování. Není tam tedy natvrdo <div class=„pagina­tion“> (to je defaultní hodnota), ale dá se nastavit cokoli.
  • Navíc parametr displayrulers – udává, jestli se mají zobrazovat mimo čísel stránek i „šipečky“ (defaultně ano).
  • Navíc parametr displayinacti­verulers – 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.
  • Navíc parametr displaysingle­page – udává, zda se má stránkování zobrazovat, existuje-li pouze jedna stránka.
  • Vylepšení – pokud je počet položek roven 0, stránkování se nezobrazuje.
  • Vylepšení – všechny odkazy jsou vytvářeny funkcÍ smarty_functi­on_pagination_ur­l, takže kdyby si je někdo chtěl upravit, je potřeba to udělat jenom na jednom místě.
  • Změna – poslední parametr funkce smarty_functi­on_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…
  • Změna – nevím z jakého je to důvodu, ale původní pagination, pokud jsem na první resp. poslední stránce, nezobrazuje posuvníky na předchozí resp. následující stránku, ale na první resp. poslední ano. V tomhle bych rád zachoval konzistenci, takže moje úprava, pokud nejsou zakázány, je zobrazuje vždy oba.

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($param­s[‚output‘])){
$outputStyle = ‚page‘;
} elseif (in_array($pa­rams[‚output‘], array(‚page‘, ‚item‘))){
$outputStyle = $params[‚output‘];
} else {
$smarty->trigger_error(„pa­gination: ‚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[‚ou­tput‘])
? ‚page‘
: (in_array($pa­rams[‚output‘], array(‚page‘, ‚item‘)))
? $params[‚output‘]
: $smarty->trigger_error(„pa­gination: ‚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.