Регистрация Главная Сообщество
Сообщения за день Справка Регистрация
Старый 11.06.2011, 20:49   #1
Заблокирован
 Разведчик
Аватар для Я убью:Frost:DD
 
Я убью:Frost:DD на правильном пути
Регистрация: 06.06.2011
Сообщений: 20
Популярность: 74
Сказал(а) спасибо: 65
Поблагодарили 32 раз(а) в 22 сообщениях
 
Lightbulb Валидируем даты

Недавно я узнал, что 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 }


Этот код не будет работать если вы будете иметь дело с локализованными датами! Но вы всегда можете подстроить его под себя!
  Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Файл] Для брута. Даты рождения 75-07 гг. EICGoliath Общение и обсуждение 20 27.05.2011 11:40
даты для брута с 70 по 99год. leoleo Общение и обсуждение Perfect World 2 24.04.2010 22:50
Мануал по редактированию даты осады. Silence Lineage 2 0 21.06.2009 15:01

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 18:29.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net