TYPO3 CMS  TYPO3_8-7
DateTimeConverter.php
Go to the documentation of this file.
1 <?php
3 
4 /* *
5  * This script belongs to the Extbase framework *
6  * *
7  * It is free software; you can redistribute it and/or modify it under *
8  * the terms of the GNU Lesser General Public License as published by the *
9  * Free Software Foundation, either version 3 of the License, or (at your *
10  * option) any later version. *
11  * *
12  * This script is distributed in the hope that it will be useful, but *
13  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN- *
14  * TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser *
15  * General Public License for more details. *
16  * *
17  * You should have received a copy of the GNU Lesser General Public *
18  * License along with the script. *
19  * If not, see http://www.gnu.org/licenses/lgpl.html *
20  * *
21  * The TYPO3 project - inspiring people to share! *
22  * */
64 {
68  const CONFIGURATION_DATE_FORMAT = 'dateFormat';
69 
76  const DEFAULT_DATE_FORMAT = \DateTime::W3C;
77 
81  protected $sourceTypes = ['string', 'integer', 'array'];
82 
86  protected $targetType = 'DateTime';
87 
91  protected $priority = 10;
92 
100  public function canConvertFrom($source, $targetType)
101  {
102  if (!is_callable([$targetType, 'createFromFormat'])) {
103  return false;
104  }
105  if (is_array($source)) {
106  return true;
107  }
108  if (is_int($source)) {
109  return true;
110  }
111  return is_string($source);
112  }
113 
124  public function convertFrom($source, $targetType, array $convertedChildProperties = [], \TYPO3\CMS\Extbase\Property\PropertyMappingConfigurationInterface $configuration = null)
125  {
126  $dateFormat = $this->getDefaultDateFormat($configuration);
127  if (is_string($source)) {
128  $dateAsString = $source;
129  } elseif (is_int($source)) {
130  $dateAsString = strval($source);
131  } else {
132  if (isset($source['date']) && is_string($source['date'])) {
133  $dateAsString = $source['date'];
134  } elseif (isset($source['date']) && is_int($source['date'])) {
135  $dateAsString = strval($source['date']);
136  } elseif ($this->isDatePartKeysProvided($source)) {
137  if ($source['day'] < 1 || $source['month'] < 1 || $source['year'] < 1) {
138  return new \TYPO3\CMS\Extbase\Error\Error('Could not convert the given date parts into a DateTime object because one or more parts were 0.', 1333032779);
139  }
140  $dateAsString = sprintf('%d-%d-%d', $source['year'], $source['month'], $source['day']);
141  } else {
142  throw new \TYPO3\CMS\Extbase\Property\Exception\TypeConverterException('Could not convert the given source into a DateTime object because it was not an array with a valid date as a string', 1308003914);
143  }
144  if (isset($source['dateFormat']) && $source['dateFormat'] !== '') {
145  $dateFormat = $source['dateFormat'];
146  }
147  }
148  if ($dateAsString === '') {
149  return null;
150  }
151  if (ctype_digit($dateAsString) && $configuration === null && (!is_array($source) || !isset($source['dateFormat']))) {
152  $dateFormat = 'U';
153  }
154  if (is_array($source) && isset($source['timezone']) && (string)$source['timezone'] !== '') {
155  try {
156  $timezone = new \DateTimeZone($source['timezone']);
157  } catch (\Exception $e) {
158  throw new \TYPO3\CMS\Extbase\Property\Exception\TypeConverterException('The specified timezone "' . $source['timezone'] . '" is invalid.', 1308240974);
159  }
160  $date = $targetType::createFromFormat($dateFormat, $dateAsString, $timezone);
161  } else {
162  $date = $targetType::createFromFormat($dateFormat, $dateAsString);
163  }
164  if ($date === false) {
165  return new \TYPO3\CMS\Extbase\Validation\Error('The date "%s" was not recognized (for format "%s").', 1307719788, [$dateAsString, $dateFormat]);
166  }
167  if (is_array($source)) {
168  $this->overrideTimeIfSpecified($date, $source);
169  }
170  return $date;
171  }
172 
179  protected function isDatePartKeysProvided(array $source)
180  {
181  return isset($source['day']) && ctype_digit($source['day'])
182  && isset($source['month']) && ctype_digit($source['month'])
183  && isset($source['year']) && ctype_digit($source['year']);
184  }
185 
194  protected function getDefaultDateFormat(\TYPO3\CMS\Extbase\Property\PropertyMappingConfigurationInterface $configuration = null)
195  {
196  if ($configuration === null) {
197  return self::DEFAULT_DATE_FORMAT;
198  }
199  $dateFormat = $configuration->getConfigurationValue(\TYPO3\CMS\Extbase\Property\TypeConverter\DateTimeConverter::class, self::CONFIGURATION_DATE_FORMAT);
200  if ($dateFormat === null) {
201  return self::DEFAULT_DATE_FORMAT;
202  }
203  if ($dateFormat !== null && !is_string($dateFormat)) {
204  throw new \TYPO3\CMS\Extbase\Property\Exception\InvalidPropertyMappingConfigurationException('CONFIGURATION_DATE_FORMAT must be of type string, "' . (is_object($dateFormat) ? get_class($dateFormat) : gettype($dateFormat)) . '" given', 1307719569);
205  }
206  return $dateFormat;
207  }
208 
215  protected function overrideTimeIfSpecified(\DateTime $date, array $source)
216  {
217  if (!isset($source['hour']) && !isset($source['minute']) && !isset($source['second'])) {
218  return;
219  }
220  $hour = isset($source['hour']) ? (int)$source['hour'] : 0;
221  $minute = isset($source['minute']) ? (int)$source['minute'] : 0;
222  $second = isset($source['second']) ? (int)$source['second'] : 0;
223  $date->setTime($hour, $minute, $second);
224  }
225 }
convertFrom($source, $targetType, array $convertedChildProperties=[], \TYPO3\CMS\Extbase\Property\PropertyMappingConfigurationInterface $configuration=null)
getDefaultDateFormat(\TYPO3\CMS\Extbase\Property\PropertyMappingConfigurationInterface $configuration=null)