Dynamický formulář a signál

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

Zdravím,
mám dynamicky se měnící formulář, myšlenkou podobný tomuto. Mezi dynamicky se měnícími inputy mám autocomplete – komponentu vlastní výroby, která po zadání několika prvních písmen vyhledává záznamy (např. jména osob) v databázi. Vyhledávání je řešeno signálem, jehož handler provede callback, který se zadává při deklaraci autocomplete inputu

<?php $form->addAutocomplete()->setSuggestCallback(function($term){ ... }) ?>

. Výsledky se mi vrací jako JSON.

Můj problém je v tom, že při signálu pro autocomplete posílám pouze zadaný řetězec ($term), název formu a název inputu autocomplete (abych mohl přistoupit ke callbacku). Protože však signál neposílá všechny hodnoty formuláře (a také na co, když při hledání termu v DB nejsou potřeba), tak se formulář vytvoří bez autocompletu, tedy nemohu přistoupit k funkci callbacku a vše skončí s chybou.

Existuje na toto nějaké jednoduché řešení? Jedno řešení jsem implementoval, ale je trochu složitější – spíše jde o takový návrhový vzor pro celkovou invalidaci jakéhokoliv snippetu v komponentách a formulářích a i v takovémto případě.

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Nebylo by mnohem jednodušší přepsat ten autocomplete vlastní výroby tak, aby nepotřeboval provádět tolik akcí? Možná mi teď něco uniká, ale implementoval bych ho jako <input> s datovým atributem, kde bych si uložil vygenerovaný odkaz na nějaký ten signál (presenteru – ten bych zadal do toho setSuggestCallback, něco jako setSuggestSignal('foo') a odpovídající handleFoo), no a javascript už by jen prováděl dotaz na ten signál?

Více vazeb tam přeci být nemusí, ne?

michal.lohnisky
Člen | 64
+
0
-

Já jsem ten autocomplete založil na TagInputu, kde se právě nastavuje callback přímo u inputu ve formu. Což mi také přijde jako nejlepší místo, protože pokud bych chtěl použít formulář ve více presenterech, musel bych ten callback přesouvat do společného předka – musel bych na to myslet a je to práce navíc, takže jsem hledal nějaké lepší řešení.