Práce s paginátorem – presenter → view
- qteck
- Člen | 164
Ahoj,
projel jsem tady poměrně dost diskusí a hodně doporučení co se týče stránkování odkazuje k použití visualPaginátoru, který ale jak se zdá už neexistuje.
Vytvořil jsem si proto script na základě třídy Paginator() podle dokumentace na nette.org.
class HomepagePresenter extends BasePresenter
{
/** @var \Repository\Article @inject */
public $article;
public function renderDefault()
{
$this->template->article = $this->article->getArticle();
$paginator = new \Nette\Utils\Paginator;
$paginator->setItemCount($this->article->getTotalOfArticles()); // celkový počet položek (např. článků)
$paginator->setItemsPerPage(count($this->template->article)); // počet položek na stránce
$paginator->setPage(1); // číslo aktuální stránky, číslováno od 1
\Nette\Diagnostics\Debugger::dump($paginator);
}
Z dokumentace mi není úplně jasné jakým způsobem to má fungovat a jak
to vlastně ve výsledku vypadá.
Jestli budu muset programovat předávání stránek skrze get, nebo to něják
paginátor řeší sám, taky nevím jak to komunikuje vůbec s načtenou
tabulkou a jestli i tam něco u toho náhodou nechybí.
Co se týče fór, téměř vždy tam byla vytvářena komponenta, čemuž zatím moc nerozumím.
Obsah tabulky mám načtený v proměnné $this->template->article a zajímá mě jak to tedy dotáhnout do té fáze, kdy se mi zobrazí nějaké stránkování pod seznamem těch článků. Pokud se nějaké takové zobrazit má.
Díky
Jooo a další věcí je, že bude potřeba nějakým způsobem měnit obsah LIMIT jenže já příkazy na db pokládám v modelu a paginátor volám v presenteru.
Jestli je to tak správně netuším, ale jednodušší by to bylo v modelu.
Jak na to tedy?
Díky
Editoval qteck (12. 5. 2014 17:41)
- jiri.pudil
- Nette Blogger | 1032
Jestli budu muset programovat předávání stránek skrze get, nebo to něják paginátor řeší sám
Nette\Utils\Paginator
je právě jenom utility třída, která
poskytuje jen základní matematiku kolem stránkování. Zobrazení a
odkazování na stránky si musíš vyřešit sám – anebo použít právě
třeba ten VisualPaginator, který to udělá za tebe.
taky nevím jak to komunikuje vůbec s načtenou tabulkou a jestli i tam něco u toho náhodou nechybí.
Chybí. Propojení s modelem. Z paginatoru vytáhneš offset první položky aktuální stránky, limit by měl být stejný jako itemsPerPage (které mimochodem označuje maximální počet položek, jež se zobrazí na jedné stránce, a měla by to tedy být nějaká konstantní hodnota).
Ucelený příklad:
public function renderDefault($page = 1)
{
$limit = 20;
$paginator = new \Nette\Utils\Paginator;
$paginator->setItemCount($this->article->getTotalOfArticles());
$paginator->setItemsPerPage($limit);
if ($page < 1 || $page > $paginator->getLastPage()) {
$page = 1;
}
$paginator->setPage($page);
$this->template->paginator = $paginator;
$this->template->article = $this->article->getArticle($paginator->getOffset(), $limit); // v metodě getArticle() si to zpracuješ podle potřeb použité databázové vrstvy
}
a v šabloně
<a n:href="this, page => $paginator->getPage() - 1" n:if="!$paginator->isFirst()">předchozí</a>
{for $i = 1; $i <= $paginator->getLast(); $i++}
<a n:href="this, page => $i" n:tag-if="$i !== $paginator->getPage()">{$i}</a>
{/for}
<a n:href="this, page => $paginator->getPage() + 1" n:if="!$paginator->isLast()">další</a>
Poslední poznámečka: jestli ta metoda getArticle vrací článků více, asi by se spíš měla jmenovat getArticles.
- qteck
- Člen | 164
Ahoj,
ajaj, tak příště, já už si to tam něják udělal.
$HomepagePresenter.php:
public function renderDefault($page=1)
{
$paginator = new \Nette\Utils\Paginator;
$paginator->setItemsPerPage(10); // počet položek na stránce
$paginator->setItemCount($this->article->getTotalOfArticles()); // celkový počet položek (např. článků)
if ($page < 1 || $page > $paginator->getLastPage()) {
$page = 1;
}
$paginator->setPage($page);
$this->template->paginator = $paginator;
$this->template->article = $this->article->getArticles($paginator->itemsPerPage, $paginator->getOffset());
}
HomepageView.php
{if $paginator->getLastPage() > 1}
<section>
<a n:href="this, page => $paginator->getPage() - 1" n:if="!$paginator->isFirst()">předchozí</a>
{for $scatter = 3,
$i = ($paginator->getPage() - (($paginator->getPage() <= $scatter) ?
$paginator->getPage()-1 : $scatter)),
$x = $paginator->getPage() + ((($paginator->getPage() + $scatter) < $paginator->getLastPage()) ?
$scatter : ($paginator->getLastPage()-$paginator->getPage()));
$i <= $x;
$i++}
<a n:href="this, page => $i" n:tag-if="$i !== $paginator->getPage()">{$i}</a>
{/for}
<a n:href="this, page => $paginator->getPage() + 1" n:if="!$paginator->isLast()">další</a>
</section>
{/if}
a vypadá takto: „předchozí 3 4 5 –6– 7 8 9 další“
a ještě bych sem mohl hodit jednu metodu, kterou jsem dělal asi dva roky
zpět :D.
Vtipné je, že kdy jsem to teď dělal, snažil jsem se z toho inspirovat, ale
netrklo mě to ani trochu.
function strankovani($strana_cislo, $pocet_zaznamu,$listovat_po,$url)
{
$radius = 3;
$pocet_stran = ($pocet_zaznamu/$listovat_po);
$strana_cislo = ((empty($strana_cislo) || $strana_cislo< 0)?"0":$strana_cislo);
$strana_cislo = (($strana_cislo>$pocet_stran)?$pocet_stran:$strana_cislo);
if($strana_cislo > 0) echo "<a href=\"{$url}&s=".($strana_cislo-1)."\">Předchozí</a> | ";
for($i=(((($strana_cislo+1)-$radius)<1)?"1":(($strana_cislo+1)-$radius)),
$b=(((($strana_cislo)-$radius)<0)?"0":($strana_cislo-$radius));
$b<((($strana_cislo+$radius)<$pocet_stran)?($strana_cislo+$radius+1):($pocet_stran));
$b++,$i++)
{
echo "<a ".(($b == $strana_cislo)?"class=\"bold\"":"")." href=\"{$url}&s={$b}\">{$i}</a> ";
}
if($pocet_stran > 1 && (($strana_cislo+1) < $pocet_stran)) echo " | <a href=\"{$url}&s=".($strana_cislo+1)."\">Další</a>";
}
Výstup je stejný jako u předchozího.
JInak děkuji za help.