Dynamicky generované formuláře
- mm
- Člen | 9
Ahoj, potřeboval bych poradit s vytvářením formulářů v Nette.
Mám stránku s něčím jako je nákupní košík – v ní je tabulka s výpisem produktů a v každém řádku jsou nějaké informace o produktu a taky množství – a to množství musí být editovatelné pomocí formuláře. Viz screenshot: http://www.imagehosting.cz/…ntitlfgf.jpg
Potřebuji tedy vytvořit několik různých formulářů podle jednoho prototypu, které se budou chovat různě v závislosti na zadaných parametrech (v tomto případě ID produktu).
Zkoušel jsem něco jako tohle:
public function createComponentChangeQuantityForm($productId) {
$form = new Form();
$quantity = $form->addText("quantity");
$form->onSuccess[] = function($form) use($quantity, $productId) {
// do something with the product
};
return $form;
}
A v šabloně ve výpisu řádků tabulky v cyklu:
{form changeQuantityForm productId => $product->id}
Naivně jsem si myslel, že by to mohlo fungovat, ale místo toho mi to ID
produktu nastaví jako HTML atribut formuláře
(<form productId="xxx">
) a metodě pro vytvoření komponenty
a do closure v onSuccess události to samozřejmě nic nepředá. Takže
mám smůlu.
Konec popisu problému, přejděme k otázce:
Můžete mi někdo říct, jak se v Nette řeší výpis více stejných formulářů na jedné stránce, tak, aby to bylo nějak rozumně použitelné?
Zatím jediné řešení, o kterém vím, je ruční předání ID produktu do nějakého definovaného hidden pole a výpis stejného formuláře v cyklu, přičemž hidden pole naplním správnou hodnotu v latte šabloně:
{foreach $products as $product}
...
{form changeQuantityForm}
{input hiddenProductId value => $product->id}
... zbytek formuláře
{/form}
....
{/foreach}
Což je s odpuštěním prasárna, 1) protože to generuje víc prvků se stejným ID a s formulářem se pak nedá rozumně pracovat pomocí JavaScriptu, 2) je potřeba předávat defaultní hodnotu ve view (tohle patří do presenteru), 3) hodnotu bych takhle nepředal, pokud by input byl select (nebo třeba textarea), protože ty nemají atribut value.
Tohle mi připadá jako poměrně základní věc, takže doufám, že to Nette framework zvládá a jen nevím jak na to :)
Editoval mm (10. 12. 2013 16:51)