Kontrola validity data v formulari

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

Dobry den,

jak prosim mohu pres formular nacist datum a zaroven zkontrolovat, zda je datum platne?

Martin Mates
Člen | 179
+
0
-

Kontrolu platnosti uděláš pomocí regulárního výrazu, následovně:

<?php
$form->addText('datumdo', 'datum do:')
->addRule(Form::REGEXP, 'Nesprávný formát data do. Musí být dd.mm.yyyy.', '/^(0[1-9]|[12][0-9]|3[01])[\.](0[1-9]|1[012])[\.](19|20)[0-9]{2}$/')
?>
rezorcinol
Člen | 25
+
0
-

Takhle to ale nebere datum ve formatu 4.5.1992

Martin Mates
Člen | 179
+
0
-

Tak si ten regulární výraz musíš upravit podle svých potřeb. Zkus http://www.regexp.cz/

Ondřej Mirtes
Člen | 1536
+
0
-

Zrovna to teď taky řeším a jelikož jsou pro mě RE nutné zlo a zatím jim ani trochu nerozumím, složil jsem si podle výše uvedené stránky regexp pro datum ve formátu DD.MM.YYYY:

0[1-9]|[12][0-9]|3[01]\.0[1-9]|1[0-2]\.(19|20)[0-9]{2}

Ale Nette hlásí:

Regular expression '0[1-9]|[12][0-9]|3[01]\.0[1-9]|1[0-2]\.(19|20)[0-9]{2}' must be JavaScript compatible.

Co konkrétně není kompatibilní s Javascriptem?

redhead
Člen | 1313
+
0
-

Mě vždycky pomohlo dát před a po RE jednoduchá lomítka. Jinak tahle exceptiona mě vždycky strašně trápila. Nešlo by trochu specifikovat tu nekompatibilitu při vyhazování téhle exceptiony?

Editoval redhead (1. 9. 2009 19:02)

Ondřej Mirtes
Člen | 1536
+
0
-

Tak jsem to zkusil, ale chová se to divně:

$form->addText('date', 'Date')
	->addRule(Form::FILLED, 'You must fill in date!')
	->addRule(Form::REGEXP, 'Date must be in DD.MM.YYYY format', '/0[1-9]|[12][0-9]|3[01]\.0[1-9]|1[0-2]\.(19|20)[0-9]{2}/');

Už to nevyhazuje výjimku, ale bere mi to i data ve tvaru 9.9.09. Ne, že by to vadilo té funkci, která mi to převádí na timestamp, ale trochu se toho bojím.

jasir
Člen | 746
+
0
-

Ono se tam opravdu kontroluje jen jestli začíná na /.
zdroj

redhead
Člen | 1313
+
0
-

jasir napsal(a):

Ono se tam opravdu kontroluje jen jestli začíná na /.
zdroj

pravda, tím spíš pro začátečníky by bylo rozhodně lepší, kdyby to na ně řvalo, zapomněl si lomítko, než nějakou JS nekompatibilitu. Aspoň mě to docela trvalo než jsem na to přišel a taky jsem tím přišel o pár vlasů.

rezorcinol
Člen | 25
+
0
-

LastHunter napsal(a):

Už to nevyhazuje výjimku, ale bere mi to i data ve tvaru 9.9.09. Ne, že by to vadilo té funkci, která mi to převádí na timestamp, ale trochu se toho bojím.

Mohl byste se prosim o tu funkci podelit?

jasir
Člen | 746
+
0
-

redhead napsal(a):

jasir napsal(a):

Ono se tam opravdu kontroluje jen jestli začíná na /.
zdroj

pravda, tím spíš pro začátečníky by bylo rozhodně lepší, kdyby to na ně řvalo, zapomněl si lomítko, než nějakou JS nekompatibilitu. Aspoň mě to docela trvalo než jsem na to přišel a taky jsem tím přišel o pár vlasů.

Jojo, jsem také pro. Také je to kandidát pro vylepšení hlášení vyjímek

redhead
Člen | 1313
+
0
-

jinak, vyzkoušej toto:

0?[1-9]|[12][0-9]|3[01]\. ?0?[1-9]|1[0-2]\. ?20[0-9]{2}

je to z www.regularnivyrazy.info, podporujete i mezeru za tečkou, pokud jí nechceš tak stačí smazat tu mezeru s otazníkem za tím (doufám :) )

Editoval redhead (1. 9. 2009 21:03)

kravčo
Člen | 721
+
0
-

jasir napsal(a):

Ono se tam opravdu kontroluje jen jestli začíná na /.

Áno, pretože knižnica PCRE používaná Nette podporuje celú plejádu delimiterov, no Javascript jedine lomky. Tá kontrola a hláška je tam práve kvôli tomu.


O regulári na dátum som už písal…