Jak oveřit validitu datumu?
- VaKvas
- Začátečník | 111
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 !
- Šaman
- Člen | 2659
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
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
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?
- VaKvas
- Začátečník | 111
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
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
VaKvas napsal(a):
Kdyz ja bych to rad javascriptove, jako je tomu u ostatnich policek. Paradoxne tim DatePickerem se to komplikuje …
- Jan Tvrdík
- Nette guru | 2595
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
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
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
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
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
.