This repository has been archived by the owner on Jan 30, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 49
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'feature/3969' into develop
- Loading branch information
127 parents
87fbb11
+
ee0f255
+
b0a3dd4
+
0dca0ef
+
910bbbf
+
e574b9b
+
f30ec7d
+
1fa84de
+
41b8543
+
9e2c9d5
+
913f51c
+
39924f3
+
c2a11e1
+
61b9322
+
413a38b
+
e51b2b8
+
20e328b
+
6437ec0
+
e9b8476
+
95e54a0
+
7ea3aed
+
df6a706
+
a82fc82
+
7c2a059
+
4fefb53
+
599ee3a
+
ea3fc65
+
f6c04c2
+
6591e3d
+
a4f76e3
+
33c7531
+
2d59782
+
8152327
+
e56ce9b
+
db9b18f
+
b88635a
+
a262823
+
b79aef6
+
c2284e4
+
70193eb
+
96acf77
+
9675426
+
5f02411
+
0dafea7
+
15dc674
+
4a2447d
+
e6eb7f3
+
e9499c5
+
272b15f
+
11c7758
+
6f0e918
+
5f4980a
+
ecca95a
+
88b5971
+
ecb8d13
+
9de1c08
+
44aad17
+
13269e9
+
654cdb6
+
dc708db
+
380ffba
+
ff67e7f
+
fe2e025
+
95f0efa
+
68cc4b3
+
bf13b96
+
8870381
+
56480f4
+
1fa90d7
+
5c7fe1f
+
abe9bc1
+
a33cacd
+
cdd7d9f
+
6a261b1
+
5e594c4
+
01c1241
+
30d1dd2
+
d4af079
+
c9aa9b4
+
10f47ca
+
ef20fa1
+
2187ae2
+
e7f3993
+
db93d37
+
aa57612
+
4af81d8
+
2f90998
+
3013404
+
69d83fe
+
f383ca9
+
1b26f48
+
054f09d
+
0c86829
+
f22d81a
+
e7ebffe
+
72a7a54
+
cc09223
+
ab99f58
+
2c69e37
+
b6ccfbc
+
b92a5da
+
773a133
+
9ee28ff
+
5865e20
+
63c7303
+
73371d0
+
b96f402
+
b36e36b
+
60fa081
+
a1d27a6
+
43e9240
+
9e59ae6
+
be1ce44
+
5a6465d
+
7e455b4
+
83d837e
+
28bc01e
+
215be48
+
efcc8e0
+
5192ae6
+
7e1ba0f
+
dec8ccf
+
71d113e
+
94afc0f
+
8c3ea5f
+
480ab1c
+
d152095
commit 1f59300
Showing
2 changed files
with
448 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,296 @@ | ||
<?php | ||
/** | ||
* Zend Framework (http://framework.zend.com/) | ||
* | ||
* @link http://github.com/zendframework/zf2 for the canonical source repository | ||
* @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com) | ||
* @license http://framework.zend.com/license/new-bsd New BSD License | ||
*/ | ||
|
||
namespace Zend\I18n\Validator; | ||
|
||
use Locale; | ||
use IntlDateFormatter; | ||
use Traversable; | ||
use Zend\Validator\AbstractValidator; | ||
use Zend\Validator\Exception; | ||
|
||
class DateTime extends AbstractValidator | ||
{ | ||
const INVALID = 'datetimeInvalid'; | ||
const INVALID_DATETIME = 'datetimeInvalidDateTime'; | ||
|
||
/** | ||
* @var array | ||
*/ | ||
protected $messageTemplates = array( | ||
self::INVALID => "Invalid type given. String expected", | ||
self::INVALID_DATETIME => "The input does not appear to be a valid datetime", | ||
); | ||
|
||
/** | ||
* Optional locale | ||
* | ||
* @var string|null | ||
*/ | ||
protected $locale; | ||
|
||
/** | ||
* @var int | ||
*/ | ||
protected $dateType = IntlDateFormatter::NONE; | ||
|
||
/** | ||
* @var int | ||
*/ | ||
protected $timeType = IntlDateFormatter::NONE; | ||
|
||
/** | ||
* Optional timezone | ||
* | ||
* @var string | ||
*/ | ||
protected $timezone; | ||
|
||
/** | ||
* @var string | ||
*/ | ||
protected $pattern; | ||
|
||
/** | ||
* @var int | ||
*/ | ||
protected $calendar = IntlDateFormatter::GREGORIAN; | ||
|
||
/** | ||
* @var IntlDateFormatter | ||
*/ | ||
protected $formatter; | ||
|
||
/** | ||
* Is the formatter invalidated | ||
* | ||
* Invalidation occurs when immutable properties are changed | ||
* | ||
* @var bool | ||
*/ | ||
protected $invalidateFormatter = false; | ||
|
||
/** | ||
* Constructor for the Date validator | ||
* | ||
* @param array|Traversable $options | ||
*/ | ||
public function __construct($options = array()) | ||
{ | ||
parent::__construct($options); | ||
|
||
if (null === $this->locale) { | ||
$this->locale = Locale::getDefault(); | ||
} | ||
if (null === $this->timezone) { | ||
$this->timezone = date_default_timezone_get(); | ||
} | ||
} | ||
|
||
/** | ||
* Sets the calendar to be used by the IntlDateFormatter | ||
* | ||
* @param integer|null $calendar | ||
* @return DateTime provides fluent interface | ||
*/ | ||
public function setCalendar($calendar) | ||
{ | ||
$this->calendar = $calendar; | ||
|
||
return $this; | ||
} | ||
|
||
/** | ||
* Returns the calendar to by the IntlDateFormatter | ||
* | ||
* @return int | ||
*/ | ||
public function getCalendar() | ||
{ | ||
return ($this->formatter && !$this->invalidateFormatter) ? $this->getIntlDateFormatter()->getCalendar() : $this->calendar; | ||
} | ||
|
||
/** | ||
* Sets the date format to be used by the IntlDateFormatter | ||
* | ||
* @param integer|null $dateType | ||
* @return DateTime provides fluent interface | ||
*/ | ||
public function setDateType($dateType) | ||
{ | ||
$this->dateType = $dateType; | ||
$this->invalidateFormatter = true; | ||
|
||
return $this; | ||
} | ||
|
||
/** | ||
* Returns the date format used by the IntlDateFormatter | ||
* | ||
* @return int | ||
*/ | ||
public function getDateType() | ||
{ | ||
return $this->dateType; | ||
} | ||
|
||
/** | ||
* Sets the pattern to be used by the IntlDateFormatter | ||
* | ||
* @param string|null $pattern | ||
* @return DateTime provides fluent interface | ||
*/ | ||
public function setPattern($pattern) | ||
{ | ||
$this->pattern = $pattern; | ||
|
||
return $this; | ||
} | ||
|
||
/** | ||
* Returns the pattern used by the IntlDateFormatter | ||
* | ||
* @return string | ||
*/ | ||
public function getPattern() | ||
{ | ||
return ($this->formatter && !$this->invalidateFormatter) ? $this->getIntlDateFormatter()->getPattern() : $this->pattern; | ||
} | ||
|
||
/** | ||
* Sets the time format to be used by the IntlDateFormatter | ||
* | ||
* @param integer|null $timeType | ||
* @return DateTime provides fluent interface | ||
*/ | ||
public function setTimeType($timeType) | ||
{ | ||
$this->timeType = $timeType; | ||
$this->invalidateFormatter = true; | ||
|
||
return $this; | ||
} | ||
|
||
/** | ||
* Returns the time format used by the IntlDateFormatter | ||
* | ||
* @return int | ||
*/ | ||
public function getTimeType() | ||
{ | ||
return $this->timeType; | ||
} | ||
|
||
/** | ||
* Sets the timezone to be used by the IntlDateFormatter | ||
* | ||
* @param string|null $timezone | ||
* @return DateTime provides fluent interface | ||
*/ | ||
public function setTimezone($timezone) | ||
{ | ||
$this->timezone = $timezone; | ||
|
||
return $this; | ||
} | ||
|
||
/** | ||
* Returns the timezone used by the IntlDateFormatter or the system default if none given | ||
* | ||
* @return string | ||
*/ | ||
public function getTimezone() | ||
{ | ||
return ($this->formatter && !$this->invalidateFormatter) ? $this->getIntlDateFormatter()->getTimeZoneId() : $this->timezone; | ||
} | ||
|
||
/** | ||
* Sets the locale to be used by the IntlDateFormatter | ||
* | ||
* @param string|null $locale | ||
* @return DateTime provides fluent interface | ||
*/ | ||
public function setLocale($locale) | ||
{ | ||
$this->locale = $locale; | ||
$this->invalidateFormatter = true; | ||
|
||
return $this; | ||
} | ||
|
||
/** | ||
* Returns the locale used by the IntlDateFormatter or the system default if none given | ||
* | ||
* @return string | ||
*/ | ||
public function getLocale() | ||
{ | ||
return $this->locale; | ||
} | ||
|
||
/** | ||
* Returns true if and only if $value is a floating-point value | ||
* | ||
* @param string $value | ||
* @return bool | ||
* @throws Exception\InvalidArgumentException | ||
*/ | ||
public function isValid($value) | ||
{ | ||
if (!is_string($value)) { | ||
$this->error(self::INVALID); | ||
|
||
return false; | ||
} | ||
|
||
$this->setValue($value); | ||
|
||
$formatter = $this->getIntlDateFormatter(); | ||
|
||
if (intl_is_failure($formatter->getErrorCode())) { | ||
throw new Exception\InvalidArgumentException("Invalid locale string given"); | ||
} | ||
|
||
$position = 0; | ||
$parsedDate = $formatter->parse($value, $position); | ||
|
||
if (intl_is_failure($formatter->getErrorCode())) { | ||
$this->error(self::INVALID_DATETIME); | ||
|
||
return false; | ||
} | ||
|
||
if ($position != strlen($value)) { | ||
$this->error(self::INVALID_DATETIME); | ||
|
||
return false; | ||
} | ||
|
||
return true; | ||
} | ||
|
||
/** | ||
* Returns a non lenient configured IntlDateFormatter | ||
* | ||
* @return IntlDateFormatter | ||
*/ | ||
protected function getIntlDateFormatter() | ||
{ | ||
if ($this->formatter == null || $this->invalidateFormatter) { | ||
$this->formatter = new IntlDateFormatter($this->getLocale(), $this->getDateType(), $this->getTimeType(), | ||
$this->getTimezone(), $this->getCalendar(), $this->getPattern()); | ||
|
||
$this->formatter->setLenient(false); | ||
|
||
$this->invalidateFormatter = false; | ||
} | ||
|
||
return $this->formatter; | ||
} | ||
} |
Oops, something went wrong.