AJAX self-redraw selectbox validácia + zachovanie stavu

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

Zdravím,
pre účely voľby kategórie vo formulári používam self-redraw selectbox. Formulár je konštruovaný ako komponenta.
Workflow :

  • JS onchange event na selectboxe
  • AJAX volanie handle a predanie parametra (zvolenej kategórie)
  • handle načíta podkategórie, selectbox->setItems(podkategórie)
  • redraw snippetu, ktorý zaobaľuje selectbox

Vizuálna funkcionalita funguje správne, mám ale problém so správnou validáciou a odoslaním formulára s takýmto selectboxom. Formulár validujem na strane servera, JS validáciu som vypol – nenačítavam netteForms.js.

Nette mi nedovolí odoslať formulár ak ten selectbox prekreslím, chyba :
„Please select a valid option“. (btw. selectbox nie je nastavený ako required)

Pokúsil som sa teda nastaviť validationscope na elementy okrem spomínaného selectboxu. Toto riešenie mi síce umožní odoslať formulár a dostanem sa k zvolenej hodnote (používam onSuccess funkciu) , avšak :

  • ak nastane chyba a formulár sa užívateľovi vráti, selectbox je resetovaný na pôvodné hodnoty, takže neudrží svoj stav a kategóriu je nutné voliť znovu
  • na strane servera potrebujem zvolenú kategóriu zvalidovať vlastnou logikou, v prípade chyby pridať formu error a formulár vrátiť užívateľovi

Môže mi prosím niekto poradiť ako riešiť danú situáciu, použitie selectu je možno nesprávne, ale neviem akú inú konštrukciu použiť na „neobmedzené“ zavnorovanie sa kategórii a ich voľbu. Nenašiel som žiaden podobný prípad, situáciu kde by som sa mohol inšpirovať riešením. Predpokladal som, že situácia bude riešiteľná podobne ako dependent selextbox (ktorý používam bezproblémovo), avšak narazil som na vyššie popísané problémy ktoré nedokážem odstrániť.

nette/application v2.3.12
nette/forms v2.3.8
nette.ajax.js 2.0.0

Ďakujem

Editoval unnamed21 (1. 8. 2016 14:25)

unnamed21
Člen | 3
+
0
-

Takže odpovedám sám sebe – situáciu som vyriešil tak, že element ktorý prekresľuje sám seba nie je zaradený do validation scope formulára. Pred succeed funkciu je postavená validate funkcia, ktorá rieši validáciu elementu vytiahnutého z validation scope.
Pre zachovanie stavu elementu po odoslaní nevalidného formulára vo validate funkcii nastavujem stav (elementy selectu) znovu, takže po vrátení formuláru je vyrenderovaný stav ako bol pred odoslaním.
Seba prekresľujúci selectbox slúži len ako vizualizačné konštrukcia, finálnu hodnotu udržiavam pomocou hidden atribútu nastaveného cez JS. Validácia prebieha v podstate dvojnásobne, ako vo validate, tak aj succeed funkcii.

Ak môže niekto okomentovať či je tento postup správny a bezpečný budem rád.
Ďakujem