Stránkování – kde uložit objekt paginator

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

Potřebuju udělat stránkování. Vypadá to jednoduše, ale narazil jsem na problém. Kam uložit objekt $paginator?

presenter

class HomepagePresenter extends BasePresenter{
$private $paginator
...
public function renderDefault(){
        if($this->paginator==null){
		$this->paginator = new Nette\Utils\Paginator();
       		$this->paginator->setItemsPerPage(10);
        	$this->paginator->setItemCount(100);
		$this->paginator->setPage(1);
	}
}

public function handleNextPage(){
	$this->paginator->setPage($this->paginator->getPage()+1);
}
...
}

Problém je, že když kliknu ve view na „Next page“, tak se presenter vytváří znovu a v proměnné $paginator opět nic není a znovu se vytváří nový objekt a tak vyskočí buď chyba, protože handleNextPage pracuje s proměnnou kde žádný objekt není uložen, ale kdybu to tu chybu nevyhodilo, tak se pak vytvoří nový objekt paginator a znovu se inicializuje na první stránku.

Jak se s tím správně pracuje? Mám $paginator udělat jako statickou proměnnou?

enumag
Člen | 2118
+
0
-

Hledej doplněk VisualPaginator.

Karel Chramosil
Člen | 114
+
0
-

Nevím jestli jsem pochopil dotaz. Posílám použití paginátoru.

<?php

use Nette\Security as NS;

/**
 * UserList presenter.
 *
 * @author     Karel Chramosil
 * @package    Opravy
 * Presenter, který zajišťuje výpis seznamu oprav.
 */

class OpravaListPresenter extends SecuredPresenter

{
	public function actionDefault()
	{

	}


	public function renderDefault()
	{
		// zjištění maximálního počtu řádků
		$icount = $this->context->createOpravas()->count("*");

		$vp = new VisualPaginator($this, 'vp');
		$paginator = $vp->getPaginator();
		$paginator->itemsPerPage = 8; // počet položek na stránce
		$paginator->itemCount = $icount; // celkový počet položek (např. článků)
		//$paginator->setPage(1); // číslo aktuální stránky, číslováno od 1
		$this->template->opravas = $this->context->createOpravas()->order('datum_opravy DESC, id DESC')->limit($paginator->getLength(), $paginator->getOffset());

	}

	public function beforeRender()
	{

	}

}

{var $title = ‚Výpis oprav‘}

{block content}
<h1>Výpis oprav xx</h1>

<table>
<thead>
<tr>
<th>Id</th>
<th>Organizace</th>
<th>Typ závady</th>
<th>Popis opravy</th>
<th>Poznámka</th>
<th>Cas opravy</th>
<th>Datum opravy</th>
<th>Opravil</th>
<th>Datum zápisu</th>
</tr>
</thead>
<tbody>
{foreach $opravas as $oprava}
{? $automatRow = $oprava->ref(‚automat‘)}
{? $typzavadRow = $oprava->ref(‚typzavad‘)}
{? $userRow = $oprava->ref(‚user‘)}
<tr class=„odd“>
<td>{$oprava->id}</td>
<td>{$automatRow->organizace}</td>
<td>{$typzavadRow->typzavady}</td>
<td>{$oprava->popisopravy}</td>
<td>{$oprava->poznamka}</td>
<td>{$oprava->cas_opravy}</td>
<td>{$oprava->datum_opravy|date:‚j. n. Y‘}</td>
<td>{$userRow->prijmeni}</td>
<td>{$oprava->datum_zapsal|date:‚j. n. Y‘}</td>
<td><a n:href=„OpravaEdit: $oprava->id“>Editace opravy</a></td>
</tr>
{/foreach}
</tbody>
</table>

{control vp} // zde se použije paginátor

{/block}

Pavel Macháň
Člen | 282
+
0
-

Karel Chramosil napsal(a):

Nevím jestli jsem pochopil dotaz. Posílám použití paginátoru.
......

Nepoužívej $this->context (služby si injectuj) a komponenty vytvářej pomocí

public function createComponentVp(){
	return new VisualPaginator;  // A nebo vytvorit továrničkou
}

public function renderDefault() {
	$paginator = $this['vp']->getPaginator();
}

Editoval EIFEL (17. 3. 2014 9:35)

ondrakrajcik
Člen | 45
+
0
-

Můžu se zeptat kde se má správně do projektu přidat adresář VisualPaginator?
A také jak ho následně použít? Pomocí include asi ne že? Postará se nette samo o naincludování souboru nebo se musí někde v configu nastavit cesta k tomuto adresáři?

David Matějka
Moderator | 6445
+
0
-

uloz si to nekam, kde na nej vidi robot loader – to byva minimalne slozka app. To, kam robot loader vidi, si prectes v bootstrap.php
Kam si to v app ulozis uz je na tobe – treba app/components, nebo app/libs…

sKopheK
Člen | 207
+
0
-

Nestačí ti uchovávat v rámci třídy jen číslo aktuální stránky? Pak můžeš paginator klidně vytvářet až v metodě renderDefault().

2bfree
Člen | 248
+
0
-

Maybe this can help you https://github.com/…al-paginator

xciza
Člen | 194
+
0
-

Ahoj,
řeším stejný problém tak nebudu zakládat nové téma.
Pomocí composeru jsem si nainstaloval tento visual paginator, pridal do configu a pak do presenteru přesně podle ukázky na GITu. Bohužel teď mě laděnka hlásí že nenašla interface:

Interface \Zeleznypa\Nette\Utils\IPaginatorFactory has not been found.

Kde bych mohl mít chybu?

leninzprahy
Člen | 150
+
0
-

Jednou se mi stalo, že composer špatně stáhl nějaké knihovny a určité soubory tam prostě nebyly. Pomohlo úplné promazání adresáře vendor a znovu stažení všeho composer install.

xciza
Člen | 194
+
0
-

Do složky vendor jsem koukal a všechny soubory tam jsou, včetně toho interface

2bfree
Člen | 248
+
0
-

Pokud tomu správně rozumím, tak problém je v tom, že nativní Nette projekt nemá v autoloaderu složku /vendor a proto tyto soubory nevidí,