0

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

这可能吗?除了将月/年字段都验证为一定范围内的数字外,我还没有在他们的文档上看到任何特定的日期验证。

编辑:我想在不创建新的验证类(或扩展/实现现有的验证类)的情况下做到这一点,正如我在其他关于 SO 的问题上看到的那样。

4

1 回答 1

2

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

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

<?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,因此评估为假。另一方面,如果用户输入 2014 年 1 月,这将是 201401,大于前一个日期。

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

于 2012-09-25T20:41:09.847 回答