Stránkování – kde uložit objekt paginator
- ondrakrajcik
- Člen | 45
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?
- Karel Chramosil
- Člen | 114
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
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
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
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…
- xciza
- Člen | 194
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
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
.