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

- na1k
 - Člen | 288
 
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
 
public function actionSmth() {
    $this->template->form = $this->getComponent('form');
}
To by nešlo?

- David Grudl
 - Nette Core | 8285
 
Klidně i v render:
public function renderSmth() {
    $this->template->form = $this['form'];
}
Nebo rovnou v šabloně:
{$presenter['form']->render('begin')
				
- na1k
 - Člen | 288
 
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
 
na1k napsal(a):
Ale svému
prepareXYjsem předával k tvorbě formuláře parametr – id záznamu který se přessetDefaultsnač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ž vactionXYa 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) );
}