Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony] problemy z sfValidatorDate (S 1.1)
Forum PHP.pl > Forum > PHP > Frameworki
phpion
Witam,
mam drobne problem z rozkminieniem użycia walidatora daty. Otóż mam pole typu text, w którym wpisuję datę. Chciałbym aby:
[*] data była w formacie Y-m-d
[*] nie można było wpisać daty wcześniejszej niż 7 dni od dnia bieżącego
[*] nie można było wpisać daty późniejszej niż 31 dni od dnia bieżącego
Mam takie coś:
  1. <?php
  2. $this->setValidators(array(      
  3.      'send_at'               => new sfValidatorDate(array(
  4.            'date_format' => '/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/',
  5.            'min' => strtotime('+1 week')
  6.        ))
  7.        ));
  8.  
  9.        $this->validatorSchema['send_at']->setMessages(array(
  10.            'required' => 'Podaj datę wysyłki',
  11.            'bad_format'  => 'Data wysyłki powinna mieć format YYYY-MM-DD',
  12.            'min' => 'Minimalny czas wysyłki dla przyjmowanych zleceń to 7 dni od dnia dzisiejszego (minimalny termin to '.date('Y-m-d', strtotime('+1 week')).')',
  13.        ));
  14. ?>

Sprawdzenie wymagalności oraz formatu działa bez zarzutu, natomiast jakiejkolwiek daty bym nie wpisał zawsze otrzymam komunikat o tym, że data jest za wczesna. Jak temu zaradzić? Co robię źle?
I jeszcze przy okazji: jak sprawdzić czy wpisana data faktycznie istnieje? Rozumiem, że przy uruchomieniu 'min' oraz 'max' zostanie to automatycznie sprawdzone ale pytam z czystem ciekawości.

Pozdrawiam,
pion
destroyerr
Przede wszystkim powinieneś raczej mieć strtotime('-1 week'). Powinno działać.

Jeśli chodzi o sprawdzanie daty, to masz na myśli to żeby ktoś nie wybrał 30 lutego? W takim razie to jest sprawdzane automatycznie, bez konieczności ustalania min i max. To wszystko można zobaczyć w kodzie winksmiley.jpg
phpion
Dzięki za odpowiedź. Mam jednak dwie uwagi:
1. Powinno być raczej jak jest, czyli +1 week (chodzi o to aby nie wpisać daty wcześniejszej niż dziś + tydzień, np. mamy 2008-09-22 to najwcześniejsza możliwa data do wpisania to 2008-09-29). Niestety w takiej formie jak przedstawiłem w pierwszym poście kod nie działa (zawsze zwraca złą datę).
2. No właśnie tu też jest problem. Wpisując przykładowo 2008-09-40 (oraz komentując walidację 'min') wpis uważany jest za poprawny. Problem pewnie jest w postaci wprowadzanych danych ale niestety sam nie doszedłem do tego co może być źle :/
destroyerr
Aha.
Cytat
[*] nie można było wpisać daty wcześniejszej niż 7 dni od dnia bieżącego
[*] nie można było wpisać daty późniejszej niż 31 dni od dnia bieżącego

trochę inaczej to zrozumiałem ale ok tongue.gif

Nie napisałeś z jakiego widżetu korzystasz, a to dość ważne. Domyśliłem się dopiero teraz, że z sfWidgetFormInput. Ma to ogromne znaczenie. Twoje wyrażenie regularne jest jeszcze nie doskonałe, bo skąd walidator ma wiedzieć, na której pozycji jest rok, miesiąc lub dzień? Moim zdaniem tak jest poprawnie:
Kod
/^(?<year>[0-9]{4})-(?<month>[0-9]{2})-(?<day>[0-9]{2})$/


Teraz po wpisaniu np. 2008-09-40, będzie rzucał błędem invalid, a wartości dla min i max będą poprawnie sprawdzane.
phpion
Tak, korzystam ze zwykłego inputa. Dzięki za sugestię, jutro sprawdzę czy Twój zabieg pomoże.

// Dziś:
Twoja modyfikacja działa. Działa ale tylko na localu, a na serwerze docelowym wywala cały czas błąd formatu daty :/ Domyślam się, że problemem są te <year> bo po ich usunięciu walidacja na etapie formatu przechodzi pomyślnie.
Na localu mam PHP 5.2.6, a na serwerze jest 5.1.6. Jednak z tego co wyczytałem:
Cytat
And first of all, the next version of symfony, the 1.1, released at the end of the Summer, will require at least PHP 5.1.0.

więc teoretycznie wymagania są spełnione (a korzystam z S 1.1.2). Co w takiej sytuacji?
:|
pion
destroyerr
Tak jest problem z tym, dziwię się, że nie dostałeś żadnego błędu. Sprawdziłem na tej samej wersji php co masz na serwerze i w takiej postaci działa:
Kod
/^(?P<year>[0-9]{4})-(?P<month>[0-9]{2})-(?P<day>[0-9]{2})$/
phpion
W końcu działa! Dzięki serdeczne za pomoc smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.