Stránkování – nejlepší řešení
- Carson
- Člen | 35
Ahoj,
S nette začínám a zajímalo by mě jakou nejlepší cestou jít na
stránkování. Na fóru jsem nalezl mnoho vláken ovšem většina z nich byla
velmi stará a většina odkazů nefunkčních. Popřípadě jestli máte odkazy
na aktuální vlákna budu jedině rád.
Máte nějaké návrhy? Díky předem!
- Felix
- Nette Core | 1247
Pokud uz hledas nejake hotove reseni, tak hledej
VisualPaginator
.
https://github.com/…al-paginator
https://github.com/…al-paginator
Pokud chces jenom tridu pro ulehceni prace, tak doporucuju pouzit primo Nette\Utils\Paginator
- Petr Parolek
- Člen | 455
akadlec napsal(a):
A nebo třeba můžeš zkusit i tenhle ;)
Ahoj, tento paginator teď zkouším implementovat, jen nevím, jak mám upravit výsledné URL, co mi vygeneruje paginator. Leze mi z něj: /messages/show?visualPaginator-page=2&do=visualPaginator-showPage .
Ale mě by se líbilo např.: /messages/show?page=2 . Nevím si rady.
Další možnoszt je zpracovat url, co leze z paginatoru. Zkoušel jsem to, ale zavazí mi tam pomlčka.
Díky moc za rady.
Editoval ppar (7. 4. 2015 19:37)
- Petr Parolek
- Člen | 455
duke napsal(a):
Po zpracování signálu (odpovídá url obsahujícímu „do=visualPaginator-showPage“) by mělo následovat přesměrování (tedy pokud nešlo o ajax).
a jak to mám udělat?
- Zax
- Člen | 370
ppar napsal(a):
Ahoj, tento paginator teď zkouším implementovat, jen nevím, jak mám upravit výsledné URL, co mi vygeneruje paginator. Leze mi z něj: /messages/show?visualPaginator-page=2&do=visualPaginator-showPage .
Ale mě by se líbilo např.: /messages/show?page=2 . Nevím si rady.
Další možnoszt je zpracovat url, co leze z paginatoru. Zkoušel jsem to, ale zavazí mi tam pomlčka.
Díky moc za rady.
Parametru do
se zbavíš přesměrováním a
visualPaginator-page
změníš na page
na úrovni
routeru třeba pomocí mé
knihovny
$meta = (new MetadataBuilder('Presenter:action'))
->addAlias('page', 'visualPaginator-page')
->build();
$router[] = new Route('mask', $meta);
- Petr Parolek
- Člen | 455
Zax napsal(a):
ppar napsal(a):
Ahoj, tento paginator teď zkouším implementovat, jen nevím, jak mám upravit výsledné URL, co mi vygeneruje paginator. Leze mi z něj: /messages/show?visualPaginator-page=2&do=visualPaginator-showPage .
Ale mě by se líbilo např.: /messages/show?page=2 . Nevím si rady.
Další možnoszt je zpracovat url, co leze z paginatoru. Zkoušel jsem to, ale zavazí mi tam pomlčka.
Díky moc za rady.
Parametru
do
se zbavíš přesměrováním avisualPaginator-page
změníš napage
na úrovni routeru třeba pomocí mé knihovny$meta = (new MetadataBuilder('Presenter:action')) ->addAlias('page', 'visualPaginator-page') ->build(); $router[] = new Route('mask', $meta);
Tak tomuto už vůbec nerozumím!
- Petr Parolek
- Člen | 455
ppar napsal(a):
duke napsal(a):
Po zpracování signálu (odpovídá url obsahujícímu „do=visualPaginator-showPage“) by mělo následovat přesměrování (tedy pokud nešlo o ajax).
a jak to mám udělat?
Můj kod
public function renderShow()
{
$user = $this->getUser();
if ($user->isInRole('admin')) { // je uživatel v roli admina?
$this->template->isAdmin = true;
}
else {
$this->template->isAdmin = false;
}
$this->template->menu = $this->database->fetchMenuItems();
$this->template->messages = $this->database->fetchMessages()
->order('id DESC')->fetchAll();
$someItemsList = $this->database->fetchMessages()->fetchAll();
// Get visual paginator components
$visualPaginator = $this['visualPaginator'];
// Get paginator form visual paginator
$paginator = $visualPaginator->getPaginator();
// Define items count per one page
$paginator->itemsPerPage = 10;
// Define total items in list
$paginator->itemCount = $this->database->fetchMessages()->count("*");
// Apply limits to list
$this->database->fetchMessages()->limit($paginator->itemsPerPage, $paginator->offset);
}
protected function createComponentVisualPaginator()
{
// Init visual paginator
$control = new VisualPaginator\Control;
$control->setTemplateFile('bootstrap.latte');
$control->disableAjax();
return $control;
}
- duke
- Člen | 650
Nějak takto (netestováno):
protected function createComponentVisualPaginator()
{
$control = new VisualPaginator\Control;
$control->setTemplateFile('bootstrap.latte');
$control->disableAjax();
$presenter = $this;
$control->onShowPage[] = function($component, $page) use ($presenter) {
if (!$presenter->isAjax()) {
$presenter->redirect('this', ['visualPaginator-page' => $page]);
}
};
return $control;
}
- David Matějka
- Moderator | 6445
Prijde mi trochu zbytecny resit strankovani pres signaly. Myslim, ze stary visual paginator poslouzi nejlepe :) (po fixnuti importu trid atd.)
- enumag
- Člen | 2118
@Felix Metoda loadState by měla vypadat takhle:
public function loadState(array $params) {
parent::loadState($params);
$this->getPaginator()->setPage($this->page);
$this->page = $this->getPaginator()->getPage();
}
Jde o to že pokud je např. číslo stránky v parametru vyšší než celkový počet stránek tak paginator automaticky načte poslední stránku, ale url se nepřesměruje. Ten přidaný řádek zajistí že se přesměrování provede (tedy za předpokladu že paginator inicializuješ korektně, tj. dříve než se provádí canonicalize).