【问题标题】:Using Zend_Filter_Input to validate date使用 Zend_Filter_Input 验证日期
【发布时间】:2012-09-25 11:46:51
【问题描述】:

我正在使用 ZF 1.11 并想用Zend_Filter_Input 验证非Zend_Form。我已成功设置基本验证,但我正尝试在将信用卡到期日期发送到处理方之前预先验证信用卡到期日期,使其大于今天的月份/年份。

这可能吗?我没有在their docs 上看到任何具体的日期验证,除了将月份/年份字段都验证为特定范围内的数字。

编辑:我想在不创建新验证类(或扩展/实现现有验证类)的情况下执行此操作,正如我在 SO 上的其他问题上看到的那样。

【问题讨论】:

  • @DiegoPaladino 是的,我看到了这个问题,并相应地编辑了我的问题,因为我想知道 Zend 是否有这样的内置函数。

标签: php validation zend-framework zend-validate


【解决方案1】:

一般来说,我建议编写自定义验证器,因为我认为这是在 ZF 中处理此类情况的最简洁的方法。

据我所知,日期验证器仅检查日期的正式有效性,但无法比较两个日期。然而,考虑到只能使用内置 Zend Framework 验证器的限制,我想出了一个使用 GreaterThan 验证器的有点 hacky 的解决方案:

<?php
$year = 2012;
$month = 1;
$inputDatePast = intval(sprintf('%4d%02d', $year, $month)); //201201

$year = 2016;  // if you read this after september 2016: add a few more years here ;)
$month = 9;
$inputDateFuture = intval(sprintf('%4d%02d', $year, $month)); //201609

$prevMonth = intval(date('Ym', mktime(12, 0, 0, date('n')-1, 1, date('Y'))));

$validator = new Zend_Validate_GreaterThan($prevMonth);
$validator->isValid($inputDatePast); // false
$validator->isValid($inputDateFuture); // true
?>

所以想法是从上个月的年份和月份中创建一个整数,并比较给定的年份和月份是否大于该值。这个整数由四位数字表示年份和两位数字(前导零很重要)表示月份。

例如,2012 年 9 月是 201209。如果用户输入 2011 年 10 月,这将是 201109,它小于 201209,因此计算结果为 false。另一方面,如果用户输入 2014 年 1 月,这将是 201401,大于上一个日期。

请注意,这只是一个未经测试的草图,可能需要更多的考虑和验证。

【讨论】:

  • 我明白了。编写自定义验证器似乎更容易,所以我想我必须这样做。不过谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 2017-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
相关资源
最近更新 更多