Jak dostat do formuláře změny v jQuery?

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

Omlouvám, jestli jsem netrefil správně sekci.

Mám formulář a v něm vytvořím selectBox a submit příkazy:

	$this->addSelect('NID', 'Místo:');
	...
	$this->addSubmit('OK', 'Vložit')
		    ->onClick[] = callback($this, 'insertSubmitted');

Tento select pak naplním přes jQuery a AJAX nějakým seznamem. (Opravdu se zobrazuje menu voleb select boxu).

Vyberu položku a formulář odešlu tlačítkem, ale hodnoty selectboxu se mi nepřenesou (NID obsahuje NULL).

Co jsem ještě zapomněl udělat? Invalidace a případně čeho, …
Nebo se to musí odeslat jinak ?

Díky za radu.

Nox
Člen | 378
+
0
-

Ten select bys imho měl naplnit už v PHP, v JS pak max. třeba jen vybrat hodnotu…

smi
Člen | 75
+
0
-

Nox napsal(a):

Ten select bys imho měl naplnit už v PHP, v JS pak max. třeba jen vybrat hodnotu…

Taky jsem to zkusil, ale výsledek byl stejný

uestla
Backer | 796
+
0
-

Máme opravdu málo kódu, abychom ti dokázali poradit.

smi
Člen | 75
+
0
-

uestla napsal(a):

Máme opravdu málo kódu, abychom ti dokázali poradit.

Mě jde o princip. Jak promítnout změny udělané ve formuláři JavaScriptem, tak aby se projevily v Nette. Například při odeslání. Tohle jsem nikde nenašel. Vypsat je trivka, ale jak je zachytit.

hAssassin
Člen | 293
+
0
-

@smi > neco podobnyho se to tu uz resilo nekolikrat, napr: zde.

smi
Člen | 75
+
0
-

hAssassin napsal(a):

@smi > neco podobnyho se to tu uz resilo nekolikrat, napr: zde.

Není to úplně ono – na select mi to nefunguje, ale přes hidden si to předám. Tak zatím díky.

Kdyby bylo ještě „úplné“ (popř. elegantní) řešení, tak ho uvítám.

hAssassin
Člen | 293
+
0
-

@smi > no select ma tu vlastnost ze memuzes podstrcit hodnotu (at uz pres JS nebo FireBug), ktera neni ve <option value>, takze jestli spis neni problem v tomhle pripade tady.

smi
Člen | 75
+
0
-

hAssassin napsal(a):

@smi > no select ma tu vlastnost ze memuzes podstrcit hodnotu (at uz pres JS nebo FireBug), ktera neni ve <option value>, takze jestli spis neni problem v tomhle pripade tady.

Aha. No, já vytvořím v Nette select prázdný a pak ho pomocí jQuery vytvořím (data dostanu AJAXem). Hodnoty odvíjejí od vyplnění PSČ, takže to musím dělat až on-line.

	// Menu
	var $menu = $('[id$=NID]');

	// Vymazat predchozi menu
	$menu.empty();

	// Mam polozky menu => vytvorit
	$menu.append("<option value='0'>Zvolte místo:</option>");
	for (var i in payload.menu) {
		$menu.append("<option value='" + i + "'>" + payload.menu[i] + "</option>");
	}

Takže tam value je, ale nemám zkušenosti s tím jak se to chová.

hAssassin
Člen | 293
+
0
-

@smi > hm, tak tohle bych rekl, ze presne nebude fungovat… Co to udelat tak, ze by cely ten select byl snippet ktery by se generoval po vzdy po zadani PSC? myslim tim cely v cetne options. Nebo ho proste naplnit vychozimi hodnotami (nezavile na PSC), pak je po nacteni stranky JS smazat a pak po zadani PSC je znovu naplnit. Je to sice dost krkolomny ale fungovat by to mohlo. Ikdyz to prvni reseni je, myslim si, lepsi.

smi
Člen | 75
+
0
-

hAssassin napsal(a):

@smi > hm, tak tohle bych rekl, ze presne nebude fungovat… Co to udelat tak, ze by cely ten select byl snippet ktery by se generoval po vzdy po zadani PSC? myslim tim cely v cetne options. Nebo ho proste naplnit vychozimi hodnotami (nezavile na PSC), pak je po nacteni stranky JS smazat a pak po zadani PSC je znovu naplnit. Je to sice dost krkolomny ale fungovat by to mohlo. Ikdyz to prvni reseni je, myslim si, lepsi.

Snippety jsem ještě nezkoušel, ale jak Tě sleduji, tak to u nich asi skončí. Jinak je problém s hodnotami value, které se právě liší – nejde tedy jen vyměnit popisky.

Snippet mě odrazoval proto, že je ta položka uvnitř formuláře, tak jsem si začínáním s ním nechtěl komplikovat situaci, ale asi to jinak nepůjde.

Každopádně díky za rady.

hAssassin
Člen | 293
+
0
-

ano, to ze je to je uvnitr formulare si uvedomuju a nejsem si jisty jak obalit snippetem jen ten select a invalidovat pouze jeho. To necham na nekom jinym aby poradil.

Jinak text v <option> menit muzes jak chces, ale hodnotu atributu value si Nette kontroluje a zmenu dovoli pouze na takovou hodnotu, ktera je v seznamu. Proste si to hlida aby tam nebylo mozny zadat nejakou blbost. Otazka ovsem je, jak se to bude chovat potom, co tam AJAXem posles novy select s novymi hodnotami. To fakt netusim.

smi
Člen | 75
+
0
-

hAssassin napsal(a):

ano, to ze je to je uvnitr formulare si uvedomuju a nejsem si jisty jak obalit snippetem jen ten select a invalidovat pouze jeho. To necham na nekom jinym aby poradil.

Jinak text v <option> menit muzes jak chces, ale hodnotu atributu value si Nette kontroluje a zmenu dovoli pouze na takovou hodnotu, ktera je v seznamu. Proste si to hlida aby tam nebylo mozny zadat nejakou blbost. Otazka ovsem je, jak se to bude chovat potom, co tam AJAXem posles novy select s novymi hodnotami. To fakt netusim.

Podle mě value se přes tu kontrolu neprotlačí. (Vyřešil jsem to prozatím hidden položkou, kterou aktualizuji v onChange select boxu. Ten hidden se pak podá OK)

Snippet budu muset dát kolem selectu v šabloně formuláře ⇒ to pak ale nebudu moci použít default render. Zkusím to až bude čas, teď jsem v presu :o)

Editoval smi (15. 9. 2011 21:25)

Jan Endel
Člen | 1016
+
0
-

Nečetl jsem všechny příspěvky, ale nette kontroluje, jaké optiony jsi zadal do SB, čili jednoduše selectbox napln všemi možnostmi pro všechny psč (js ho disablni) a po vyplnění psč přebytečné hodnoty odmaž a opět js povol jeho změnu. Takhle ti to jednak odešle hodnotu co chceš a jednak to bude funkční i pro ty co nemají js, sice jsou ve velké menšině ale i tak. Akorát si ještě hlídej to, že ti někdo může poslat dvojci psč a hodnota selectboxu, co k sobě nepasuje, nevím jak máš navrhnutou aplikaci, jenom počítej i s tímto stavem.

22
Člen | 1478
+
0
-

co je to za bejkovinu @pilec?

  • stačí dbát živoyního cyklu presenteru
  • myslet na to. že se setavuje formulář znova

tzn.: jediné, co je potřeba uložit změnu rodič. selectboxu třeba do session a pokud je session tak child selectbox naplnit příslušnou hodnotou a form vrací normálně validní data i po AJAXové změně bez nějakých hacků!

smi
Člen | 75
+
0
-

pilec napsal(a):

Nečetl jsem všechny příspěvky, ale nette kontroluje, jaké optiony jsi zadal do SB, čili jednoduše selectbox napln všemi možnostmi pro všechny psč (js ho disablni) a po vyplnění psč přebytečné hodnoty odmaž a opět js povol jeho změnu. Takhle ti to jednak odešle hodnotu co chceš a jednak to bude funkční i pro ty co nemají js, sice jsou ve velké menšině ale i tak. Akorát si ještě hlídej to, že ti někdo může poslat dvojci psč a hodnota selectboxu, co k sobě nepasuje, nevím jak máš navrhnutou aplikaci, jenom počítej i s tímto stavem.

Jenže k jednomu PSČ patří třeba i patnáct obcí (to je ta moje položka do select boxu).

Aplikace vyhledává podle PSČ nejbližšího doktora. To bych tedy přehazoval MB dat sem a tam – PSČ je 2 693, obcí 16 677. To je i na Nette moc. (Asi dojde na snippety :o) )

Zatím mě to chodí přes nastavení volby do hidden položky v onChange a poslání formuláře. Až bude čas, tak to upravím.

Nota bene je to do administrace, kde s tím bude dělat jen jeden člověk (a to je manželka, tak to nemusí být úplně maximálně promakané :o) )

Jan Endel
Člen | 1016
+
0
-

Ok, netušil jsem, že položek je tolik a jde to do administrace, ale je to taky řešení.

bojovyletoun
Člen | 667
+
0
-

případně použij metodu Nette\Forms\Controls\SelectBox::getRawValue