Jak odebrat pole formuláře?
- OK3
- Člen | 91
Ahoj, potřeboval bych na základě určité podmínky odstranit pole z formuláře. Jak na to?
<?php
class FooPresenter extends Presenter {
public function renderForm() {
$form = $this->getComponent('fooForm');
if(/* podmínka */) {
// odebrat pole 'baz' nebo jakýkoliv jiný control
// co zavolat?
}
}
public function createComponentFooForm() {
$form = new AppForm;
$form->addText('bar', 'Bar:');
$form->addText('baz', 'Baz:');
$form->addSubmit('go', 'Go!');
$form->onSubmit[] = callback($this, 'fooFormSubmitted');
return $form;
}
public function fooFormSubmitted(AppForm $form) {
// obsluha
}
}
?>
Určitě bych to rád řešil někde v presenteru, protože bude mít data nutná k vyhodnocení podmínky. Motivace je taková, že chci mít jeden formulář, ovšem různí uřivatelé mohou editovat různá pole (a ta, co nemohou editovat, by tedy neměli ani vidět).
Nějaké nápady? :)
- norbe
- Backer | 405
Odstranění nějakého pole jde tuším pomocí
unset($form["baz"])
.
Co se týče tvého problému, řešit odstraňování prvků v render fázi už je celkem pozdě (probíhá po zpracování signálů a tudíž se ti bude aplikace chovat nepředvídatelně). Nejlepší je to vyřešit přímo v továrničce, případně v actionXyz metodách.
- OK3
- Člen | 91
Díky za odpověď. Vyzkouším to, asi nebude problém přesunout tu logiku
z render funkce do továrničky.
Napadá mě, proč na to není nějaká zabudovaná inverzní funkce
k přidávání polí? Je to nějaká nestandardní praktika upravovat nebo
měnit pole formuláře?
Editoval OK3 (12. 10. 2010 15:32)
- westrem
- Člen | 398
No podla mna je tak trochu proti semantike (tym nevravim, ze je to zle) odstranovat prvky z formularu. Formular predsa sam budujes a co nechces tak donho nedas.
Dalej hore uvedeny postup:
unset($form['component_name']);
je plne validny sposob ako odstranit komponentu. Inac na to existuje funkcia
removeComponent
ale tej davas ako parameter uz samotnu komponentu a
nie nazov, preto tato skratka cez pole.
Neda sa mi ale nespytat, co ti brani pouzit nasledovnu konstrukciu:
if ( ! (/* some condition */) ) {
$form->addText( .. );
}
Proste namiesto testovanie podmienky otestujes negaciu a vtedy to tam pridas. To by musela byt uz fakt neviem co za podmienka aby sa nedala pouzit jednoducha negacia.
- OK3
- Člen | 91
Důvod, proč jsem podmínku záměrně nedal k deklaraci formuláře, je ten, že formulář může být umístěn v samostatné třídě (jako komponenta) a já pro vyhodnocení podmínky potřebuju data, která má presenter. Ta bych musel nějak předávat a to se mi nechce :) Proto jsem myslel, že by bylo vhodné tuto podmínku vyhodnocovat právě v presenteru, konkrétně v továrničce formuláře.