Jak odebrat pole formuláře?

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

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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.

arron
Člen | 464
+
0
-

Mno, osobne si myslim, ze kdyz uz je ten formular v komponente, tak je lepsi vymyslet nejaky rozumny zpusob predavani tech dat, ktere mohou ovlivnit jeho podobu a resit to primo v te komponente:-)