Práce s paginátorem – presenter → view

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
qteck
Člen | 164
+
0
-

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
+
0
-

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.

ondraondra81
Člen | 82
+
0
-

VisualPagiator je zde: https://github.com/…al-paginator
Funguje výborně :)

qteck
Člen | 164
+
0
-

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.