Nezobrazují se validační chybové zprávy

milanb
Člen | 64
+
0
-

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

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

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>
    ...
chemix
Nette Core | 1296
+
0
-

@milanb to je rucni vykreslovani

milanb
Člen | 64
+
0
-

Aha… Proto jsem asi ve fóru Začátečníci :-) Díky moc.

milanb
Člen | 64
+
0
-

No tak jsem to připsal na začátek šablony hned za {form clientDetail} a stále nic nevidím. Nebo to patří jinam?

chemix
Nette Core | 1296
+
0
-

@milanb zeptam se a co ocekavas, ze se ma stat? Nebo spis otazka kdy?

Jde o to treba, zda mas nactent i forms.js pro validaci. Tahle validace, pokud nedas js tak se provadi az po odeslani formulare.

Ten se ti odesle? Zpracuje?

milanb
Člen | 64
+
0
-

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 | 2635
+
0
-
  1. 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ě).
  2. 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
+
0
-

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

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)

milanb
Člen | 64
+
+1
-

Tak už to mám, našel jsem „díru v lodi“. Totiž, já většinu toho kódu zdědil a původní autor… No nic. Prostě v netteForms.js zapoznámkoval právě alert(message); ve funkci Nette.addError. Moc se omlouvám, že jsem vás zdržoval a díky za inspirující rady a informace.
[SOLVED]