Formulář ve formuláři – Lze to?

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

Dobrý den,

je možné mít toto: ?

{form defaultForm}
	<table>
		<tr>
			<td>Select</td>
			<td>ID</td>
			<td>Code</td>
			<td>Name</td>
		</tr>
		{foreach $data as $items}
		<tr>
			<input type="checkbox" name="select[]" value={$items->id}>
			<td>${$items->id}</td>
            <td>${$items->code}</td>
             <td>
                 <details>
                     <summary>{$items->name}</summary>
                            {form nameForm}
                                {input name value => $items->name}
                                {input save}
                            {/form}
                  </details>
             </td>
		</tr>
	</table>
	{input select_action}
	{input submit}
{/form}

Jde o to, že mám tabulku do které vypisuji data z MySQL v jednom sloupci mám formulář na rychlou úpravu názvu (name) ale v tabulce mám také checkboxy, které zpracovávám hlavním formulářem (akce pro smazání, hromadnou úpravu atd.)

Jenže píše že komponent select_action nebyl nalezen. Když dám začátek formuláře za konec tabulky, tak se formulář v klidu vyrenderuje, ale nezpracovává checkboxy (pochopitelně, když jsou mimo form).

Je možné mít takto formulář v formuláři? Či je nějaké lepší řešení?

Omlouvám se za hloupý dotaz,
Děkuji,sd

duke
Člen | 650
+
+1
-

Použij Containery. Tj. třídu Nette\Forms\Container a makro {formContainer}. Ve tvém případě např.:

$itemsContainer = $form->addContainer('items');
foreach ($data as $items) {
	$container = $itemsContainer->addContainer($items->id);
	$container->addText('name', ...)
		->setDefaultValue($items->name);
	$container->addSubmit('save', ...);
}

a v šabloně pak:

{foreach $data as $items}
	...
	{formContainer items}
		{formContainer $items->id}
			{input name}
		    {input save}
		{/formContainer}
	{/formContainer}
	...
{/foreach}

Generované inputy by pak měly mít jména jako items[1][name], items[2][save], atp.

sd
Člen | 87
+
0
-

Děkuji moc za odpověď.

V presenteru jsem nahradil

$form = new Nette\Application\UI\Form;

tímto (jak duke psal)

$form = new Nette\Forms\Container;

tak má problém s $form->addProtection(); a $form->onSuccess[] = …;
Píše: Call to undefined method Nette\Forms\Container::addProtection() totéž u onSuccess.

Recoverable Error

Argument 1 passed to Nette\Latte\Macros\FormMacros::renderFormBegin() must be an instance of Nette\Forms\Form, instance of Nette\Forms\Container given, called in /Applications/XAMPP/xamppfiles/htdocs/MyFirst/sandbox/temp/cache/_Nette.FileTemplate/_Stock.default.latte-ec14bf9872b5b179394468398ad610ea.php on line 58 and defined

Cache jsem mazal.

Co dělám špatně?
Děkuji,sd

Editoval sd (31. 10. 2014 10:36)

David Matějka
Moderator | 6445
+
0
-

Jako zaklad stale pouzivej UI\Form. Ty containery vytvari prave addContainer.

sd
Člen | 87
+
0
-

Děkuji moc za odpovědi.

Ještě mám jednu blbou otázku:

Jak mám zpracovat samostatně jen container items? (Jde o to, že když v tabulce udělám „rychlou úpravu“ položky, tak chci zpracovávat jen ten 1 container a ne celý formulář. A naopak když mám vybrané řádky pomocí checkboxů, tak nechci zpracovávat containery.)

David Matějka
Moderator | 6445
+
+1
-

napoj se na onClick eventu toho buttonu, co se pridava ke kontejneru, nejak takhle:

$container->addSubmit(....)
	->onClick[] = function($button) {
	$container = $button->getParent();
	$container->values->name;
....
}