AJAX změna struktůry formuláře

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

Zdravím, používám Nette 2.0.12 a řeším následující problém:

potřebuji při změně hodnoty v selectboxu vyměnit jeden formulář, za druhý. To není až tak složité, až na to, že po výměně těch formulářů se stále volá akce (na onSuccess) toho prvního formuláře – resp. do callbacku se posílají data z prvního formuláře.

Jak tedy pomocí AJAXU vyměnit jeden formulář za druhý včetně jeho akce?

Má implementace viz následující kód:

presenter

<?php
protected function createComponentEditItemForm() {
	$form = new Form;
	// pridani ruznych inputu
	$form->addSelect('section_id', 'Sekce příspěvku', $this->itemSections->fetchPairs('id', 'name'))
		->addRule(Form::FILLED, 'Prosím zvolte Sekci.')
		->setPrompt('Sekce příspěvků')
		// zde se pres ajax provede volani nize uvedeneho handleru
		->getControlPrototype()->onChange('changeSection(this.value)');
	// definovani akce - tohle se vola vzdy - jak vymenit?
	$form->onSuccess[] = callback($this, 'editItemFormSubmitted');
	return $form;
}

public function handleChangeEditItemContext($sectionId) {

	if ($this->isAjax()) {

		// vytvoreni noveho formulare
		$sectionForm = new SectionsForm($sectionId);
		// nove definovani akce
		$sectionForm->onSuccess[] = callback($this, 'editItemFormSubmitted');
		// nahrazeni puvodniho formulare
		$this['editItemForm'] = $sectionForm;

		$this->invalidateControl('editForm');
	}
}
?>

Editoval ODIS (14. 2. 2014 10:51)

ODIS
Člen | 33
+
0
-

Češtináři, pardon za to „ů“ v názvu threadu :-D

Editoval ODIS (14. 2. 2014 10:49)

ODIS
Člen | 33
+
0
-

Vyřešeno: v handleru nastavím session a v komponentě podle ní sestavím požadovaný formulář.

mildhouse
Člen | 27
+
0
-

Ahoj,

cokoli, co v handle uděláš, je po odeslání formuláře zapomenuto. Takže buď jak píšeš – uložit do SESSION, nebo já používám hodnoty z odeslaného formuláře :

$this->section_id = $this->getRequest()->post['section_id'];

a $this->section_id pak použiju stejně, jako když to vytáhnu ze SESSION, akorát nemusim řešit expiraci SESSION.

Ale jestli je to správné řešení, to netušim.