Nezobrazují se validační chybové zprávy
- milanb
- Člen | 64
Ahoj, mám problém s formulářem, kde mám prvek s nastavenou validací
(zadání IČ), ale nezobrazuje se mi validační zpráva při špatně zadaném
vstupu.
Přidání prvku c validací pomocí regulárního výrazu:
...
$form->addText('oid', $l->clientOid, 8, 8)
->addRule(Form::PATTERN, 'IČ musí mít 8 číslic', '(^$)|(\d{8})');
...
$form->addSubmit('updateClient', 'Uložit')
...
A když zadám IČ např. kratší 8 znaků, tak se sice prvek zarámuje
červenou, ale nezobrazí se žádná zpráva. Vlastně ani nevím, kde a jaká
zpráva to má být, jen text zprávy je mi jasný, protože jsem ho sám zadal
:-)
Kde dělám chybu?
- Ondřej Kubíček
- Člen | 494
pokud formulář vykresluješ ručně, musíš i ručně vypsat chyby:
<ul class="errors" n:if="$form->hasErrors()">
<li n:foreach="$form->errors as $error">{$error}</li>
</ul>
- milanb
- Člen | 64
Myslím, že nevykresluju ručně. Mám latte šablonu, která začíná takto:
{form clientDetail}
<div class="row thin">
<div class="col-sm-3 col-xs-12">{label title /}</div>
<div class="col-sm-8 col-xs-12">{input title}</div>
</div>
<div class="row thin">
<div class="col-sm-3 col-xs-12">{label oid /}</div>
<div class="col-sm-9 col-xs-12">{input oid}
{input btnARES}</div>
</div>
...
- milanb
- Člen | 64
Já si představuji tohle: Zadám do pole IČ, které je kratší ⇒ odešlu
formulář tlačítkem Uložit ⇒ validace neprojde ⇒ zobrazí se někde
validační zpráva a formulář zůstane otevřen = jakoby neodeslán (tedy
jestli to jde).
A netteForms.js mám načten.
Editoval milanb (14. 4. 2019 13:10)
- Šaman
- Člen | 2667
netteForms.js
slouží k tomu, že nedovolí odeslat špatně vyplněný formulář. Takže by ti měl vyběhnout alert s chybou, ale formulář se neodešle (nemělo by se tedy ani obarvit políčko červeně).- Pokud onen JS vyhodíš (třeba proto, že alert je nehezký), tak máš dvě možnosti, buď používáš AJAX, nebo ne. V případě ajaxového zpracování musíš ke každému formuláři přidat událost onError, ve které formulář překreslíš (a předvyplníš hodnoty co uživatel zadal). Bez ajaxu by to mělo fungovat tak, že se ti stránka reloadne a nahoře ve formuláři vypíšou chyby (resp tam, kde si je vykreslíš tím kódem výše).
A my netušíme, kde v tom máš chybu. Pro začátek bych doporučoval
zakomentovat ručni vykreslování a formulář vykreslit makrem
{control clientDetail}
a uvidíš, jak se to chová. To tě
nasměruje k tomu, jestli je chyba v šabloně, nebo v definici
formuláře.
P.S. Čistě za sebe doporučuji, aby se každý pravý formulář jmenoval
…Form. Tedy tady clientDetailForm
. A naopak komponenta, která
není přímo formulářem (ale třeba ho jen obaluje), aby se tak nejmenovala.
To už ale není závazné, jen moje osvědčená konvence.
- milanb
- Člen | 64
Aha, tak to jsem asi dosud špatně vysvětloval. Já chci dosáhnout
chování ad. 1., tzn. aby se mi špatně vyplněný form ani neodeslal. To
červené orámování sice nevím, odkud se bere, ale stane se ještě před
odesláním. Jen nikde není vidět žádná hláška. Myslel jsem, že
netteForms.js zajišťuje oboje: jak validaci ⇒ neodeslání, tak
i zobrazení validační zprávy, v uvedeném případě, že ‚IČ musí
mít 8 číslic‘.
A fíky za tip ohledně konvence pojmenování formulářů. (I když zase
netuším, co myslíš tím ‚pravý‘. Jaký by byl ‚falešný‘?)
V mezičase zkusím {control clientDetail}
. Díky.
- Šaman
- Člen | 2667
Tak to obarvování ještě může dělat prohlížeč nad políčky, která
mají definovaná HTML5 validační pravidla. Typicky nad required
inputy, pokud nejsou vyplněné.
JS validace (netteForms.js
) by měla vyhazovat alert (aspoň
doufám, že ze to v Nette3 nezměnilo). Pokud alert nevyskočí, pak je někde
chyba – v přilinkování netteForms.js
, v jeho verzi, nebo
v definici validačního pravidla. Zkus nějaké základní bez regulárních
výrazů, když to bue fungovat, pak bych teprve ladil reguláry.
A co se týče „pravých“ a „falešných“ formulářů: Pravý
formulář je klasický Form
(protected function createComponent ClientDetailForm(): Form
).
Výsledek je opravdu Form a můžeš tedy provést třeba
v presenteru $this['clientDetailForm']->setValues([]);
Ale někdy se vyplatí schovat ten formulář do komponenty třeba proto, že
ho chci vykreslovat ručně, ale často. Pak mám konpomentu
Control
(nikoliv Form
) která obsahuje Form a má
vlastní šablonu a v ní ten formulář vykreslím jak chci. Pokud ale chci
v presenteru nastavovat hodnoty toho formuláře (což třeba při editaci
chci), tak OOP čistý způsob by byl, aby ta komponenta uměla natavit tyto
hodnoty formuláři sama. Jednodušší způsob je pak vytvořit getter, který
mi ten formulář vrátí a presenter s ním pak už pracuje jako s Formem.
Takže v presenteru
$this['clientDetailFormControl']->getForm()->setValues([]);
A když mám v apliaci půlku tak a půlku tak, je lepší když už podle
jména poznám, jestli pracuji s instancí Form, nebo Control (která
obsahuje form).
Editoval Šaman (14. 4. 2019 17:18)