Formulář jako filtr: správná zpracování?
- hapi
- Člen | 35
Dobrý večer.
přemýšlím jak chytře vyřešit filtr entit. Samozřejmě service žádám o entity i v případě, kdy formulář odeslán není. Moc se mi nelíbí ta možnost že v bych si vyžádal entity v onSubmit metodě a ukládal si je do atributu presenteru. A v render metodě zjišťovat, jestli už entity natažené mám a případně požádat service o defaultní výběr.
Ideální by bylo zpracovývat form v render metodě s výchozími hodnotami. Nevím ale jestli je to „legální“ řešení.
Jak řešíte filtry vy?
- Zax
- Člen | 370
Já to řeším přes persistentní proměnnou a data žádám v renderu.
Něco zhruba v tomto stylu:
/** @persistent */
public $filters = array();
public function render() {
$data = $this->getData()->where($this->filters);
}
V akci formuláře si filtry přenastavíš. Samozřejmě by sis měl nějak ošetřit, které filtry se smí posílat a které ne. Osobně mám komponentu na filtry, proměnnou $filters mám v ní a sama mi řeší filtrování. Podobně řeším i stránkovač a nasazení vypadá cca takto:
public function createComponentFilterator() {
$f = $this->filteratorFactory->create();
$f->allowFilters(array(...));
return $f;
}
public function render() {
$data = $this->getData();
$data = $this['filterator']->setData($data)->getFilteredData($data);
$data = $this['paginator']->setData($data)->getFilteredData($data);
$this->template->data = $data;
}
Editoval Zax (13. 5. 2014 19:43)
- hapi
- Člen | 35
No já to mám nakonec tak, že v továrně formu nastavím default hodnoty,
přestože používám jen selecty.
a v render metodě pak už volám jen:
$filter = $this->getComponent('filterForm')->getValues();
$this->template->products = $this->productsService->getFilteredProducts($filter['sortBy'], ...);
Díky default hodnotám získám values i bez odeslání. A jelikož jde o selecty, tak validaci zajistí Form bez dalšího nastavení.
Přijde mi to elegantní a jednoduché. Snad to nemá háček, o kterém zatím nevím :)
Nelíbil se mi přístup obcházet objekt Form taháním getu „ručně“ a nebo handlování s daty formuláře přes atribut třídy. Až pak mi trklo, že je to komponenta a dostanu se k ní odkudkoliv…
Editoval hapi (13. 5. 2014 21:04)