我正在使用ZF 1.11并希望使用Zend_Form
验证非Zend_Filter_Input
。我已经成功设置了我的基本验证,但是我试图在将信用卡发送到处理器之前预先验证信用卡到期日期,大于今天的月/年。
这可能吗?我没有在their docs上看到任何具体的日期验证,只是将月/年字段验证为某个范围内的数字。
编辑:我想在不创建新验证类(或扩展/实现现有验证类)的情况下执行此操作,正如我在其他问题上看到的那样。
答案 0 :(得分:2)
一般情况下,我建议编写一个自定义验证器,因为在我看来,这是在ZF中处理此类案例的最简洁方法。
据我所知,Date验证器只检查日期的正式有效性,但无法比较两个日期。但是,由于只使用内置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,因此评估为假。另一方面,如果用户输入2014年1月,那么201401将大于上一个日期。
请注意,这只是一个未经测试的草图,可能需要更多的考虑和验证。