1: <?php
2: /*
3: * The MIT License
4: *
5: * Copyright 2017 David Schoenbauer.
6: *
7: * Permission is hereby granted, free of charge, to any person obtaining a copy
8: * of this software and associated documentation files (the "Software"), to deal
9: * in the Software without restriction, including without limitation the rights
10: * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11: * copies of the Software, and to permit persons to whom the Software is
12: * furnished to do so, subject to the following conditions:
13: *
14: * The above copyright notice and this permission notice shall be included in
15: * all copies or substantial portions of the Software.
16: *
17: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18: * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19: * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20: * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21: * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22: * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23: * THE SOFTWARE.
24: */
25: namespace DSchoenbauer\Orm\Events\Validate\DataType;
26:
27: use DateTime;
28: use DSchoenbauer\Orm\Entity\HasDateFieldsInterface;
29: use DSchoenbauer\Orm\Entity\HasDateWithCustomFormatInterface;
30:
31: /**
32: * Validates date fields are dates
33: *
34: * @author David Schoenbauer
35: */
36: class DataTypeDate extends AbstractDataType
37: {
38:
39: private $defaultDateTimeFormat;
40: private $customDateTimeFormats = [];
41:
42: /**
43: * returns the fields affected by the entity interface
44: * @param mixed $entity an entity object implements the getTypeInterface
45: * @return array an array of fields that are relevant to the interface
46: * @since v1.0.0
47: */
48: public function getFields($entity)
49: {
50: $this->setDefaultDateTimeFormat($entity->getDateDefaultFormat());
51: if ($entity instanceof HasDateWithCustomFormatInterface) {
52: $this->customDateTimeFormats = $entity->getDateCustomFormat();
53: }
54: return $entity->getDateFields();
55: }
56:
57: /**
58: * full name space of an interface that defines a given field type
59: * @return string
60: * @since v1.0.0
61: */
62: public function getTypeInterface()
63: {
64: return HasDateFieldsInterface::class;
65: }
66:
67: /**
68: * Validates that the value is of the proper type
69: * @param mixed $value value to DataType
70: * @param string $field field name
71: * @return boolean
72: * @since v1.0.0
73: */
74: public function validateValue($value, $field = null)
75: {
76: if ($value instanceof DateTime) {
77: return true;
78: }
79:
80: if (is_object($value)) {
81: return false;
82: }
83: $format = array_key_exists($field, $this->customDateTimeFormats) ?
84: $this->customDateTimeFormats[$field] : $this->getDefaultDateTimeFormat();
85: return DateTime::createFromFormat($format, $value) instanceof DateTime;
86: }
87:
88: /**
89: * provides a default Date Time String
90: * @return string
91: * @since v1.0.0
92: */
93: public function getDefaultDateTimeFormat()
94: {
95: return $this->defaultDateTimeFormat;
96: }
97:
98: /**
99: *
100: * @param string $defaultDateTimeFormat a format used to translate to a date
101: * @return $this
102: * @since v1.0.0
103: */
104: public function setDefaultDateTimeFormat($defaultDateTimeFormat)
105: {
106: $this->defaultDateTimeFormat = $defaultDateTimeFormat;
107: return $this;
108: }
109: }
110: