Forms + podminky
- phx
- Člen | 651
Zdravim…
Ted kapku tapu jak udelat ve Forms podminku pro hesla. Vytvarim ucet a chci aby uzivatel zadal heslo a pro jistotu jeste jednou. Ale tapu jak napsat podminku aby se pass1 = pass2.
$msg = 'Heslo musí obsahovat VELKÁ a malá písmena a číslice!';
$form->addPassword('pass1', 'Heslo:', '20')
->addRule(Form::FILLED, 'Heslo je povinné!')
->addRule(Form::MIN_LENGTH, 'Heslo musí být minimálně %d znaků', 12)
->addRule(Form::REGEXP, $msg, '/[A-Z]+/')
->addRule(Form::REGEXP, $msg, '/[a-z]+/')
->addRule(Form::REGEXP, $msg, '/[0-9]+/');
$form->addPassword('pass2', 'Znovu:', '20')
->addRule(Form::FILLED, 'Druhé heslo je povinné!');
- Roman Pištěk
- Člen | 10
phx napsal(a):
->addRule(Form::REGEXP, $msg, '/[A-Z]+/') ->addRule(Form::REGEXP, $msg, '/[a-z]+/') ->addRule(Form::REGEXP, $msg, '/[0-9]+/');
Jen drobnost, asi spíše
->addRule(Form::REGEXP, $msg, '/[a-z0-9]+/i');
- David Grudl
- Nette Core | 8218
Podmínku lze zapsat také jako: pokud je 'pass1'
vyplněné,
pak se 'pass2'
musí shodovat s 'pass1'
$form->addPassword('pass2', 'Znovu:', '20')
->addConditionOn($form['pass1'], Form::FILLED)
->addRule(Form::EQUAL, 'Hesla se musí shodovat', $form['pass1']);
- David Grudl
- Nette Core | 8218
Od rev. 63 je k dispozici ještě šikovnější podmínka Form::VALID
$form->addPassword('pass2', 'Znovu:', '20')
->addConditionOn($form['pass1'], Form::VALID)
->addRule(Form::EQUAL, 'Hesla se musí shodovat', $form['pass1']);
Pravidlo zadané metodou addRule() se vykoná pouze v případě, že
pass1
je validní. Tedy nejen vyplněné, ale splňující
i podmínky minimální délky a regulárních výrazů.
- phx
- Člen | 651
MartinJanda napsal(a):
Jak vyjmout třeba tlačítko Cancel z validace formuláře?
HTML ma tlacitko reset, ale to te nikam nepresmeruje. Mozna by stacil normalni odkaz. Jine reseni me nenapada. Nebo se pohrabat ve strevech Forms.
Davide jedna takova drobnost. Validace pomoci Form::LENGTH si vynucuje 2 parametry (od, do). Osobne jsem to napoprve chapal jako presna delka. Bylo by mozne upravit to tak, ze kdyz zadas jen jedno cislo je to presna delka? Zatim tam musi byt 2 stejna cisla za sebou:(
- David Grudl
- Nette Core | 8218
MartinJanda napsal(a):
Jak vyjmout třeba tlačítko Cancel z validace formuláře?
Vůbec nechápu, co je tím myšleno? Přece prvky, kterým nedám validační pravidla, se nevalidují.
phx napsal(a):
Davide jedna takova drobnost. Validace pomoci Form::LENGTH si vynucuje 2 parametry (od, do). Osobne jsem to napoprve chapal jako presna delka. Bylo by mozne upravit to tak, ze kdyz zadas jen jedno cislo je to presna delka? Zatim tam musi byt 2 stejna cisla za sebou:(
Ok, opravím.
- ViliamKopecky
- Nette hipster | 230
David Grudl napsal(a):
MartinJanda napsal(a):
Jak vyjmout třeba tlačítko Cancel z validace formuláře?
Vůbec nechápu, co je tím myšleno? Přece prvky, kterým nedám validační pravidla, se nevalidují.
Myslim že tím bylo myšleno, že má určitý validační pravidla (třeba aby všechny položky byly vyplněné), jenže když zmáčkne Cancel, tak aby se to nevalidovalo a například javascript by ho nepustil dál…
- David Grudl
- Nette Core | 8218
No můžeš každé validační pravidlo podmínit tím, jestli byl formulář odeslán určitým tlačítkem:
$form->addText('item', 'Name:')
->addConditionOn($form['submit1'], Form::SUBMITTED)
->addRule(....)
->addRule(....)
...
nebo naopak neodeslán
$form->addText('item', 'Name:')
->addConditionOn($form['cancel'], ~Form::SUBMITTED)
->addRule(....)
->addRule(....)
...
Případně celou validační větev zavěsit na vhodné tlačítko:
$form->addSubmit('submit1', 'Odeslat')
->addCondition(Form::SUBMITTED) // if submitted, then
->addRuleFor($form['item1'], ....)
->addRuleFor($form['item2'], ....)
...
Tohle jsou možná řešení založená na systému podmínek a pravidel. Ten je samozřejmě možné prostě a jednoduše obejít:
if ($form->submitted) {
if ($form['cancel']->isSubmittedBy()) {
... // stlačeno cancel, nevalidujem
} elseif ($form->isValid()) {
... // stlačeno něco jiného, tož to zvalidujem, ne?
}
}
- ViliamKopecky
- Nette hipster | 230
David Grudl napsal(a):
if ($form->submitted) { if ($form['cancel']->isSubmittedBy()) { ... // stlačeno cancel, nevalidujem } elseif ($form->isValid()) { ... // stlačeno něco jiného, tož to zvalidujem, ne? } }
Tohle ale nebude mít podporu pro javascript, myslím.
- David Grudl
- Nette Core | 8218
enoice napsal(a):
Tohle ale nebude mít podporu pro javascript, myslím.
Ano, na straně JavaScriptu by bylo potřeba udělat
$form->addSubmit('submit1', 'Odeslat')
->addCondition(~Form::SUBMITTED) // if not submitted, then
->addScript('return true;');
Viz addScript, ale tohle není čisté řešení, souhlasím. Alespoň je stále jak Nette\Forms vylepšovat ;)
- MartinJanda
- Člen | 60
Díky všem za pomoc s tlačítkem Cancel. Davide, naprogramoval jste to opravdu obdivuhodně.
- David Grudl
- Nette Core | 8218
Tak nově je možné u každého tlačítka nastavit, jestli vyžaduje validaci:
$form->addSubmit('cancel', 'Cancel')
->setValidationScope(FALSE); // nebude se nic validovat
Funkce se jmenuje tak proto, že plánuju ji rozšířit o možnost předat pole nebo skupinu (to nechávám k diskusi) prvků, na které se validace při stisku tlačítka omezí.