 |
11.06.2011, 20:49
|
#1
|
|
|
|
Разведчик
|
 Регистрация: 06.06.2011
 Сообщений: 20
 Популярность: 74
 Сказал(а) спасибо: 65
Поблагодарили 32 раз(а) в 22 сообщениях
|
Валидируем даты
Недавно я узнал, что Zend_Date может использоваться в двух модах iso и php, причём iso используется по умолчанию.
При использовании валидатора Zend_Validate_Date в формах, мне больше нравится использовать php формат, к которому я привык за долгое время разработки web приложений.
Вот код, который создаёт элемент:1 $subForm->addElement('text', 'start_date', array(
2 'filters' => array('StringTrim', 'StripTags'),
3 'required' => true,
4 'label' => 'Start date',
5 'validators' => array(
6 array('Date', true, array('format'=>'j F Y')),
7 ),
8 ));
Кау вы уже заметили, я хочу чтобы дата была в формате "8 November 2010".
Этого добиться довольно таки просто, добавив код в Bootstrap.php:1 function _initDateFormat()
2 {
3 Zend_Date::setOptions(array('format_type' => 'php'));
4 }
Обратите внимание на то, что это статический вызов, так что он распространяется на все инстанции Zend_Date.
Так же я обнаружил, что при использовании формата php многие выражения Zend_Date, такие как Zend_Date::MONTH не работают.
У нас есть несколько дорог, по которым мы можем пойти.
Менять формат отображения там, где это необходимо. Примерно так:01 $currentOptions = Zend_Date::setOptions();
02 $currentFormatType = $currentOptions['format_type'];
03 Zend_Date::setOptions(array('format_type' => 'iso'));
04
05 // Теперь вы можете использовать Zend_Date::MONTH, ZEND_DATE::ISO и т.д.
06
07 // После этого вренуть всё как было
08 Zend_Date::setOptions(array('format_type' => $currentFormatType));
09
10 Так же мы можем перезаписать Zend_Validate_Date:
11 class App_Validate_Date extends Zend_Validate_Date
12 {
13 public function isValid ($value)
14 {
15 $currentOptions = Zend_Date::setOptions();
16 $currentFormatType = $currentOptions['format_type'];
17 Zend_Date::setOptions(array('format_type' => 'php'));
18
19 $valid = parent::isValid($value);
20
21 Zend_Date::setOptions(array('format_type' => $currentFormatType));
22 }
23 }
Так же у меня имеется несколько требований к валидации:
Определение пустого $value;
Формат Y-m-d так же должен проходить валидацию.
view source
print
?01 class App_Validate_Date extends Zend_Validate_Date
02 {
03 public function isValid ($value)
04 {
05 $this->_setValue($value);
06
07 if (empty($value)) {
08 return true;
09 }
10
11 $valid = $this->_testDateAgainstFormat($value, $this->getFormat());
12 if (!$valid) {
13 // проеряем на формат
14 $valid = $this->_testDateAgainstFormat($value, 'Y-m-d');
15 }
16
17 if ($valid) {
18 return true;
19 }
20 $this->_error(self::INVALID_DATE);
21 return false;
22 }
23
24 protected function _testDateAgainstFormat($value, $format)
25 {
26 $ts = strtotime($value);
27 if ($ts !== false) {
28 $testValue = date($format, $ts);
29 if ($testValue == $value) {
30 return true;
31 }
32 }
33 return false;
34 }
35 }
Этот код не будет работать если вы будете иметь дело с локализованными датами! Но вы всегда можете подстроить его под себя!
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 07:21.
|
 |