[BUG?] Přesouvání prvků ve formuláři
- _Martin_
- Generous Backer | 679
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
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)