[BUG?] Přesouvání prvků ve formuláři

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
_Martin_
Generous Backer | 679
+
0
-

Vážení, taky si myslíte, že následující ukázky kódu jsou funkčně totožné?

Ukázka 1

protected function createComponentMainForm($name)
{
	$form = new AppForm;
	$form->addText('name', 'Jméno:')
		->addRule(Form::FILLED, 'Vyplňte jméno');

	$container = new FormContainer;
	$control = $form['name'];
	unset($form['name']);

	$container['name'] = $control;
	unset($control);

	$form['test'] = $container;
	unset($container);

	$form->addSubmit('send', 'Odeslat');

	return $form;
}

Ukázka 2

protected function createComponentMainForm($name)
{
	$form = new AppForm($this, $name); // formulář přiřadíme k presenteru už v továrničce
	$form->addText('name', 'Jméno:')
		->addRule(Form::FILLED, 'Vyplňte jméno');

	$container = new FormContainer;
	$control = $form['name'];
	unset($form['name']);

	$container['name'] = $control;
	unset($control);

	$form['test'] = $container;
	unset($container);

	$form->addSubmit('send', 'Odeslat');

	return $form;
}

Tak bohužel. Zatímco první kód nádherně funguje, druhý nikoliv: po odeslání formuláře se přestane zohledňovat, že prvek je obsažen v kontejneru – tím pádem má zcela jiné jméno, takže si ani nenačte vyplněná data.

Zajímalo by mě, co s tím – je to bug? Nebo je to fičurka? Měl bych si dát na něco pozor? Osobně bych čekal, že se obě ukázky budou chovat identicky.

Edit:

Ono je to vůbec zvláštní: tenhle ukázkovej kód je jen takové zjednodušení. Mám totiž vlastní formulář dědící od AppForm a ten podobné přesouvání prvků dělá v jedné metodě. A nabízí se otázka, v jakém místě onu metodu volat – původně jsem jí chtěl volat před metodami render a __toString (kvůli prvnímu vypsání formuláře) a před metodou signalReceived (po odeslání). Bohužel, toto nefunguje (tyto metody jsou pravděpodobně zavolány až po ukončení továrničky, kde dochází k přiřazení formuláře do komponenty) → po odeslání se projevuje výše popsaný bug. Sice bych mohl využít metody attached, ale potom bych zase nemohl dále s formulářem pracovat třeba v metodě action (jakékoliv první zavolání továrničky by provedlo změny ve struktuře formuláře pomocí té mé metody).

Takže nevím, zda tuto metodu volat někde jinde (a kde jinde?) či jde o bug.

Napadlo mě sice řešení, ale znamenalo by to kompletní přepsání oné metody a nebylo by to vůbec triviální – navíc se bojím, aby pak taky nevykouklo podobné nemilé překvapení.

Editoval _Martin_ (27. 9. 2009 22:03)

Honza Kuchař
Člen | 1662
+
0
-

To přiřazení už v továrnične sice není povinné, ale pokud se to udělá, nic se tím nezkazí. Naopak, potom můžeš využívat pokročilé funkce nových formulářů.

//Edit: Nicméně tím nevylučuji, že je to bug.

Editoval honzakuchar (28. 9. 2009 0:21)

David Grudl
Nette Core | 8229
+
0
-

fixed