Validace upraveneho fomulare

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

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

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

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

Můžeš poslat alespoň ten handle? Resp. jakým způsobem ukládáš stav formuláře.

snorlax
Člen | 5
+
0
-

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

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 action. To je asi nejsnažší. Předávání v GETu bude lepší a hlavně to bude fungovat :D

Editoval Tomáš Kolinger (26. 2. 2013 12:20)

snorlax
Člen | 5
+
0
-

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

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

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.