DependentSelectBox – NULLova hodnota promenne zavisleho SELECT boxu po odeslani formulare

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

Narazil jsem na nasledujici problem (a ani po nekolika hodinach nenasel odpoved).

Pouzivam doplnek "DependentSelectBox ":https://componette.org/search/?… , ktery funguje v pohode. Avsak pri predchozim naplneni zavisleho SELECT boxu hodnotami vznikne urcity problem.

O co jde: Ve formulari jsou dva SELECT boxy – viz nasledujici kod:

public function createComponentMyForm($name) {
$form = new AppForm($this, $name);
$data	=	$this->filter->loadDataFromDatabase();
		$form->addSelect("select1", "Výběr 1", $data);

		$form->addDependentSelectBox("select2", "Výběr 2", $form["select1"], callback($this, "getValuesSelect2"));
		if($this->isAjax())
			$form["select2"]->addOnSubmitCallback(callback($this, "invalidateControl"), "formSnippet");

		$form->addSubmit("final_submit", "Hodnoty !")
			->onClick[] = callback($this, "submitForm");


		return $form;
}

Prvni je obycejny SELECT box, druhy je zminovany DependentSelectBox. Pri vyberu hodnoty z prvniho SELECTu se do druheho spravne nactou z databaze hodnoty pro druhy SELECT box (to zajisti funkce getValuesSelect2).

Mejme napr. situaci, ze prvni SELECT box bude kraj v CR a druhy SELECT box budou krajska mesta. Uzivatel zvoli kraj a mesto a formular potvrdi. Nyni ale potrebuji tento formular zobrazit znovu uz vyplneny a s vybranym krajem a mestem.

Konkretni stranku nacitam jako /presenter/ajaxtest/, proto jsem do presenteru pridal tuto funkci, ktera zjisti ulozene ID kraje i ID mesta. Tato funkce v prvnim SELECT boxu jen nastavi vybrani konkretniho kraje, do druheho SELECT boxu nasype data a vybere konkretni kraj.

	public function actionAjaxtest(){
		// nastaveni vyberu u prvniho SELECT boxu dle ID ziskaneho z databaze
		// ... kod ...
		//
		if(!$this->isAjax()){
			$mesta = $this->filter->loadDataFromDatabase($id_kraje)->fetchPairs('kraj_id', 'nazev');
			$this['myForm']['id_mesto']->setItems($mesta);
			// jeste volam funkci pro zobrazeni ulozeneho mesta v SELECT boxu
			// ... kod ...
			//
		}
	}

Pote pri zmene kraje stale funguje zmena mesta v druhem SELECT boxu, avsak pri odeslani formulare ma ID mesta hodnotu NULL!!! (Pri pouziti Debug::dump($button->getForm()->getValues());

Pritom po odeslani formulare je ve Firebugu pro hodnoty (ktere se odesilaji POSTem) jasne videt, ze id_krajid_mesto maji IDcka nastaveny spravne!

Netusim, kde je chyba. Vim jen, ze kdyz nenaplnuju pred zobrazenim druhy SELECT box, je vse OK.

Delam nekde chybu, nebo jde o nejaky bug?

Pokud postupuju spatne, poradte prosim, jak obejit to, abych umel zobrazit oba SELECT boxy jiz vyplnene. Mozna nepostupuji spravne…

Diky! :-)

Editoval moonlite (6. 3. 2011 9:10)

moonlite
Člen | 8
+
0
-

Jeste pro doplneni – zavisly SELECT box musim predvyplnit hodnotama kvuli tomu, ze pri nacteni formular je tento zavisly SELECT box pochopitelne prazdny. Nevim, ale, jak jinak to udelat. Pokud by slo v prvnim SELECT boxu nastavit ID, pote nejak emulovat AJAXovy pozadavek a pote v druhem SELECT boxu (ktery jiz ma hodnoty) nastavit spravne ID, poradte prosim, jak toho docilit… :-)

Foowie
Člen | 269
+
0
-

A zkoušel jsi $form->setDefaults(...); ? Jinak DSB má metodu refresh($clearValue = false, $recursive = true) která může „pote nejak emulovat AJAXovy pozadavek“

moonlite
Člen | 8
+
0
-

Díky moc za odpověď – $form->setDefaults(…) jsem zkoušel, ale marně. Celý problém vyřešilo zavolání refresh() pro DSB. Díky!!! ;-)

Editoval moonlite (6. 3. 2011 18:44)