Jak propojit dvě komponenty stránkování + filtrování?

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

Zdravím,
jak efektivně a pěkně propojit komponentu na stránkování a filtrování?

Používám pro filtrování metodu POST, pro stránkování metodu GET.
Filtrování se stránkováním spojím v presenteru, nemám žádný svůj grid na výpis (obyč tabulka přes foreach + control paginator + control filtersForm).

Stávající stav je, že filtrovací form si uloží data do session a při změně stránky se data načtou odtamtud.
Takže když přijdu nově (znova, po filtrování) na první stránku tak už mám vyfiltrováno.

Jak toto prosím řešíte? :)
Dík

Pavel Kravčík
Člen | 1183
+
0
-

Třetí komponentou, která má dvě komponenty. :)

CZechBoY
Člen | 3608
+
0
-

Jo, to dává smysl :D
Ale jaká minimální logika by tam měla být?
Jen tam ty dvě komponenty vložit umím taky, ale asi mi něco uniká… Jak si uložím stav těch filtrů? Mimo tu session :-)
Nebo uložit filtry do session a persistním parametrem v GET si uložím odkaz do té session?

Pavel Kravčík
Člen | 1183
+
0
-

Já jsem tedy pochopil komponenty, že se drží stav ve své instanci a session používám jen při přechodu mezi stránkami.

Jelikož tam posíláš jen signály, tak se Ti stav nemění. A nepotřebuješ k tomu session.

gridComponent extend Neco\UI\Control
{
	protected $stav;
}
CZechBoY
Člen | 3608
+
0
-

Filtrování je (zatím) jen obyč formulář, který se naplní akorát když POSTnu data. Takže snad ani žádný stav nemá …
Takže bych měl filtrovat a stránkovat podle signálů?
Jelikož teďka nemám žádnej grid (a ani se mi nechce nic šílenýho teďka dělat) tak bych potřeboval nějak dostat data do presenteru a odtamtud do jeho šablony (mám víc tabulek takto vypsaných).

Pořád mi to nějak nejde dohromady s tím co mám a jak by to mělo fungovat :(

duskohu
Člen | 778
+
0
-

Ja pouzivam kombinaciu:
FilterFormControl
ItemsPerPage
VisualPaginator
popripade
SortingControl

Oli
Člen | 1215
+
0
-

Používám to asi dost podobně jako @duskohu, akorát na to nemám univerzální komponenty. Prostě mám data, který předám do paginátoru. Je jedno jestli Selectize nebo array nebo něco jinýho.

No a filter nedělá nic jinýho, než že přesměruje na presenter

public function process(Form $form, $values)
{
	$this->presenter->redirect('Products:', ['filter' => $form->getValues(TRUE)]);
}

V routeru si to trochu upravím aby to vypadalo pěkně v URL (ale moc velký možnosti nejsou) a v presenteru se to zobrazí

public function renderDefault(array $filter = NULL)
{
	$products = $this->productsRepository->findAll();

	if (!is_null($filter))
	{
		$this['filter']->fillData($filter);
		$products = $products->setFilter($filter);
	}

	$this->template->products = $products;

	if ($this->isAjax())
	{
		$this->redrawControl('products');
	}
}

Analogicky to můžeš poslat do nějaký komponenty, která ti zobrazuje data…

CZechBoY
Člen | 3608
+
0
-

Co když v url nechci mít vidět vyhledávání, tzn. musím použít POST pro filtrování?

duskohu
Člen | 778
+
0
-

CZechBoY napsal(a):

Co když v url nechci mít vidět vyhledávání, tzn. musím použít POST pro filtrování?

Nie, lebo ked pouzijes dalsiu komponentu napr. po filtrovani paginator budes musiet parametre nejako zase predavat. V tom pripade by som odporucil session. Ja osobne pouzivam ajax, tym padom sa mi v url params nezobrazuju, ale to neznamena ze sa knim neda dostat.

Oli
Člen | 1215
+
0
-

Nemusis. Proste jen ulozis do session a presmerujes na this. V mem prikladu to je potom stejny, si to vytahnes ze session.

CZechBoY
Člen | 3608
+
0
-

Aha, takže asi nějak jak to mám teď :-) Taky ukládám filtry do session a při zobrazení vyfiltrovaný stránky ty filtry zase vytáhnu zpět do formuláře. Pak zpracuju v presenteru.