[ Index ] |
PHP Cross Reference of moodle-2.8 |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * Zend Framework 4 * 5 * LICENSE 6 * 7 * This source file is subject to the new BSD license that is bundled 8 * with this package in the file LICENSE.txt. 9 * It is also available through the world-wide-web at this URL: 10 * http://framework.zend.com/license/new-bsd 11 * If you did not receive a copy of the license and are unable to 12 * obtain it through the world-wide-web, please send an email 13 * to [email protected] so we can send you a copy immediately. 14 * 15 * @category Zend 16 * @package Zend_Validate 17 * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com) 18 * @license http://framework.zend.com/license/new-bsd New BSD License 19 * @version $Id$ 20 */ 21 22 /** 23 * @see Zend_Validate_Abstract 24 */ 25 require_once 'Zend/Validate/Abstract.php'; 26 27 /** 28 * @category Zend 29 * @package Zend_Validate 30 * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com) 31 * @license http://framework.zend.com/license/new-bsd New BSD License 32 */ 33 class Zend_Validate_Date extends Zend_Validate_Abstract 34 { 35 const INVALID = 'dateInvalid'; 36 const INVALID_DATE = 'dateInvalidDate'; 37 const FALSEFORMAT = 'dateFalseFormat'; 38 39 /** 40 * Validation failure message template definitions 41 * 42 * @var array 43 */ 44 protected $_messageTemplates = array( 45 self::INVALID => "Invalid type given, value should be string, integer, array or Zend_Date", 46 self::INVALID_DATE => "'%value%' does not appear to be a valid date", 47 self::FALSEFORMAT => "'%value%' does not fit the date format '%format%'", 48 ); 49 50 /** 51 * @var array 52 */ 53 protected $_messageVariables = array( 54 'format' => '_format' 55 ); 56 57 /** 58 * Optional format 59 * 60 * @var string|null 61 */ 62 protected $_format; 63 64 /** 65 * Optional locale 66 * 67 * @var string|Zend_Locale|null 68 */ 69 protected $_locale; 70 71 /** 72 * Sets validator options 73 * 74 * @param string|Zend_Config $options OPTIONAL 75 * @return void 76 */ 77 public function __construct($options = array()) 78 { 79 if ($options instanceof Zend_Config) { 80 $options = $options->toArray(); 81 } else if (!is_array($options)) { 82 $options = func_get_args(); 83 $temp['format'] = array_shift($options); 84 if (!empty($options)) { 85 $temp['locale'] = array_shift($options); 86 } 87 88 $options = $temp; 89 } 90 91 if (array_key_exists('format', $options)) { 92 $this->setFormat($options['format']); 93 } 94 95 if (!array_key_exists('locale', $options)) { 96 require_once 'Zend/Registry.php'; 97 if (Zend_Registry::isRegistered('Zend_Locale')) { 98 $options['locale'] = Zend_Registry::get('Zend_Locale'); 99 } 100 } 101 102 if (array_key_exists('locale', $options)) { 103 $this->setLocale($options['locale']); 104 } 105 } 106 107 /** 108 * Returns the locale option 109 * 110 * @return string|Zend_Locale|null 111 */ 112 public function getLocale() 113 { 114 return $this->_locale; 115 } 116 117 /** 118 * Sets the locale option 119 * 120 * @param string|Zend_Locale $locale 121 * @return Zend_Validate_Date provides a fluent interface 122 */ 123 public function setLocale($locale = null) 124 { 125 require_once 'Zend/Locale.php'; 126 $this->_locale = Zend_Locale::findLocale($locale); 127 return $this; 128 } 129 130 /** 131 * Returns the locale option 132 * 133 * @return string|null 134 */ 135 public function getFormat() 136 { 137 return $this->_format; 138 } 139 140 /** 141 * Sets the format option 142 * 143 * @param string $format 144 * @return Zend_Validate_Date provides a fluent interface 145 */ 146 public function setFormat($format = null) 147 { 148 $this->_format = $format; 149 return $this; 150 } 151 152 /** 153 * Defined by Zend_Validate_Interface 154 * 155 * Returns true if $value is a valid date of the format YYYY-MM-DD 156 * If optional $format or $locale is set the date format is checked 157 * according to Zend_Date, see Zend_Date::isDate() 158 * 159 * @param string|array|Zend_Date $value 160 * @return boolean 161 */ 162 public function isValid($value) 163 { 164 if (!is_string($value) && !is_int($value) && !is_float($value) && 165 !is_array($value) && !($value instanceof Zend_Date)) { 166 $this->_error(self::INVALID); 167 return false; 168 } 169 170 $this->_setValue($value); 171 172 if (($this->_format !== null) || ($this->_locale !== null) || is_array($value) || 173 $value instanceof Zend_Date) { 174 require_once 'Zend/Date.php'; 175 if (!Zend_Date::isDate($value, $this->_format, $this->_locale)) { 176 if ($this->_checkFormat($value) === false) { 177 $this->_error(self::FALSEFORMAT); 178 } else { 179 $this->_error(self::INVALID_DATE); 180 } 181 return false; 182 } 183 } else { 184 if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $value)) { 185 $this->_format = 'yyyy-MM-dd'; 186 $this->_error(self::FALSEFORMAT); 187 $this->_format = null; 188 return false; 189 } 190 191 list($year, $month, $day) = sscanf($value, '%d-%d-%d'); 192 193 if (!checkdate($month, $day, $year)) { 194 $this->_error(self::INVALID_DATE); 195 return false; 196 } 197 } 198 199 return true; 200 } 201 202 /** 203 * Check if the given date fits the given format 204 * 205 * @param string $value Date to check 206 * @return boolean False when date does not fit the format 207 */ 208 private function _checkFormat($value) 209 { 210 try { 211 require_once 'Zend/Locale/Format.php'; 212 $parsed = Zend_Locale_Format::getDate($value, array( 213 'date_format' => $this->_format, 'format_type' => 'iso', 214 'fix_date' => false)); 215 if (isset($parsed['year']) and ((strpos(strtoupper($this->_format), 'YY') !== false) and 216 (strpos(strtoupper($this->_format), 'YYYY') === false))) { 217 $parsed['year'] = Zend_Date::getFullYear($parsed['year']); 218 } 219 } catch (Exception $e) { 220 // Date can not be parsed 221 return false; 222 } 223 224 if (((strpos($this->_format, 'Y') !== false) or (strpos($this->_format, 'y') !== false)) and 225 (!isset($parsed['year']))) { 226 // Year expected but not found 227 return false; 228 } 229 230 if ((strpos($this->_format, 'M') !== false) and (!isset($parsed['month']))) { 231 // Month expected but not found 232 return false; 233 } 234 235 if ((strpos($this->_format, 'd') !== false) and (!isset($parsed['day']))) { 236 // Day expected but not found 237 return false; 238 } 239 240 if (((strpos($this->_format, 'H') !== false) or (strpos($this->_format, 'h') !== false)) and 241 (!isset($parsed['hour']))) { 242 // Hour expected but not found 243 return false; 244 } 245 246 if ((strpos($this->_format, 'm') !== false) and (!isset($parsed['minute']))) { 247 // Minute expected but not found 248 return false; 249 } 250 251 if ((strpos($this->_format, 's') !== false) and (!isset($parsed['second']))) { 252 // Second expected but not found 253 return false; 254 } 255 256 // Date fits the format 257 return true; 258 } 259 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Nov 28 20:29:05 2014 | Cross-referenced by PHPXref 0.7.1 |