2010-02-02 3 views
3

По умолчанию используется Zend Framework Дата проверки использует формат даты yyyy-MM-dd:Как создать валидатор даты и времени в форме Zend Framework?

$dateValidator = new Zend_Validate_Date(); 

Но я хочу, чтобы добавить час и минуты проверки. Другими словами, я хочу, чтобы пользователь вводил час и минуту. Но следующий не работает:

$dateValidator = new Zend_Validate_Date('yyyy-MM-dd hh:ii'); 

Если я вхожу 2010-02-01, я получаю сообщение об ошибке сказав, что дата не соответствует формату. Если я вхожу 2010-02-01 3, он не жалуется. Что это делает, предполагается, что пользователь означает 2010-02-01 03:00, а не принуждает пользователя вводить дату в данном формате.

Как я могу гарантировать, что дата должна быть введена в данном формате?

ответ

4

Пожалуйста, см: http://framework.zend.com/issues/browse/ZF-6369

В основном то, что она сводится к тому, что код, лежащий в основе проверки формата не работает правильно. Вместо того, чтобы использовать строгую проверку, он попытается принудить предоставленную дату к чему-то, что будет проверяться, и поэтому вы получите hanky-результаты.

Это похоже на ошибку, отмеченную как «майор», поэтому, надеюсь, скоро увидим исправление.

+0

Это невероятно. Такая большая ошибка ... – smentek

4

Чтобы добавить к ответу Ноя, Zend_Validate_Date действительно ужасно и негибко; то есть, если вы хотите иметь более прощающую политику для ввода даты.

Теперь, если ZF поставляется с Zend_Filter_Date, который нормализует различные тривиальные (хотя и очень разборчивые) форматы выбора даты/пользовательских входных данных, это может быть другая история, поскольку вы можете отфильтровать дату в нормализованном формате, а затем подтвердить это то, что он в этом формате. Но это не так.

Несмотря на это, существует множество разумных решений этой проблемы. Вероятно, самый простой из которых заключается в следующем:

$validator = new \Zend_Validate_Callback(function($value) { 
    return (bool)strtotime($value); 
}); 

Лично мне все равно идет ли дата/даты и времени в качестве/гггг/MM, Сент 23, 2012, или как «-2 недели» - все, что мне действительно волнует, - это то, является ли strtotime достаточно умным для его анализа.

1

+1 к ответу Стивена. я пошел на подобное решение, так как я уже знал, что формат я должен был подтвердить:

$validator = new \Zend_Validate_Callback(function($value) { 

    return (bool) date_create_from_format('Y-m-d H:i', $value); 
}); 
Смежные вопросы