Jak oveřit validitu datumu?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
VaKvas
Začátečník | 111
+
0
-

Jak prosim overim, alespon, ze je datum ve formatu YYYY-MM-DD ?
Klasickou funkci na overeni data jsem nenasel, ale tak me napada pres nejaky regularni vyraz?

$form = new AppForm;
$form->addDatePicker('datumzar', 'Od:')
	->addRule(AppForm::FILLED, 'Zadejte datum Od !');

Prekvapuje me, ze datepicker+ veme i napriklad 17.3.2011, i kdyz ma format nastaveny na YY-MM-DD a ulozi jej dobre …
Nicmene bych rad osetril pro jistotu vstup i jinak.

Moc diky za radu !

kravčo
Člen | 721
+
0
-

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

Šaman
Člen | 2635
+
0
-

Jakub to už vyřešil.

Aha, zase rychlejs píšu než čtu.. takže výše uvedené řešení zkontroluje platnost datumu a jestli chceš mít datum ve vlastním formátu, tak doporučuji vstupní datum zkontrolovat tím regulárem a potom přeformátovat jak potřebuješ.

Editoval Šaman (5. 4. 2011 15:07)

kravčo
Člen | 721
+
0
-

Mne príde kontrola rozdelená na dva kroky jednoduchšia i lepšia pre používateľa:

<?php

$date = $control->getValue();
if (!preg_match('/^\d{1,2}\.\d{1,2}.\d{4}$/', $date)) {
    throw new InvalidDateFormatException('d.m.rrrr');
}

list($day, $month, $year) = explode('.', $date);
if (!checkdate($month, $day, $year)) {
    throw new DateDoesNotExistException;
}
VaKvas
Začátečník | 111
+
0
-

Jeste zkousim neco takoveho :

$form->addDatePicker('datumzar', 'Od:')
		->addRule(AppForm::FILLED, 'Zadejte datum Od !')
		->addRule(AppForm::REGEXP, 'Nesprávný formát data, musí být yyyy-mm-dd .', '/^\d{4}-\d{2}-\d{1,2}$/');

ovsem hlasi to:
Call to undefined static method JanTvrdik\Components\DatePicker::validateregexp()

myslel jsem, ze je to metoda AppForm, ktera tam je, proc me to vola neco z DatePickeru?

Filip Procházka
Moderator | 4668
+
0
-

zkus místo AppForm::REGEXP použít AppForm::PATTERN

VaKvas
Začátečník | 111
+
0
-

Hlasi to take, jen s jinou metodou..

Call to undefined static method JanTvrdik\Components\DatePicker::validatepattern()

Co muzu mit blbě?

Bootstrap :

use Nette\Debug, Nette\Environment, Nette\Application\SimpleRouter,
	Nette\Application\Route, Nette\Forms\FormContainer;

// Datepicker +
FormContainer::extensionMethod('addDatePicker', function (FormContainer $container, $name, $label = NULL) {
    return $container[$name] = new JanTvrdik\Components\DatePicker($label);
});

kdyz kouknu na \JanTvrdik\Components\DatePicker::
tak babizi jen:
validateEqual, validateFilled, validateRange a validateValid …

VaKvas
Začátečník | 111
+
0
-

kravčo napsal(a):

Mne príde kontrola rozdelená na dva kroky jednoduchšia i lepšia pre používateľa:

<?php

$date = $control->getValue();
if (!preg_match('/^\d{1,2}\.\d{1,2}.\d{4}$/', $date)) {
    throw new InvalidDateFormatException('d.m.rrrr');
}

list($day, $month, $year) = explode('.', $date);
if (!checkdate($month, $day, $year)) {
    throw new DateDoesNotExistException;
}

Kdyz ja bych to rad javascriptove, jako je tomu u ostatnich policek. Paradoxne tim DatePickerem se to komplikuje …

kravčo
Člen | 721
+
0
-

VaKvas napsal(a):

Kdyz ja bych to rad javascriptove, jako je tomu u ostatnich policek. Paradoxne tim DatePickerem se to komplikuje …

https://forum.nette.org/…typ-pravidla

Jan Tvrdík
Nette guru | 2595
+
0
-

VaKvas wrote:

Prekvapuje me, ze datepicker+ veme i napriklad 17.3.2011, i kdyz ma format nastaveny na YY-MM-DD a ulozi jej dobre …

Jakou máš verzi toho DatePickeru? V novější se ani formát pomocí PHP nastavit nedá, protože jsem usoudil, že je to blbost. Akceptovat „17.3.2011“ to musí proto, že mohla nastat situace, kdy uživatel nemá zapnutý JS a zadává datum ručně. Nevidím důvod, proč by měl být nucen k zadání data v striktně daném formátu.

Nicmene bych rad osetril pro jistotu vstup i jinak.

Proč? DatePicker zajistí dostatečnou validaci sám o sobě.

$form = new AppForm;
$form->addDatePicker('datumzar', 'Od:')
        ->addRule(AppForm::FILLED, 'Zadejte datum Od !')
	->addRule(AppForm::VALID, 'Neplatné datum!');
VaKvas
Začátečník | 111
+
0
-

Jan Tvrdík napsal(a):

VaKvas wrote:

Prekvapuje me, ze datepicker+ veme i napriklad 17.3.2011, i kdyz ma format nastaveny na YY-MM-DD a ulozi jej dobre …

Jakou máš verzi toho DatePickeru? V novější se ani formát pomocí PHP nastavit nedá, protože jsem usoudil, že je to blbost. Akceptovat „17.3.2011“ to musí proto, že mohla nastat situace, kdy uživatel nemá zapnutý JS a zadává datum ručně. Nevidím důvod, proč by měl být nucen k zadání data v striktně daném formátu.

Nicmene bych rad osetril pro jistotu vstup i jinak.

Proč? DatePicker zajistí dostatečnou validaci sám o sobě.

$form = new AppForm;
$form->addDatePicker('datumzar', 'Od:')
        ->addRule(AppForm::FILLED, 'Zadejte datum Od !')
	->addRule(AppForm::VALID, 'Neplatné datum!');

Díky za odpověď !

Pokud pouziju

->addRule(AppForm::VALID, 'Neplatné datum!');

hodí me to vzdy „stack overflow“ a uloží.
AppForm::VALID , nevím co přesně ověřuje, ale projde to vždy…

Když někdo zadá nějaké nasmyslné číslo „45584568“ tak to "něco uloží .. zřejmě datum nejbližší prvním x znakům.

Proto jsem si říkal, že by to chtelo jeste neco „blbu vzdornější“ – známe uživatele…

Možná co třeba nějak zamknout to textové pole a umožnit jen vkládání přes ten kalendář ?!

Díky

Jan Tvrdík
Nette guru | 2595
+
0
-

Nejprve obecně pár informací:
Normální uživatel zadá datum ručně správně nebo ho vybere z kalendáříku. Zákeřný uživatel ti tam buď zadá nějakou blbost (třeba „Pejsek a Kočička“) nebo zadá syntakticky správné, ale nepravdivé datum. Smyslem validace není zastavit zákeřné uživatele (to ani nejde, protože vždycky můžou lhát), ale pomoci normálním uživatelům, kteří udělali překlep. To by mělo fungovat dobře.

VaKvas wrote:

Pokud pouziju (…) hodí me to vzdy „stack overflow“ a uloží.

Nechápu, jaké „stack overflow“?

AppForm::VALID , nevím co přesně ověřuje, ale projde to vždy…

Nevěřím. Zkus zadat třeba „Pejsek a Kočička“.

Když někdo zadá nějaké nesmyslné číslo „45584568“ tak to „něco“ uloží

Předpokládá to, že uživatel zadal timestamp. Není to chyba, ale vlastnost, i když ji možná odstraním. Opět platí, že to je situace, kterou ti normální uživatel neudělá (čistě teoreticky by si mohl splést políčko s nějakým jiným a omylem tam vyplnit číslo, což bude asi také důvod, proč to v další verzi zruším) a u zákeřného je to jedno.

Proto jsem si říkal, že by to chtelo jeste neco „blbu vzdornější“ – známe uživatele…

Ty je očividně neznáš. Normální uživatel ti tam nic takového nenapíše a od zákeřných uživatelů stejně dostaneš lživou informaci.

Možná co třeba nějak zamknout to textové pole a umožnit jen vkládání přes ten kalendář ?!

Jaký by to mělo smysl? Normální uživatel datum vybere přes kalendář nebo ho zadá ručně ve smysluplném tvaru. Zákeřný uživatel ti pošle HTTP požadavek, jaký bude chtít, a žádná javascriptová blokace ho rozhodně nezastaví.

VaKvas
Začátečník | 111
+
0
-

Pokud pouziju

->addRule(AppForm::VALID , 'Nesprávný formát');

tak to vyhodi okno : viz tento screen (ale jen v IE)

Nic mene, to nevem datum i jako 56–12–8796 (jde me hlavne o kontrolu, aby se nekdo nespletl a pokud bude zadava datum rucne, nedal tam treba 16–22–2011

Jinak je komponenta super !!!! Diky za ni…
Toto jsou jen drobnosti…

Jan Tvrdík
Nette guru | 2595
+
0
-

Díky za informaci. Ten problém je bohužel složitější a závažnější, než jsem si původně myslel. Nette totiž nepočítá s tím, že Form::VALID může být použito i jako pravidlo, ale předpokládá jeho použití pouze v podmínkách (addCondition(Form::VALID)).

Řešením je buď úprava Nette nebo úprava DatePickeru, aby místo Form::VALID používal třeba DatePicker::VALID_DATE.

VaKvas
Začátečník | 111
+
0
-

No zatim spoleham na to, ze uzivatele pouziji jen picker .. ;)