Validace tří selectů (datum narození) → jedna hláška

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

Ahoj,

je možné nějak nastavit validaci tak, aby mi to při nevybrání hodnoty z jednoho ze tří selectů (den, měsíc a rok) vypsalo, že musím zvolit kompletní datum narození?

Zároveň mám v select boxech jako první hodnotu ' – ' nebo něco, tzn, že bych chtěl použít skipFirst()

Příklad:

budí mít vybráno v pořadí den, měsíc a rok:

  1. – – – … chybová hláška → ‚Vyplňte datum‘
  2. 12 – – … chybová hláška → ‚Vyplňte datum‘
  3. 12 05 – … chybová hláška → ‚Vyplňte datum‘

Jde to? Díky za každou pomoc.

Jur4
Člen | 51
+
0
-

Tak to je validace na každém selectu zvlášť, jen ze stejnou hláškou. Takže nějak takhle?

$message = 'Vyplňte kompletní datum narození.';

$form->addSelect('day', 'Den', $days)
	->addRule(Form::FILLED, $message)
	->skipFirst(' - ');

$form->addSelect('month', 'Měsíc', $months)
	->addRule(Form::FILLED, $message)
	->skipFirst(' - ');

$form->addSelect('year', 'Rok', $years)
	->addRule(Form::FILLED, $message)
	->skipFirst(' - ');
joe
Člen | 313
+
0
-

Jur4:

:-) Tak to je přesně to, co nechci, v tomhle případě, pokud nevyberu nic ani z jednoho selectu, dostanu 3× chybovou hlášku v $message.

A já ji chci vypsat jen jednou.

Jur4
Člen | 51
+
0
-

Jo to mě nedocvaklo. A co tohle?

$message = 'Vyplňte kompletní datum narození.';

$form->addSelect('day', 'Den', $days)
	->skipFirst(' - ')
	->addRule(Form::FILLED, $message);

$form->addSelect('month', 'Měsíc', $months)
	->skipFirst(' - ')
	->addConditionOn($form['day'], Form::FILLED)
	->addRule(Form::FILLED, $message);

$form->addSelect('year', 'Rok', $years)
	->skipFirst(' - ')
	->addConditionOn($form['month'], Form::FILLED)
	->addRule(Form::FILLED, $message);

Takhle by ty selecty měly být povinné „postupně“. Nejprve se bude validovat den. Jakmile bude vyplněný den pak bude povinný měsíc a až vyplníš měsíc tak pak bude povinný rok.

edit: ale neřeší to variantu, že někdo vybere nejdříve rok, ale ne den (nejsem si jistý, jestli to takhle půjde vůbec udělat)

Editoval Jur4 (12. 5. 2011 22:17)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Tuším, že bude třeba využít podmínky (doufám, že to funguje, netestoval jsem to, ale nějak takto přes podmínky to určitě půjde):

Edit: Jur4 mě předběhnul :) A podle mě nevadí, že to neřeší variantu, kdy uživatel nejprve vyplní rok – to je v pořádku, formulář mu ohlásí, že chybí vyplněný den.

Nebylo by ale celkově lepší místo tohoto použít třeba DatePicker od Honzy Tvrdíka?

Editoval vojtech.dobes (12. 5. 2011 22:26)

joe
Člen | 313
+
0
-

@**Jur4**:

Něco takového, ale ještě to má mouchy. Pokud vyberu pouze den a odešlu, dostanu jednu hlášku. Pokud vyberu pouze rok, dostanu zase jednu hlášku. Pokud ale vyberu jenom měsíc, dostanu hlášky dvě – jednu definovanou u dne a druhou u roka.
Nějak to nemůžu logicky odstranit tak, aby to fungovalo pro všechny způsoby zadání a vždy jsem dostal jenom jednu.

@**vojtech.dobes**:

O podobných komponentách vím a nepoužívám je. Nic proti nim, ale přijdou mi úplně zbytečné. A na takovou věc nepotřebuji do stránky nasazovat jQuery a jQueryUI. Raději mám výběr data přes tři selecty, kde uživatel nemusí zbytečně listovat kalendářem, co při neopatrném kliku vedle zmizí.

Jur4
Člen | 51
+
0
-

Teď si nejsem úplně jistý jestli se dají podmínky řetězit, ale pokud ano, tak by to mělo jít asi takhle.

$form->addSelect('year', 'Rok', $years)
        ->skipFirst(' - ')
        ->addConditionOn($form['day'], Form::FILLED)
	->addConditionOn($form['month'], Form::FILLED)
        ->addRule(Form::FILLED, $message);

Editoval Jur4 (13. 5. 2011 0:09)

joe
Člen | 313
+
0
-

@**Jur4** Sakra, tak to zas musí vypadat, že jsem úplný nemehlo :-), takhle to funguje. Díky moc, z nějakého důvodu jsem to zkoušel přes negaci ~ a v nějakém případě to nešlo. Fakt díky, jak jednoduché.

bojovyletoun
Člen | 667
+
0
-

Ahoj, co kdybych si chtěl přidat nějakou speciální validaci? Jako například víc selectboxů, z nichž třeba:

  • např ze 6 selectboxů aby byly 2 dvojice stejné values a zbylé 2 boxy jiné values . A podobné scifi podmínky.

Jak byste to řešili? Mě napadlo využít připojit validační proceduru do eventu onValidate[] a tam v případě chyby zavolat addError.