Formulář ve formuláři – Lze to?
- sd
- Člen | 87
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
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
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
Jako zaklad stale pouzivej UI\Form. Ty containery vytvari prave addContainer.
- sd
- Člen | 87
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
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;
....
}