Formulár vytváraný v callbacku

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

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

ricco24
Člen | 141
+
0
-

Hmm nikoho nič nenapadá ? Ešte som skúšal použiť na formulár ->setAction() tam mi redirect zbehne dobre no neviem ako takto predávať dáta ktoré boli vyplnené vo formuláry.

Ot@s
Backer | 476
+
0
-

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
+
0
-

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
+
0
-

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.