Formulár vytváraný v callbacku
- ricco24
- Člen | 141
Je možné vytvárať formulár v callbacku a spracovávať ho pomocou onSuccess ?
Mám nasledovný kód
$dg->addCustomColumn('test', 'test')->setHtml(function ($row) use ($self) {
$form = new \Nette\Application\UI\Form($self, 'form'.$row->id);
$form->addText('name','Meno');
$form->addSubmit('process', 'Save');
$form->onSuccess[] = function(Form $form) {
\Nette\Diagnostics\Debugger::dump('submit funguje');exit;
};
return $form;
});;
setHtml() berie ako parameter callback. Formulár sa mi vykreslí v poriadku no pri jeho odoslaní dostanem nasledovnú Exception.
The signal receiver component 'formName' is not found.
Možno robím blbosť a k formulárom sa takýmto spôsobom vôbec pristupovať nedá no skúšam to vyriešiť už vyše dvoch hodín tak som prišiel po radu na fórum. Vďaka
- Ot@s
- Backer | 476
Vypadá to, že v době zpracování signálu (po submitu formu) žádná
komponenta $dg
neexistuje (= registruje se asi až pri renderu
šablony). Tím pádem není k dispozici ani samotná definice formuláře.
Uvádíš ale málo kódu pro diagnostiku… Možná by stálo přehodnotit
přístup a použít multiplier.
- ricco24
- Člen | 141
Vďaka za nakopnutie. Musel som si znovu prejsť spracovanie signalov ale mal si pravdu. V komponente som dáta jednotlivých stĺpcov vytváral až v render() (takže aj všetky formuláre sa mi vytvorili až v render fáze) preto pri spracovaní signálu žiadny z týchto formulárov ešte neexistoval.
Taktiež som musel do presenteru doplniť volanie na včasné vytvorenie komponenty.
public function actionDefault() {
$this['dataGridEmp3'];
}
Ešte ma napadá otázka pri komponentách, existuje nejaká funkcia ktorá sa spracováva pred render() ? Kam by som mohol priamo umiestniť vytváranie tých dát (formulárov). Niečo ako v presentery action alebo beforeRender.
Editoval ricco24 (4. 5. 2012 7:06)
- Ot@s
- Backer | 476
ricco24 napsal(a):
Ešte ma napadá otázka pri komponentách, existuje nejaká funkcia ktorá sa spracováva pred render() ? Kam by som mohol priamo umiestniť vytváranie tých dát (formulárov). Niečo ako v presentery action alebo beforeRender.
V komponentách k tomu souží tzv monitorování
změn, resp. vyhrazená metoda attached
protected function attached($obj)
{
parent::attached($obj);
if ($obj instanceof Nette\Application\UI\Presenter) {
// kod provedeny hned po pripojeni k presenteru
}
}
Někdy to ovšem nepomůže, protože se opět stává, že komponentu registruješ až při renderu. Záleží, jak to máš udělané. Pak je třeba refaktorovat kód minimálně tak, aby ony formuláře „existovaly“ dříve.