‪TYPO3CMS  11.5
DatePickerViewHelper.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
18 /*
19  * Inspired by and partially taken from the Neos.Form package (www.neos.io)
20  */
21 
23 
31 
40 {
44  protected ‪$tagName = 'input';
45 
49  protected ‪$propertyMapper;
50 
56  {
57  $this->propertyMapper = ‪$propertyMapper;
58  }
59 
63  public function ‪initializeArguments()
64  {
65  parent::initializeArguments();
66  $this->registerTagAttribute('size', 'int', 'The size of the input field');
67  $this->registerTagAttribute('placeholder', 'string', 'Specifies a short hint that describes the expected value of an input element');
68  $this->registerArgument('errorClass', 'string', 'CSS class to set if there are errors for this ViewHelper', false, 'f3-form-error');
69  $this->registerArgument('initialDate', 'string', 'Initial date (@see http://www.php.net/manual/en/datetime.formats.php for supported formats)');
70  $this->registerArgument('enableDatePicker', 'bool', 'Enable the Datepicker', false, true);
71  $this->registerArgument('previewMode', 'bool', 'Preview mde flag', true, false);
72  $this->registerArgument('dateFormat', 'string', 'The date format', false, 'Y-m-d');
73  // use the default value if custom templates have not yet adapted this property
74  $this->registerArgument('datePickerInitializationJavaScriptFile', 'string', 'The JavaScript file to initialize the date picker', false, 'EXT:form/Resources/Public/JavaScript/Frontend/DatePicker.js');
75  $this->registerUniversalTagAttributes();
76  }
77 
83  public function ‪render()
84  {
85  $enableDatePicker = $this->arguments['enableDatePicker'];
86  $dateFormat = $this->arguments['dateFormat'];
87  $previewMode = (bool)$this->arguments['previewMode'];
88  $placeholder = $this->arguments['additionalAttributes']['placeholder'] ?? $this->arguments['placeholder'];
89 
90  $name = $this->‪getName();
92 
93  $this->tag->addAttribute('type', 'text');
94  $this->tag->addAttribute('name', $name . '[date]');
95 
96  if ($this->hasArgument('id')) {
97  $id = $this->arguments['id'];
98  } else {
99  $id = 'field' . md5(‪StringUtility::getUniqueId());
100  }
101 
102  if (empty($placeholder)) {
103  $this->tag->addAttribute('placeholder', $dateFormat);
104  }
105 
106  if ($enableDatePicker) {
107  $this->tag->addAttribute('readonly', 'readonly');
108  if (!$previewMode) {
109  $datePickerDateFormat = $this->‪convertDateFormatToDatePickerFormat($dateFormat);
110  $this->tag->addAttribute('data-format', $datePickerDateFormat);
111  $this->tag->addAttribute('data-t3-form-datepicker', '');
112  if (!empty($this->arguments['datePickerInitializationJavaScriptFile'])) {
113  GeneralUtility::makeInstance(AssetCollector::class)
114  ->addJavaScript(
115  't3-form-datepicker',
116  $this->arguments['datePickerInitializationJavaScriptFile'],
117  []
118  );
119  }
120  }
121  }
122  $date = $this->‪getSelectedDate();
123  if ($date !== null) {
124  $this->tag->addAttribute('value', $date->format($dateFormat));
125  }
126 
127  $this->tag->addAttribute('id', $id);
128 
129  $this->‪setErrorClassAttribute();
130  $content = '';
131  $content .= $this->tag->render();
132  $content .= '<input type="hidden" name="' . htmlspecialchars($name) . '[dateFormat]" value="' . htmlspecialchars($dateFormat) . '" />';
133 
134  return $content;
135  }
136 
140  protected function ‪getSelectedDate()
141  {
143  $formRuntime = $this->renderingContext
144  ->getViewHelperVariableContainer()
145  ->get(RenderRenderableViewHelper::class, 'formRuntime');
146 
147  $date = $formRuntime[$this->arguments['property']];
148  if ($date instanceof \DateTime) {
149  return $date;
150  }
151  if ($date !== null) {
152  $date = $this->propertyMapper->convert($date, \DateTime::class);
153  if (!$date instanceof \DateTime) {
154  return null;
155  }
156  return $date;
157  }
158  if ($this->hasArgument('initialDate')) {
159  return new \DateTime($this->arguments['initialDate']);
160  }
161 
162  return null;
163  }
164 
169  protected function ‪convertDateFormatToDatePickerFormat(string $dateFormat): string
170  {
171  $replacements = [
172  'd' => 'dd',
173  'D' => 'D',
174  'j' => 'o',
175  'l' => 'DD',
176 
177  'F' => 'MM',
178  'm' => 'mm',
179  'M' => 'M',
180  'n' => 'm',
181 
182  'Y' => 'yy',
183  'y' => 'y',
184  ];
185  return strtr($dateFormat, $replacements);
186  }
187 }
‪TYPO3\CMS\Fluid\ViewHelpers\Form\AbstractFormFieldViewHelper\setErrorClassAttribute
‪setErrorClassAttribute()
Definition: AbstractFormFieldViewHelper.php:331
‪TYPO3\CMS\Core\Page\AssetCollector
Definition: AssetCollector.php:42
‪TYPO3\CMS\Form\ViewHelpers\Form\DatePickerViewHelper\initializeArguments
‪initializeArguments()
Definition: DatePickerViewHelper.php:61
‪TYPO3\CMS\Form\ViewHelpers\Form\DatePickerViewHelper\$tagName
‪string $tagName
Definition: DatePickerViewHelper.php:43
‪TYPO3\CMS\Form\ViewHelpers\Form\DatePickerViewHelper\injectPropertyMapper
‪injectPropertyMapper(PropertyMapper $propertyMapper)
Definition: DatePickerViewHelper.php:53
‪TYPO3\CMS\Form\ViewHelpers\Form\DatePickerViewHelper
Definition: DatePickerViewHelper.php:40
‪TYPO3\CMS\Fluid\ViewHelpers\Form\AbstractFormViewHelper\registerFieldNameForFormTokenGeneration
‪registerFieldNameForFormTokenGeneration($fieldName)
Definition: AbstractFormViewHelper.php:106
‪TYPO3\CMS\Form\ViewHelpers\Form\DatePickerViewHelper\$propertyMapper
‪TYPO3 CMS Extbase Property PropertyMapper $propertyMapper
Definition: DatePickerViewHelper.php:47
‪TYPO3\CMS\Form\ViewHelpers\Form\DatePickerViewHelper\convertDateFormatToDatePickerFormat
‪string convertDateFormatToDatePickerFormat(string $dateFormat)
Definition: DatePickerViewHelper.php:167
‪TYPO3\CMS\Form\ViewHelpers\RenderRenderableViewHelper
Definition: RenderRenderableViewHelper.php:41
‪TYPO3\CMS\Extbase\Property\PropertyMapper
Definition: PropertyMapper.php:39
‪TYPO3\CMS\Form\ViewHelpers\Form
Definition: DatePickerViewHelper.php:22
‪TYPO3\CMS\Form\ViewHelpers\Form\DatePickerViewHelper\getSelectedDate
‪DateTime null getSelectedDate()
Definition: DatePickerViewHelper.php:138
‪TYPO3\CMS\Core\Utility\StringUtility\getUniqueId
‪static string getUniqueId($prefix='')
Definition: StringUtility.php:128
‪TYPO3\CMS\Form\Domain\Runtime\FormRuntime
Definition: FormSession.php:18
‪TYPO3\CMS\Form\ViewHelpers\Form\DatePickerViewHelper\render
‪string render()
Definition: DatePickerViewHelper.php:81
‪TYPO3\CMS\Fluid\ViewHelpers\Form\AbstractFormFieldViewHelper
Definition: AbstractFormFieldViewHelper.php:30
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:50
‪TYPO3\CMS\Core\Utility\StringUtility
Definition: StringUtility.php:22
‪TYPO3\CMS\Fluid\ViewHelpers\Form\AbstractFormFieldViewHelper\getName
‪string getName()
Definition: AbstractFormFieldViewHelper.php:90