Jak propojit dvě komponenty stránkování + filtrování?
- CZechBoY
- Člen | 3608
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
- CZechBoY
- Člen | 3608
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
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
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
Ja pouzivam kombinaciu:
FilterFormControl
ItemsPerPage
VisualPaginator
popripade
SortingControl
- Oli
- Člen | 1215
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…
- duskohu
- Člen | 778
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.