Forms + podminky

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

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é!');
LM
Člen | 206
+
0
-
$form->addPassword('pass2', 'Znovu:', '20')
	->addRule(Form::EQUAL, 'Hesla se musí shodovat', $form['pass1']);
Roman Pištěk
Člen | 10
+
0
-

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');
phx
Člen | 651
+
0
-

Diky. Napadlo me to podobne, jen s $form['pass1]->value coz nejde.

phx
Člen | 651
+
0
-

Roman Pištěk napsal(a):
Jen drobnost, asi spíše

	->addRule(Form::REGEXP, $msg, '/[a-z0-9]+/i');

Neni ja chci aby heslo melo VELKA a zaroven mala a zaroven cisla. Tomu tvemu by vyhovovalo i ‚a‘ (kdyz pomineme delku).

David Grudl
Nette Core | 8218
+
0
-

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']);
phx
Člen | 651
+
0
-

Mas pravdu, ale to uz je podminka navic. Prtz pass1 musi byt vyplneny.

David Grudl
Nette Core | 8218
+
0
-

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ů.

MartinJanda
Člen | 60
+
0
-

Jak vyjmout třeba tlačítko Cancel z validace formuláře?

phx
Člen | 651
+
0
-

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

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

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

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

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

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

Díky všem za pomoc s tlačítkem Cancel. Davide, naprogramoval jste to opravdu obdivuhodně.

David Grudl
Nette Core | 8218
+
0
-

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í.