谁帮我为Zend Framework创建了一个自定义验证器,它可以检查日期是否在一个范围内?
例:
dateGT = 2011-09-05 dateLT = 2011-07-05
如果表单字段设置为:
dateFieldForm = 2011-08-15
我希望验证器返回true!
如果表单字段设置为:
dateFieldForm = 2011-10-15
我希望验证器返回false!
对不起,未来有大量代码:
<?PHP /** @see Zend_Validate_Abstract */ require_once 'Zend/Validate/Abstract.PHP'; /** * @category Zend * @package Zend_Validate * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class My_Validate_DateCompare extends Zend_Validate_Abstract { /** * Error codes * @const string */ const NOT_SAME = 'notSame'; const MISSING_TOKEN = 'missingToken'; const NOT_LATER = 'notLater'; const NOT_EARLIER = 'notEarlier'; const NOT_BETWEEN = 'notBetween'; /** * Error messages * @var array */ protected $_messageTemplates = array( self::NOT_SAME => "The date '%value%' does not match the required",self::NOT_BETWEEN => "The date is not in the valid range",self::NOT_LATER => "The date '%value%' is not later than the required",self::NOT_EARLIER => "The date '%value%' is not earlier than required",self::MISSING_TOKEN => 'No date was provided to match against',); /** * @var array */ protected $_messageVariables = array( 'token' => '_tokenString' ); /** * Original token against which to validate * @var string */ protected $_tokenString; protected $_token; protected $_compare; /** * Sets validator options * * @param mixed $token * @param mixed $compare * @return void */ public function __construct($token = null,$compare = null) { if (null !== $token) { $this->setToken($token); $this->setCompare($compare); } } /** * Set token against which to compare * * @param mixed $token * @return Zend_Validate_Identical */ public function setToken($token) { $this->_tokenString = (string) $token; $this->_token = $token; return $this; } /** * Retrieve token * * @return string */ public function getToken() { return $this->_token; } /** * Set compare against which to compare * * @param mixed $compare * @return Zend_Validate_Identical */ public function setCompare($compare) { $this->_compareString = (string) $compare; $this->_compare = $compare; return $this; } /** * Retrieve compare * * @return string */ public function getCompare() { return $this->_compare; } /** * Defined by Zend_Validate_Interface * * Returns true if and only if a token has been set and the provided value * matches that token. * * @param mixed $value * @return boolean */ public function isValid($value) { $this->_setValue((string) $value); $token = $this->getToken(); if ($token === null) { $this->_error(self::MISSING_TOKEN); return false; } $date1 = new Zend_Date($value); $date2 = new Zend_Date($token); // Not Later if ($this->getCompare() === true){ if ($date1->compare($date2) < 0 || $date1->equals($date2)) { $this->_error(self::NOT_LATER); return false; } // Not Earlier } elseif ($this->getCompare() === false) { if ($date1->compare($date2) > 0 || $date1->equals($date2)) { $this->_error(self::NOT_EARLIER); return false; } // Exact Match } elseif ($this->getCompare() === null) { if (!$date1->equals($date2)) { $this->_error(self::NOT_SAME); return false; } // In Range } else { $date3 = new Zend_Date($this->getCompare()); if ($date1->compare($date2) < 0 || $date1->compare($date3) > 0) { $this->_error(self::NOT_BETWEEN); return false; } } // Date is valid return true; } }
用法:
$element->addValidator(new My_Validate_DateCompare('startdate')); //exact match $element->addValidator(new My_Validate_DateCompare('startdate',null)); //exact match $element->addValidator(new My_Validate_DateCompare('startdate','enddate')); //between dates $element->addValidator(new My_Validate_DateCompare('startdate',true)); //not later $element->addValidator(new My_Validate_DateCompare('startdate',false)); //not earlier
使用全局设置的日期格式(存储在Zend_Registry(‘Locale’)中).
最新更新:修复了错误的默认可选参数,该参数应为NULL而不是True.更改消息以减少混淆.一些格式和空格.