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="?stranka=%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="?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.

14. 11. 2007, 13.16 - Computer$

Komentáře

RSS feed komentářů k tomuto článku

1.Jan Tichý » 14. 11. 2007 15.00 » Reagovat

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.


2.Finwe » 14. 11. 2007 15.04 » Reagovat

#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.


3.Andrew » 13. 12. 2007 12.43 » Reagovat

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="pagination"> (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 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.
  • Navíc parametr displaysinglepage – 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_function_pagination_url, 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_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…
  • 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 :-)


4.Andrew » 19. 12. 2007 14.36 » Reagovat

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ě.


Reagujte!
Jméno e-mail (nezobrazí se)
web 3 plus 2 je

Jak komentovat?

  • Tady formátuje Texy! Co a jak se dozvíte v dokumentaci syntaxe
  • příklad: *kurzíva* **tučně** "text odkazu":http://finwe.info
  • Na nový odstavec jsou potřeba DVA entery!