From be87b2eff28b9e1b1b4848311730c9755e736679 Mon Sep 17 00:00:00 2001 From: escuriola <escuriola@gmail.com> Date: Tue, 14 Jun 2022 14:51:25 +0200 Subject: [PATCH] OEL-1653: RangeDate Formatter with the time for the event dates. --- .../EventDateRangeFormatter.php | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 modules/oe_whitelabel_starter_event/src/Plugin/Field/FieldFormatter/EventDateRangeFormatter.php diff --git a/modules/oe_whitelabel_starter_event/src/Plugin/Field/FieldFormatter/EventDateRangeFormatter.php b/modules/oe_whitelabel_starter_event/src/Plugin/Field/FieldFormatter/EventDateRangeFormatter.php new file mode 100644 index 00000000..2e9e7e4f --- /dev/null +++ b/modules/oe_whitelabel_starter_event/src/Plugin/Field/FieldFormatter/EventDateRangeFormatter.php @@ -0,0 +1,94 @@ +<?php + +declare(strict_types = 1); + +namespace Drupal\oe_whitelabel_starter_event\Plugin\Field\FieldFormatter; + +use Drupal\Core\Datetime\DrupalDateTime; +use Drupal\Core\Field\FieldItemListInterface; +use Drupal\datetime\Plugin\Field\FieldFormatter\DateTimeFormatterBase; +use Drupal\datetime_range\DateTimeRangeTrait; + +/** + * Plugin implementation of the 'Event dates' formatter for 'daterange' fields. + * + * This formatter renders the data range as plain text, with a fully + * configurable date format using the PHP date syntax and separator. + * + * @FieldFormatter( + * id = "event_date_range_format", + * label = @Translation("Event date range format"), + * field_types = { + * "daterange" + * } + * ) + */ +class EventDateRangeFormatter extends DateTimeFormatterBase { + + use DateTimeRangeTrait; + + /** + * {@inheritdoc} + */ + public function viewElements(FieldItemListInterface $items, $langcode) { + $elements = []; + + foreach ($items as $delta => $item) { + if (empty($item->start_date) && empty($item->end_date)) { + continue; + } + + /** @var \Drupal\Core\Datetime\DrupalDateTime $start_date */ + $start_date = $item->start_date; + /** @var \Drupal\Core\Datetime\DrupalDateTime $end_date */ + $end_date = $item->end_date; + + // Event on a single day. + if ($start_date->format('Y-m-d') === $end_date->format('Y-m-d')) { + $elements[$delta] = [ + 'start_date' => $this->buildCustomDate($start_date, 'l d F Y, H.i'), + 'separator' => ['#plain_text' => '-'], + 'end_date' => $this->buildCustomDate($end_date, 'H.i (T)'), + ]; + } + // Event on multiple days. + else { + $elements[$delta] = [ + 'start_date' => $this->buildCustomDate($start_date, 'l d F Y, H.i'), + 'separator' => ['#plain_text' => '-'], + 'end_date' => $this->buildCustomDate($end_date, 'l d F Y, H.i (T)'), + ]; + } + } + + return $elements; + } + + /** + * Prepare render for a date with custom format. + */ + protected function buildCustomDate(DrupalDateTime $date, $format) { + $this->setTimeZone($date); + + $build = [ + '#markup' => $this->dateFormatter->format($date->getTimestamp(), 'custom', $format), + '#cache' => [ + 'contexts' => [ + 'timezone', + ], + ], + ]; + + return $build; + } + + /** + * {@inheritdoc} + */ + protected function formatDate($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); + } + +} -- GitLab