createComponentForm + manuální vykreslování formuláře

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

Ahoj, mám trochu problém. Už nějakou dobu na mě Nette křičí, že mé prepareXY metody jsou deprecated a ať je nahradím metodami createComponentXY. Což o to, továrničky využívám a jsou fajn, ale u formuláře používám manuální vykreslování (begin,errors,body,end) a nevím, jak to skloubit dohromady.

{control form} mi vykreslí celý formulář a pak už mě napadá jen v render fázi přiřazovat $template->form = $this->createComponentForm() a to mi nepřijde zrovna košér (tuším jsem někde četl, že na form je v render fázi už pozdě). Ikdyž možná jsem jenom moc rozežraný ze všech těch widgetů :)

Co byste mi doporučili? Není na to ještě nějaká jiná finta?

Ondřej Brejla
Člen | 746
+
0
-
public function actionSmth() {
    $this->template->form = $this->getComponent('form');
}

To by nešlo?

David Grudl
Nette Core | 8228
+
0
-

Klidně i v render:

public function renderSmth() {
    $this->template->form = $this['form'];
}

Nebo rovnou v šabloně:

{$presenter['form']->render('begin')
na1k
Člen | 288
+
0
-

Ano! ArrayAccess je ten trik … že mi to nedošlo :)

Trochu mě zmátlo tady to upozornění, ale pak mi došlo že používám Form a ne AppForm. Teď si ale říkám, jestli to není špatně, AppForm by snad měl být pro větší aplikace lepší.

Ale svému prepareXY jsem předával k tvorbě formuláře parametr – id záznamu který se přes setDefaults načte – jak ho továrně předám při volání přes ArrayAccess? Anebo je špatné form předvyplňovat už v továrně a mám to dělat až v actionXY a Nette se mě tímto snaží dotlačit k best practice?

PetrP
Člen | 587
+
0
-

na1k napsal(a):

Ale svému prepareXY jsem předával k tvorbě formuláře parametr – id záznamu který se přes setDefaults načte – jak ho továrně předám při volání přes ArrayAccess? Anebo je špatné form předvyplňovat už v továrně a mám to dělat až v actionXY a Nette se mě tímto snaží dotlačit k best practice?

Máš asi 2 možnosti. První je v createComponentForm si vytáhnout id přes $this->getParam(‚id‘)
Což já považuju za lepší řešení (vše je na jednom místě)

private function createComponentForm()
{
	...
	$form->setDefaults( $this->model->getDataById( $this->getParam('id') ) );
}

Nebo co radil někde david vyplnit si data třeba v action

public function actionXy($id)
{
	$this['form']->setDefaults( $this->model->getDataById($id) );
}
na1k
Člen | 288
+
0
-

Díky, po menších počátečních problémech jsem to celé předělal. Teď používám továrničky + parametry z $this->getParam()