Как создать валидатор datetime в форме Zend Framework? - PullRequest
3 голосов
/ 02 февраля 2010

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

$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, а не заставляет его вводить дату в указанном формате.

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

Ответы [ 3 ]

4 голосов
/ 15 января 2012

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

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

Несмотря ни на что, есть много вменяемых решений этой проблемы. Вероятно, самый простой из которых это:

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

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

4 голосов
/ 02 февраля 2010

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

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

Похоже, что ошибка была помечена как 'Major', так что мы надеемся, что мыскоро исправление.

1 голос
/ 20 февраля 2013

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

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

    return (bool) date_create_from_format('Y-m-d H:i', $value);
});
...