Formulář jako filtr: správná zpracování?

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

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?

Oli
Člen | 1215
+
0
-

Někde už to tu bylo řešeno, zkus to pohledat. Ale obecně formulář mám jako GET a v action metodě si odchytnu

$httpRequest->getQuery('search'); // nebo muze byt $httpRequest->parameter('search');

Tím parameterm si nejsem jistej jestli se vola presne takhle, pisu to z hlavy…

Zax
Člen | 370
+
0
-

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

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)