diff --git a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangeCustomFormatter.php b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangeCustomFormatter.php index f70160f..2be820b 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangeCustomFormatter.php +++ b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangeCustomFormatter.php @@ -2,7 +2,6 @@ namespace Drupal\datetime\Plugin\Field\FieldFormatter; -use Drupal\Core\Datetime\DrupalDateTime; use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\datetime\Plugin\Field\FieldType\DateRangeItem; @@ -21,7 +20,7 @@ * } * ) */ -class DateRangeCustomFormatter extends DateRangeFormatterBase { +class DateRangeCustomFormatter extends DateTimeCustomFormatter { /** * {@inheritdoc} @@ -29,6 +28,7 @@ class DateRangeCustomFormatter extends DateRangeFormatterBase { public static function defaultSettings() { return [ 'date_format' => DATETIME_DATETIME_STORAGE_FORMAT, + 'separator' => '-', ] + parent::defaultSettings(); } @@ -40,38 +40,23 @@ public function viewElements(FieldItemListInterface $items, $langcode) { $separator = $this->getSetting('separator'); foreach ($items as $delta => $item) { - if ($item->start_date && $item->end_date) { + if (!empty($item->start_date) && !empty($item->end_date)) { /** @var \Drupal\Core\Datetime\DrupalDateTime $start_date */ $start_date = $item->start_date; /** @var \Drupal\Core\Datetime\DrupalDateTime $end_date */ $end_date = $item->end_date; - if ($this->getFieldSetting('datetime_type') == DateRangeItem::DATETIME_TYPE_DATE) { - // A date without time will pick up the current time, use the default. - datetime_date_default_time($start_date); - datetime_date_default_time($end_date); - } - - $this->setTimeZone($start_date); - $this->setTimeZone($end_date); - - $start = $this->formatDate($start_date); - $end = $this->formatDate($end_date); - if ($start !== $end) { - $output = $this->formatDate($start_date) . ' ' . $separator . ' ' . $this->formatDate($end_date); + if ($start_date->format('U') !== $end_date->format('U')) { + $elements[$delta] = [ + $this->buildDate($start_date), + ['#plain_text' => ' ' . $separator . ' '], + $this->buildDate($end_date), + $this->defaultCacheContext(), + ]; } else { - $output = $start; + $elements[$delta] = $this->buildDate($start_date) + $this->defaultCacheContext(); } - - $elements[$delta] = [ - '#cache' => [ - 'contexts' => [ - 'timezone', - ], - ], - '#plain_text' => $output, - ]; } } @@ -81,23 +66,14 @@ public function viewElements(FieldItemListInterface $items, $langcode) { /** * {@inheritdoc} */ - protected function formatDate(DrupalDateTime $date) { - $format = $this->getSetting('date_format'); - $timezone = $this->getSetting('timezone_override') ?: $date->getTimezone()->getName(); - return $this->dateFormatter->format($date->getTimestamp(), 'custom', $format, $timezone != '' ? $timezone : NULL); - } - - /** - * {@inheritdoc} - */ public function settingsForm(array $form, FormStateInterface $form_state) { $form = parent::settingsForm($form, $form_state); - $form['date_format'] = [ + $form['separator'] = [ '#type' => 'textfield', - '#title' => $this->t('Date/time format'), - '#description' => $this->t('See the documentation for PHP date formats.'), - '#default_value' => $this->getSetting('date_format'), + '#title' => $this->t('Date separator'), + '#description' => $this->t('The string to separate the start and end dates'), + '#default_value' => $this->getSetting('separator'), ]; return $form; @@ -109,9 +85,9 @@ public function settingsForm(array $form, FormStateInterface $form_state) { public function settingsSummary() { $summary = parent::settingsSummary(); - $date = DrupalDateTime::createFromTimestamp($this->requestStack->getCurrentRequest()->server->get('REQUEST_TIME')); - $this->setTimeZone($date); - $summary[] = $this->t('Format: @display', ['@display' => $this->formatDate($date)]); + if ($separator = $this->getSetting('separator')) { + $summary[] = $this->t('Separator: %separator', ['%separator' => $separator]); + } return $summary; } diff --git a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangeDefaultFormatter.php b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangeDefaultFormatter.php index 1ee4ef8..2655315 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangeDefaultFormatter.php +++ b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangeDefaultFormatter.php @@ -2,7 +2,6 @@ namespace Drupal\datetime\Plugin\Field\FieldFormatter; -use Drupal\Core\Datetime\DrupalDateTime; use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\datetime\Plugin\Field\FieldType\DateRangeItem; @@ -22,7 +21,7 @@ * } * ) */ -class DateRangeDefaultFormatter extends DateRangeFormatterBase { +class DateRangeDefaultFormatter extends DateTimeDefaultFormatter { /** * {@inheritdoc} @@ -30,6 +29,7 @@ class DateRangeDefaultFormatter extends DateRangeFormatterBase { public static function defaultSettings() { return [ 'format_type' => 'medium', + 'separator' => '-', ] + parent::defaultSettings(); } @@ -41,65 +41,22 @@ public function viewElements(FieldItemListInterface $items, $langcode) { $separator = $this->getSetting('separator'); foreach ($items as $delta => $item) { - if ($item->start_date && $item->end_date) { + if (!empty($item->start_date) && !empty($item->end_date)) { /** @var \Drupal\Core\Datetime\DrupalDateTime $start_date */ $start_date = $item->start_date; /** @var \Drupal\Core\Datetime\DrupalDateTime $end_date */ $end_date = $item->end_date; - if ($this->getFieldSetting('datetime_type') == DateRangeItem::DATETIME_TYPE_DATE) { - // A date without time will pick up the current time, use the default. - datetime_date_default_time($start_date); - datetime_date_default_time($end_date); - } - - // Create the ISO dates in Universal Time. - $start_iso_date = $start_date->format("Y-m-d\TH:i:s") . 'Z'; - $end_iso_date = $end_date->format("Y-m-d\TH:i:s") . 'Z'; - - $this->setTimeZone($start_date); - $this->setTimeZone($end_date); - - // Display the dates using theme datetime. - $elements[$delta] = [ - '#cache' => [ - 'contexts' => [ - 'timezone', - ], - ], - ]; - - $start = $this->formatDate($start_date); - $end = $this->formatDate($end_date); - - if ($start !== $end) { - $elements[$delta][] = [ - '#theme' => 'time', - '#text' => $start, - '#html' => FALSE, - '#attributes' => [ - 'datetime' => $start_iso_date, - ] - ]; - $elements[$delta][] = ['#plain_text' => ' ' . $separator . ' ']; - $elements[$delta][] = [ - '#theme' => 'time', - '#text' => $end, - '#html' => FALSE, - '#attributes' => [ - 'datetime' => $end_iso_date, - ] + if ($start_date->format('U') !== $end_date->format('U')) { + $elements[$delta] = [ + $this->buildDate($start_date), + ['#plain_text' => ' ' . $separator . ' '], + $this->buildDate($end_date), + $this->defaultCacheContext(), ]; } else { - $elements[$delta][] = [ - '#theme' => 'time', - '#text' => $start, - '#html' => FALSE, - '#attributes' => [ - 'datetime' => $start_iso_date, - ] - ]; + $elements[$delta] = $this->buildDate($start_date) + $this->defaultCacheContext(); } if (!empty($item->_attributes)) { @@ -117,32 +74,14 @@ public function viewElements(FieldItemListInterface $items, $langcode) { /** * {@inheritdoc} */ - protected function formatDate(DrupalDateTime $date) { - $format_type = $this->getSetting('format_type'); - $timezone = $this->getSetting('timezone_override') ?: $date->getTimezone()->getName(); - return $this->dateFormatter->format($date->getTimestamp(), $format_type, '', $timezone != '' ? $timezone : NULL); - } - - /** - * {@inheritdoc} - */ public function settingsForm(array $form, FormStateInterface $form_state) { $form = parent::settingsForm($form, $form_state); - $format_types = $this->dateFormatStorage->loadMultiple(); - $options = []; - - foreach ($format_types as $type => $type_info) { - $format = $this->dateFormatter->format(REQUEST_TIME, $type); - $options[$type] = $type_info->label() . ' (' . $format . ')'; - } - - $form['format_type'] = [ - '#type' => 'select', - '#title' => $this->t('Date format'), - '#description' => $this->t('Choose a format for displaying the dates. Be sure to set a format appropriate for the field, i.e. omitting time for a field that only has a date.'), - '#options' => $options, - '#default_value' => $this->getSetting('format_type'), + $form['separator'] = [ + '#type' => 'textfield', + '#title' => $this->t('Date separator'), + '#description' => $this->t('The string to separate the start and end dates'), + '#default_value' => $this->getSetting('separator'), ]; return $form; @@ -154,9 +93,9 @@ public function settingsForm(array $form, FormStateInterface $form_state) { public function settingsSummary() { $summary = parent::settingsSummary(); - $date = DrupalDateTime::createFromTimestamp($this->requestStack->getCurrentRequest()->server->get('REQUEST_TIME')); - $this->setTimeZone($date); - $summary[] = $this->t('Format: @display', ['@display' => $this->formatDate($date)]); + if ($separator = $this->getSetting('separator')) { + $summary[] = $this->t('Separator: %separator', ['%separator' => $separator]); + } return $summary; } diff --git a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangeFormatterBase.php b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangeFormatterBase.php deleted file mode 100644 index f0c40d4..0000000 --- a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangeFormatterBase.php +++ /dev/null @@ -1,194 +0,0 @@ -dateFormatter = $date_formatter; - $this->dateFormatStorage = $date_format_storage; - $this->requestStack = $request_stack; - } - - /** - * {@inheritdoc} - */ - public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { - return new static( - $plugin_id, - $plugin_definition, - $configuration['field_definition'], - $configuration['settings'], - $configuration['label'], - $configuration['view_mode'], - $configuration['third_party_settings'], - $container->get('date.formatter'), - $container->get('entity_type.manager')->getStorage('date_format'), - $container->get('request_stack') - ); - } - - /** - * {@inheritdoc} - */ - public static function defaultSettings() { - return [ - 'separator' => '-', - 'timezone_override' => '', - ] + parent::defaultSettings(); - } - - /** - * {@inheritdoc} - */ - public function settingsForm(array $form, FormStateInterface $form_state) { - $form = parent::settingsForm($form, $form_state); - - $form['separator'] = [ - '#type' => 'textfield', - '#title' => $this->t('Date separator'), - '#description' => $this->t('The string to separate the start and end dates'), - '#default_value' => $this->getSetting('separator'), - ]; - - $form['timezone_override'] = [ - '#type' => 'select', - '#title' => $this->t('Time zone override'), - '#description' => $this->t('The time zone selected here will always be used'), - '#options' => system_time_zones(TRUE), - '#default_value' => $this->getSetting('timezone_override'), - ]; - - return $form; - } - - /** - * {@inheritdoc} - */ - public function settingsSummary() { - $summary = parent::settingsSummary(); - - if ($separator = $this->getSetting('separator')) { - $summary[] = $this->t('Separator: %separator', ['%separator' => $separator]); - } - - if ($override = $this->getSetting('timezone_override')) { - $summary[] = $this->t('Time zone: @timezone', ['@timezone' => $override]); - } - - return $summary; - } - - /** - * Creates a formatted date as a string. - * - * @param \Drupal\Core\Datetime\DrupalDateTime $date - * The date. - * - * @return string - * A formatted date range string using the chosen format. - */ - abstract protected function formatDate(DrupalDateTime $date); - - /** - * Sets the proper time zone on a DrupalDateTime object for the current user. - * - * A DrupalDateTime object loaded from the database will have the UTC time - * zone applied to it. This method will apply the time zone for the current - * user, based on system and user settings. - * - * @see drupal_get_user_timezone() - * - * @param \Drupal\Core\Datetime\DrupalDateTime $date - * A DrupalDateTime object. - */ - protected function setTimeZone(DrupalDateTime $date) { - if ($this->getFieldSetting('datetime_type') === DateRangeItem::DATETIME_TYPE_DATE) { - // A date without time has no timezone conversion. - $timezone = DATETIME_STORAGE_TIMEZONE; - } - else { - $timezone = drupal_get_user_timezone(); - } - $date->setTimeZone(timezone_open($timezone)); - } - - /** - * Gets a settings array suitable for DrupalDateTime::format(). - * - * @return array - * The settings array that can be passed to DrupalDateTime::format(). - */ - protected function getFormatSettings() { - $settings = []; - - if ($this->getSetting('timezone_override') != '') { - $settings['timezone'] = $this->getSetting('timezone_override'); - } - - return $settings; - } - -} diff --git a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangePlainFormatter.php b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangePlainFormatter.php index 06c24ac..e110c4d 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangePlainFormatter.php +++ b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangePlainFormatter.php @@ -2,8 +2,8 @@ namespace Drupal\datetime\Plugin\Field\FieldFormatter; -use Drupal\Core\Datetime\DrupalDateTime; use Drupal\Core\Field\FieldItemListInterface; +use Drupal\Core\Form\FormStateInterface; use Drupal\datetime\Plugin\Field\FieldType\DateRangeItem; /** @@ -20,7 +20,16 @@ * } * ) */ -class DateRangePlainFormatter extends DateRangeFormatterBase { +class DateRangePlainFormatter extends DateTimePlainFormatter { + + /** + * {@inheritdoc} + */ + public static function defaultSettings() { + return [ + 'separator' => '-', + ] + parent::defaultSettings(); + } /** * {@inheritdoc} @@ -30,38 +39,23 @@ public function viewElements(FieldItemListInterface $items, $langcode) { $separator = $this->getSetting('separator'); foreach ($items as $delta => $item) { - if ($item->start_date && $item->end_date) { + if (!empty($item->start_date) && !empty($item->end_date)) { /** @var \Drupal\Core\Datetime\DrupalDateTime $start_date */ $start_date = $item->start_date; /** @var \Drupal\Core\Datetime\DrupalDateTime $end_date */ $end_date = $item->end_date; - if ($this->getFieldSetting('datetime_type') == DateRangeItem::DATETIME_TYPE_DATE) { - // A date without time will pick up the current time, use the default. - datetime_date_default_time($start_date); - datetime_date_default_time($end_date); - } - - $this->setTimeZone($start_date); - $this->setTimeZone($end_date); - - $start = $this->formatDate($start_date); - $end = $this->formatDate($end_date); - if ($start !== $end) { - $output = $this->formatDate($start_date) . ' ' . $separator . ' ' . $this->formatDate($end_date); + if ($start_date->format('U') !== $end_date->format('U')) { + $elements[$delta] = [ + $this->buildDate($start_date), + ['#plain_text' => ' ' . $separator . ' '], + $this->buildDate($end_date), + $this->defaultCacheContext(), + ]; } else { - $output = $start; + $elements[$delta] = $this->buildDate($start_date) + $this->defaultCacheContext(); } - - $elements[$delta] = [ - '#cache' => [ - 'contexts' => [ - 'timezone', - ], - ], - '#plain_text' => $output, - ]; } } @@ -71,10 +65,30 @@ public function viewElements(FieldItemListInterface $items, $langcode) { /** * {@inheritdoc} */ - protected function formatDate(DrupalDateTime $date) { - $format = $this->getFieldSetting('datetime_type') == DateRangeItem::DATETIME_TYPE_DATE ? DATETIME_DATE_STORAGE_FORMAT : DATETIME_DATETIME_STORAGE_FORMAT; - $timezone = $this->getSetting('timezone_override') ?: $date->getTimezone()->getName(); - return $this->dateFormatter->format($date->getTimestamp(), 'custom', $format, $timezone != '' ? $timezone : NULL); + public function settingsForm(array $form, FormStateInterface $form_state) { + $form = parent::settingsForm($form, $form_state); + + $form['separator'] = [ + '#type' => 'textfield', + '#title' => $this->t('Date separator'), + '#description' => $this->t('The string to separate the start and end dates'), + '#default_value' => $this->getSetting('separator'), + ]; + + return $form; + } + + /** + * {@inheritdoc} + */ + public function settingsSummary() { + $summary = parent::settingsSummary(); + + if ($separator = $this->getSetting('separator')) { + $summary[] = $this->t('Separator: %separator', ['%separator' => $separator]); + } + + return $summary; } } diff --git a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeCustomFormatter.php b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeCustomFormatter.php index 678ddc8..f68bbe3 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeCustomFormatter.php +++ b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeCustomFormatter.php @@ -5,6 +5,7 @@ use Drupal\Core\Datetime\DrupalDateTime; use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Form\FormStateInterface; +use Drupal\datetime\Plugin\Field\FieldType\DateTimeItem; /** * Plugin implementation of the 'Custom' formatter for 'datetime' fields. @@ -35,27 +36,10 @@ public function viewElements(FieldItemListInterface $items, $langcode) { $elements = array(); foreach ($items as $delta => $item) { - $output = ''; if (!empty($item->date)) { /** @var \Drupal\Core\Datetime\DrupalDateTime $date */ - $date = $item->date; - - if ($this->getFieldSetting('datetime_type') == 'date') { - // A date without time will pick up the current time, use the default. - datetime_date_default_time($date); - } - $this->setTimeZone($date); - - $output = $this->formatDate($date); + $elements[$delta] = $this->buildDate($item->date) + $this->defaultCacheContext(); } - $elements[$delta] = [ - '#markup' => $output, - '#cache' => [ - 'contexts' => [ - 'timezone', - ], - ], - ]; } return $elements; @@ -66,13 +50,30 @@ public function viewElements(FieldItemListInterface $items, $langcode) { */ protected function formatDate($date) { $format = $this->getSetting('date_format'); - $timezone = $this->getSetting('timezone_override'); + $timezone = $this->getSetting('timezone_override') ?: $date->getTimezone()->getName(); return $this->dateFormatter->format($date->getTimestamp(), 'custom', $format, $timezone != '' ? $timezone : NULL); } /** * {@inheritdoc} */ + protected function buildDate($date) { + if ($this->getFieldSetting('datetime_type') == DateTimeItem::DATETIME_TYPE_DATE) { + // A date without time will pick up the current time, use the default. + datetime_date_default_time($date); + } + $this->setTimeZone($date); + + $build = [ + '#plain_text' => $this->formatDate($date), + ]; + + return $build; + } + + /** + * {@inheritdoc} + */ public function settingsForm(array $form, FormStateInterface $form_state) { $form = parent::settingsForm($form, $form_state); @@ -94,7 +95,7 @@ public function settingsSummary() { $date = new DrupalDateTime(); $this->setTimeZone($date); - $summary[] = $date->format($this->getSetting('date_format'), $this->getFormatSettings()); + $summary[] = $this->t('Format: @display', ['@display' => $this->formatDate($date)]); return $summary; } diff --git a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeDefaultFormatter.php b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeDefaultFormatter.php index 03c92ae..0d3d2e8 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeDefaultFormatter.php +++ b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeDefaultFormatter.php @@ -5,6 +5,7 @@ use Drupal\Core\Datetime\DrupalDateTime; use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Form\FormStateInterface; +use Drupal\datetime\Plugin\Field\FieldType\DateTimeItem; /** * Plugin implementation of the 'Default' formatter for 'datetime' fields. @@ -35,45 +36,17 @@ public function viewElements(FieldItemListInterface $items, $langcode) { $elements = array(); foreach ($items as $delta => $item) { - $output = ''; - $iso_date = ''; - - if ($item->date) { + if (!empty($item->date)) { /** @var \Drupal\Core\Datetime\DrupalDateTime $date */ - $date = $item->date; - - if ($this->getFieldSetting('datetime_type') == 'date') { - // A date without time will pick up the current time, use the default. - datetime_date_default_time($date); + // Display the date using theme datetime. + $elements[$delta] = $this->buildDate($item->date) + $this->defaultCacheContext(); + + if (!empty($item->_attributes)) { + $elements[$delta]['#attributes'] += $item->_attributes; + // Unset field item attributes since they have been included in the + // formatter output and should not be rendered in the field template. + unset($item->_attributes); } - - // Create the ISO date in Universal Time. - $iso_date = $date->format("Y-m-d\TH:i:s") . 'Z'; - - $this->setTimeZone($date); - - $output = $this->formatDate($date); - } - - // Display the date using theme datetime. - $elements[$delta] = array( - '#cache' => [ - 'contexts' => [ - 'timezone', - ], - ], - '#theme' => 'time', - '#text' => $output, - '#html' => FALSE, - '#attributes' => array( - 'datetime' => $iso_date, - ), - ); - if (!empty($item->_attributes)) { - $elements[$delta]['#attributes'] += $item->_attributes; - // Unset field item attributes since they have been included in the - // formatter output and should not be rendered in the field template. - unset($item->_attributes); } } @@ -93,6 +66,32 @@ protected function formatDate($date) { /** * {@inheritdoc} */ + protected function buildDate($date) { + if ($this->getFieldSetting('datetime_type') == DateTimeItem::DATETIME_TYPE_DATE) { + // A date without time will pick up the current time, use the default. + datetime_date_default_time($date); + } + + // Create the ISO date in Universal Time. + $iso_date = $date->format("Y-m-d\TH:i:s") . 'Z'; + + $this->setTimeZone($date); + + $build = [ + '#theme' => 'time', + '#text' => $this->formatDate($date), + '#html' => FALSE, + '#attributes' => [ + 'datetime' => $iso_date, + ], + ]; + + return $build; + } + + /** + * {@inheritdoc} + */ public function settingsForm(array $form, FormStateInterface $form_state) { $form = parent::settingsForm($form, $form_state); diff --git a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeFormatterBase.php b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeFormatterBase.php index be9df38..2546969 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeFormatterBase.php +++ b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeFormatterBase.php @@ -129,6 +129,47 @@ public function settingsSummary() { abstract protected function formatDate($date); /** + * Creates a render array from a data object. + * + * Note: the caller is responsible for setting the proper cache context, which + * is typically + * @code + * [ + * '#cache' => [ + * 'contexts' => [ + * 'timezone', + * ], + * ] + * ] + * @endcode + * This is to allow this method to be used multiple times to create a render + * array, without creating redundant cache contexts for each element. + * + * @param \Drupal\Core\Datetime\DrupalDateTime $date + * A date object. + * + * @return array + * A render array. + */ + abstract protected function buildDate($date); + + /** + * Returns the default cache context for the formatter. + * + * @return array + * A render array. + */ + protected function defaultCacheContext() { + return [ + '#cache' => [ + 'contexts' => [ + 'timezone', + ], + ], + ]; + } + + /** * Sets the proper time zone on a DrupalDateTime object for the current user. * * A DrupalDateTime object loaded from the database will have the UTC time diff --git a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimePlainFormatter.php b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimePlainFormatter.php index 683d75c..0ee0da7 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimePlainFormatter.php +++ b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimePlainFormatter.php @@ -25,27 +25,10 @@ public function viewElements(FieldItemListInterface $items, $langcode) { $elements = array(); foreach ($items as $delta => $item) { - $output = ''; if (!empty($item->date)) { /** @var \Drupal\Core\Datetime\DrupalDateTime $date */ - $date = $item->date; - - if ($this->getFieldSetting('datetime_type') == 'date') { - // A date without time will pick up the current time, use the default. - datetime_date_default_time($date); - } - $this->setTimeZone($date); - - $output = $this->formatDate($date); + $elements[$delta] = $this->buildDate($item->date) + $this->defaultCacheContext(); } - $elements[$delta] = [ - '#cache' => [ - 'contexts' => [ - 'timezone', - ], - ], - '#markup' => $output, - ]; } return $elements; @@ -56,8 +39,25 @@ public function viewElements(FieldItemListInterface $items, $langcode) { */ protected function formatDate($date) { $format = $this->getFieldSetting('datetime_type') == DateTimeItem::DATETIME_TYPE_DATE ? DATETIME_DATE_STORAGE_FORMAT : DATETIME_DATETIME_STORAGE_FORMAT; - $timezone = $this->getSetting('timezone_override'); + $timezone = $this->getSetting('timezone_override') ?: $date->getTimezone()->getName(); return $this->dateFormatter->format($date->getTimestamp(), 'custom', $format, $timezone != '' ? $timezone : NULL); } + /** + * {@inheritdoc} + */ + protected function buildDate($date) { + if ($this->getFieldSetting('datetime_type') == DateTimeItem::DATETIME_TYPE_DATE) { + // A date without time will pick up the current time, use the default. + datetime_date_default_time($date); + } + $this->setTimeZone($date); + + $build = [ + '#plain_text' => $this->formatDate($date), + ]; + + return $build; + } + }