Validace upraveneho fomulare
- snorlax
- Člen | 5
Zdravim,
mam formular, ktory upravujem javascriptom na strane klienta. Javascript zmeni niektore prvky formularu na enabled z disabled. Tieto prvky sa neobjavia pri volani callbacku onValidate[]. Pri spracovani formulara sa pouziju spravne hodnoty.
Nefunguje ani pridanie podmienky
$form["uni_krb2"]->setDisabled(false)->addRule(callback($this, 'validateUniversalWidth'), 'Pro komíny o průměrech 14 cm nejsou k dispozici zaústění v 45 stupňovém uhlu.');
v handli, ktory meni formular a povoluje prvky.
Nejak som z toho mimo.
- Tomáš Kolinger
- Člen | 136
Jak nastavuješ ten JS prvek na aktivní – provádí se nějaká AJAXová operace, kde odesíláš změnu prvku na server? Nebo prostě nastavíš enabled jen u klienta? Tady by dost pomohla struktura tvojeho presenteru.
Důležitý je stav prvku při validaci, resp. po odeslání – ten je
očividně disabled. Pokud je prvek vytvořen jako disabled, musíš formulář
změnit dřív, než se zpracuje → třeba v action
. Nette
nehledí na stav formuláře u klienta, očekává jen ty prvky, které jsou
nastavené na serveru.
Editoval Tomáš Kolinger (26. 2. 2013 8:08)
- snorlax
- Člen | 5
Prvky formularu nastavujem na enabled cez Ajax a handle. JS je pripojeny na select a pri zmene sa nastavia formularove prvky a potom sa invaliduje formular a vykresli nanovo.
Problem je v tom, ze pri $form->onValidate[] a $form->onSubmit[] su rozne hodnoty a rozne nastavene prvky.
Prezenter ma 20Kb, to tu nezavesim.
Inak formular sa vytvara cez tovarnicku a cely prezenter renderDefault mam prazdny, vsetko sa vytvori este v Action. Formular sa vytvara dynamicky podla definicie v databaze.
Dufam, ze som ti nejak osvetlil situaciu. :)
- Tomáš Kolinger
- Člen | 136
Můžeš poslat alespoň ten handle? Resp. jakým způsobem ukládáš stav formuláře.
- snorlax
- Člen | 5
toto je handle, v ktorom to potrebujem osetrit, uz je tam pridana aj podmienka (addRule) aby to validoval vlastnou funkciou
public function handleSelectLoadUniversal($typ,$strecha)
{
$gets = $this->request->getParameters();
$typ = $gets['uni_typ'];
$strecha = $gets['uni_nadstr'];
$form = $this->getComponent("insertForm"); // our form
switch($strecha)
{
case 'UND':
$form["uni_res_nadstr"]->setDisabled(true);
$form["uni_navlek"]->setDisabled(true);
$form["uni_dekor"]->setDisabled(false);
break;
case 'KN':
$form["uni_navlek"]->setDisabled(false);
$form["uni_res_nadstr"]->setDisabled(true);
$form["uni_dekor"]->setDisabled(true);
break;
default:
if($strecha == 'KSDZ')
$form["uni_res_nadstr"]->setDisabled(false);
else
$form["uni_res_nadstr"]->setDisabled(true);
$form["uni_navlek"]->setDisabled(true);
$form["uni_dekor"]->setDisabled(true);
break;
}
switch($typ)
{
case 'J1':
$form["uni_prumer2"]->setDisabled(true);
$form["uni_krb2"]->setDisabled(true);
$newArray = $this->getValues('uni_prumer1');
break;
case 'J1V':
$form["uni_prumer2"]->setDisabled(true);
$form["uni_krb2"]->setDisabled(true);
$newArray = $this->getValues('uni_prumer1v');
break;
default:
$form["uni_prumer2"]->setDisabled(false)->addRule(callback($this, 'validateUniversalWidth'), 'Pro komíny o průměrech 14 cm nejsou k dispozici zaústění v 45 stupňovém uhlu.');
$form["uni_krb2"]->setDisabled(false)->addRule(callback($this, 'validateUniversalWidth'), 'Pro komíny o průměrech 14 cm nejsou k dispozici zaústění v 45 stupňovém uhlu.');
$newArray = $this->getValues('uni_prumer1v');
break;
}
$form["uni_prumer1"]->setItems($newArray);
//set up old values;
unset($gets['action']);
unset($gets['id']);
unset($gets['do']);
foreach( $gets as $key => $item )
$form[$key]->setDefaultValue($item);
$this->presenter->invalidateControl("formS"); // invalidate ajax snippet
}
- Tomáš Kolinger
- Člen | 136
No a to je ten problém – přes handle to sice nastavíš ale jak odešleš formulář, tak se stav z handle samozřejmě smaže… Jelikož se místo handle spustí zpracování formu…
Ty to musíš někam uložit, aby to přežilo mezi požadavkama…
Třeba přes handle do persistentních parametrů a pak tu logiku
nastavení formu spouštěj v
Předávání v GETu bude lepší a hlavně to bude fungovat :Daction
. To je asi nejsnažší.
Editoval Tomáš Kolinger (26. 2. 2013 12:20)
- snorlax
- Člen | 5
Kym som cakal na odpoved, pokusil som sa to spravit cez javascript validaci.
Pri zmene formularu poslem na stranku podmienky na javascript validaciu, na stranke sa v zdrojaky sa objavia, ale funguje iba ten, ktory som nezmenil.
Tomu uz vobec nerozumiem. Dam tomu kus cas.
Dakujem
- Tomáš Kolinger
- Člen | 136
Validovat data jen u klienta není řešení. Je to tak trochu nebezpečný :).
A co handle úplně vynechat a místo toho vždy odkázat na aktuální stránku a předat potřebné parametry?
...
public function actionDefault($typ, $strecha)
{
...
switch($strecha) {
case 'UND':
...
}
switch($typ) {
case 'J1':
...
}
...
}
...
Editoval Tomáš Kolinger (26. 2. 2013 12:22)
- snorlax
- Člen | 5
Validace na strane klienta je riesenie, nejde o raketove inzinierstvo, ale o system na vypocet ceny kominoveho systemu z hotovych prvkov, ktore vyrobca dodava. Je niekolko kominovych systemov a tie maju viacero parametrov. Ked pridam dalsiu kominovu ruru tak ju treba tiez osetrit na hranicnu hodnotu.
Aby som vyriesil problem, asi najschodnejsia cesta je validovat formular u klienta, kedze mam validacnu podmienku zapisanu vo formulari, len z nejakeho mne neznameho dovodu ju nespusti. Pre jednu ruru hej, pre druhu, ked vykreslim formular aj s podmienkou pre validaciu tak validacia nefunguje.
Prerabat system, ktory funguje pre asi 10 kominovych systemov nema zmysel.