Dynamicky generované formuláře

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

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)

enumag
Člen | 2118
+
0
-

TL;DR

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é?

Stejně jako u libovolných jiných komponent – přes Multiplier. Honza o tom mluví někde ke konci přednášky.

mm
Člen | 9
+
0
-

Díky. Je nějak možné použít multiplier v kombinaci s makry {form} a {input}? Zápis {form formName-$id} mi nefunguje a {control} se mi nechce používat.

voda
Člen | 561
+
0
-

Mělo by fungovat:

{var $name = "formName-$id"}
{form $name}
mm
Člen | 9
+
0
-

Funguje to, díky :)