Stránkování – nejlepší řešení

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

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

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

akadlec
Člen | 1326
+
+1
-

A nebo třeba můžeš zkusit i tenhle ;)

Petr Parolek
Člen | 455
+
0
-

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)

Šaman
Člen | 2666
+
0
-

S tím paginátor nic moc neudělá, tenhle tvar URL je běžný pro komponenty. A VP je komponenta.
Doporučil bych použít samotnou třídu Paginator z Nette a vykreslování řešit přímo v šabloně presenteru, pak tam zádná komponenta nebude a můžeš mít přesně tu adresu, jako jsi psal.

duke
Člen | 650
+
0
-

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).

Petr Parolek
Člen | 455
+
0
-

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

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

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 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);

Tak tomuto už vůbec nerozumím!

Petr Parolek
Člen | 455
+
0
-

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

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

Prijde mi trochu zbytecny resit strankovani pres signaly. Myslim, ze stary visual paginator poslouzi nejlepe :) (po fixnuti importu trid atd.)

akadlec
Člen | 1326
+
0
-

@DavidMatějka Ale všechny zde zmíněné visual paginatory fungují stejně jako tebou zmíněný starý paginator, jen mají „něco“ na víc.

enumag
Člen | 2118
+
0
-

@DavidMatějka @akadlec A taky všechny obsahují bug kvůli kterému nefunguje canonicalize. :-)

Felix
Nette Core | 1247
+
0
-

enumag napsal(a):

@DavidMatějka @akadlec A taky všechny obsahují bug kvůli kterému nefunguje canonicalize. :-)

Jakej bug?

enumag
Člen | 2118
+
+1
-

@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).