Validace formuláře – chybné zpracování

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

Dobrý den mám formulář v presenteru ale nefunfuje mi u něj validace:

$form = new Form($this, 'objednavkaForm');

$form->addText('jmeno', 'Jméno*')
        ->setType('text')
        ->addRule(Form::FILLED, 'Položka jméno je povinná.');

$form->addText('prijmeni', 'Příjmení*')
        ->setType('text')
        ->addRule(Form::FILLED, 'Položka příjmení je povinná.');

$form->addText('email', 'Email*')
        ->setType('text')
        ->addRule(Form::EMAIL, 'Email není zadán správně.');

$form->addText('telefon', 'Telefon*')
        ->setType('text')
        ->addRule(Form::PATTERN, 'Telefon není zadán správně!.', '/^(\+420)? ?[0-9]{3} ?[0-9]{3} ?[0-9]{3}$/');

$form->addCheckbox('agree')
        ->addRule(Form::EQUAL, 'Je potřeba souhlasit s podmínkami', TRUE);

$form->addSubmit('submit', 'Odeslat');

return $form;

Jediné co funguje je validace u jména a příjmením, ale vypíše se mi pouze varování „Vyplňte toto pole!“ a ne „Položka jméno je povinná“.

David Matějka
Moderator | 6445
+
0
-

To se totiz provede HTML5 validace v prohlizeci, jejiz UI a hlasky (asi) nemuzes ovlivnit. muzes ji maximalne uplne vypnout pomoci

$form->getElementPrototype()->novalidate("novalidate")
Oli
Člen | 1215
+
0
-

Jaké instance je Form? Je to Nette\Application\UI\Form? Potom by jsi tam měl mít něco jako

$form->onSuccess[] = array($this, 'metodaKteraZpracujeOdeslani');

Není jasné jestli to tam máš. A setType(‚text‘) je podle mě zbytečné. To je automaticky, nebo ne?

K tvému problému jediné co mě napadá, že by to mohlo způsobovat, že Form není Nette\Application\UI\Form, ale jiná třída…

dufin
Člen | 8
+
0
-

Už vím co se děje, pokud zadám email špatně, tak nevyskakuje žádný upozornění.
Nějáká rada jak by mi to dalo vědět že email je zadán špatně. Jediná možnost je javascript?

Mysteria
Člen | 797
+
0
-

Samozřejmě že to jde i neJavaScriptově, třeba takhle:

$form->onError[] = function(Form $form) {
	foreach ($form->errors as $error) $this->flashMessage($error, 'error');
};
Oli
Člen | 1215
+
0
-

Pokud chces vyuzivat HTML 5 tak místo setType(‚text‘) → setType(‚email‘). Já ale setType nepoužívám a všechny hlášky mě to zobrazuje takový, jaký si nastavím. Takže záleží co je pro tebe lepší…

dufin
Člen | 8
+
0
-

Díky moc

setType(‚email‘) pomohlo ;-), ale nevyřešilo to problém s checkBoxem :D

Takže jsem použil řešení od Mysteria s droubnou úpravou, protože to krachlo s chybou: Using $this when not in object context

Takhle to jede parádně:

$_this = $this;
$form->onError[] = function(Form $form) use ($_this) {
    foreach ($form->errors as $error) {
        $_this->flashMessage($error, 'error');
    }
};

Děkuji moc za rady.

Jan Endel
Člen | 1016
+
0
-

Podtržítka do názvu proměnné nepatří

David Grudl
Nette Core | 8233
+
0
-

Proč by ne? Obzvlášť v tomto případě.