Validační pravidlo ->addRule(callback()) pro více parametrů

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

Zdravím,

mám ve formuláři dva parametry: ‚název‘ a ‚verze‘
chtěl bych přidat kontrolu, která v databázi ověří že taková kombinace se nevyskytuje, s tím že by případně vrátila standardní chybu.

Našel jsem postup pro jeden parametr, ale nepřišel jsem na to, jak se v callback funkci dostat k ostatním parametrům.

westrem
Člen | 398
+
0
-

No problem je v tom, ze pomocou addRule nastavujes pravidlo pre jedno pole, nie pre viac.

Easy riesenie ale je nasledovne:
Kedze AppForm je potomok FormContainer ma k dispozicii pole $onValidate, tu pridaj tvoju validacnu funkciu ako callback, pricom parametrom je cely formular.

V nej si pomocou getValues vytiahnes hodnoty, ktore potrebujes (nazev, verze), ocekuj voci DB a ak nieco nesedi tak nad formularom zavolaj addError a nastav $this->valid na FALSE a mas hotovo.

Pre viac info vid API source code k FormContainer

nAS
Člen | 277
+
0
-

Každý prvek formuláře obsahuje odkaz na rodičovský formulář. Takže v tom callbacku pro jeden prvek si můžeš vytáhnout hodnoty všech ostatních prvků formuláře.

westrem
Člen | 398
+
0
-

nAS napsal(a):

Každý prvek formuláře obsahuje odkaz na rodičovský formulář. Takže v tom callbacku pro jeden prvek si můžeš vytáhnout hodnoty všech ostatních prvků formuláře.

To je sice pravda ale toto riesenie postrada semantiku. Nalepus rule na jeden prvok a v callbacku kontrolujes X dalsich? A co ak niekde nieco zmenis, povies si ze ten callback uz nepotrebujes na tom prvku, odstranis ho a prides zrazu o kontrolu aj tych ostatnych prvkov?

Nilp
Člen | 65
+
0
-

Osobně tyhle kontroly řeším až vyhazováním vyjímek z příslušné metody modelu, je zaručena transakční bezpečnost a je možné využít UNIQUE indexu.

nAS
Člen | 277
+
0
-

westrem napsal(a):

To je sice pravda ale toto riesenie postrada semantiku. Nalepus rule na jeden prvok a v callbacku kontrolujes X dalsich? A co ak niekde nieco zmenis, povies si ze ten callback uz nepotrebujes na tom prvku, odstranis ho a prides zrazu o kontrolu aj tych ostatnych prvkov?

Já neříkám, že to je univerzální řešení. Prostě je to další možnost, která v některých případech může mít smysl (např. kontroluji jednu položku, akorát ve výjimečném případě se potřebuji podívat na hodnotu jiné).

westrem
Člen | 398
+
0
-

Nilp napsal(a):

Osobně tyhle kontroly řeším až vyhazováním vyjímek z příslušné metody modelu, je zaručena transakční bezpečnost a je možné využít UNIQUE indexu.

Ano ano, tak som to myslel ale v tom zmysle, ze toto bude zaobalene v tom validacnom callbacku. Tam kde spominam, ze sa to „ocekuje voci DB“ je presne zahrnute to, ze to poslem modelom na DB a snazim sa odchytit exception s nejakou rozumnou hlaskou, ktoru potom v pripade potreby zobrazim pri formulari.

2bfree
Člen | 248
+
0
-

westrem napsal(a):

No problem je v tom, ze pomocou addRule nastavujes pravidlo pre jedno pole, nie pre viac.

Easy riesenie ale je nasledovne:
Kedze AppForm je potomok FormContainer ma k dispozicii pole $onValidate, tu pridaj tvoju validacnu funkciu ako callback, pricom parametrom je cely formular.

V nej si pomocou getValues vytiahnes hodnoty, ktore potrebujes (nazev, verze), ocekuj voci DB a ak nieco nesedi tak nad formularom zavolaj addError a nastav $this->valid na FALSE a mas hotovo.

Pre viac info vid API source code k FormContainer

To je přesně ro řešení co hledám. ;) Udělal jsem ty callback metody dal jsem do nich patřičné kontroly, ale i když to vrátí TRUE nebo FALSE, tak to na mě se*e jak na placatý kámen a klidně to směle projde. ;(