diff --git a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeCustomFormatter.php b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeCustomFormatter.php index 5b53a8f..69e6612 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeCustomFormatter.php +++ b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeCustomFormatter.php @@ -53,6 +53,21 @@ public function viewElements(FieldItemListInterface $items, $langcode) { $output = $this->formatDate($date); } + if (!empty($item->date2)) { + /** @var \Drupal\Core\Datetime\DrupalDateTime $date */ + $date2 = $item->date2; + + if ($this->getFieldSetting('datetime_type') == 'date') { + // A date without time will pick up the current time, use the default. + datetime_date_default_time($date2); + } + $this->setTimeZone($date2); + + $output = $this->t('@date to @date2', [ + '@date' => $this->formatDate($date), + '@date2' => $this->formatDate($date2), + ]); + } $elements[$delta] = [ '#markup' => $output, '#cache' => [ diff --git a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeDefaultFormatter.php b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeDefaultFormatter.php index 9b2735c..a1637a9 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeDefaultFormatter.php +++ b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeDefaultFormatter.php @@ -42,6 +42,8 @@ public function viewElements(FieldItemListInterface $items, $langcode) { foreach ($items as $delta => $item) { $output = ''; $iso_date = ''; + $output2 = ''; + $iso_date2 = ''; if ($item->date) { /** @var \Drupal\Core\Datetime\DrupalDateTime $date */ @@ -58,20 +60,55 @@ public function viewElements(FieldItemListInterface $items, $langcode) { $output = $this->formatDate($date); } + if ($item->date2) { + /** @var \Drupal\Core\Datetime\DrupalDateTime $date */ + $date2 = $item->date2; + // Create the ISO date in Universal Time. + $iso_date2 = $date->format("Y-m-d\TH:i:s") . 'Z'; + + if ($this->getFieldSetting('datetime_type') == 'date') { + // A date without time will pick up the current time, use the default. + datetime_date_default_time($date2); + } + $this->setTimeZone($date2); + + $output2 = $this->formatDate($date2); + } + // Display the date using theme datetime. - $elements[$delta] = array( + $elements[$delta] = [ '#cache' => [ 'contexts' => [ 'timezone', ], ], - '#theme' => 'time', - '#text' => $output, - '#html' => FALSE, - '#attributes' => array( - 'datetime' => $iso_date, - ), - ); + [ + '#theme' => 'time', + '#text' => $output, + '#html' => FALSE, + '#attributes' => ['datetime' => $iso_date], + ], + ]; + + // Append on the end date. + if ($this->getFieldSetting('enddate_get')) { + $elements[$delta][] = [ + '#markup' => $this->t(' to '), + ]; + $elements[$delta][] = [ + '#cache' => [ + 'contexts' => [ + 'timezone', + ], + ], + [ + '#theme' => 'time', + '#text' => $output2, + '#html' => FALSE, + '#attributes' => ['datetime' => $iso_date2], + ], + ]; + } if (!empty($item->_attributes)) { $elements[$delta]['#attributes'] += $item->_attributes; // Unset field item attributes since they have been included in the diff --git a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimePlainFormatter.php b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimePlainFormatter.php index c22445e..8ba7df7 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimePlainFormatter.php +++ b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimePlainFormatter.php @@ -30,6 +30,7 @@ public function viewElements(FieldItemListInterface $items, $langcode) { foreach ($items as $delta => $item) { $output = ''; + if (!empty($item->date)) { /** @var \Drupal\Core\Datetime\DrupalDateTime $date */ $date = $item->date; @@ -38,12 +39,25 @@ public function viewElements(FieldItemListInterface $items, $langcode) { // A date without time will pick up the current time, use the default. datetime_date_default_time($date); } - else { - } - $this->setTimeZone($date); $output = $this->formatDate($date); } + + if (!empty($item->date2)) { + /** @var \Drupal\Core\Datetime\DrupalDateTime $date */ + $date2 = $item->date2; + + if ($this->getFieldSetting('datetime_type') == 'date') { + // A date without time will pick up the current time, use the default. + datetime_date_default_time($date2); + } + + $output = $this->t('@date to @date2', [ + '@date' => $this->formatDate($date), + '@date2' => $this->formatDate($date2), + ]); + } + $elements[$delta] = [ '#cache' => [ 'contexts' => [ diff --git a/core/modules/datetime/src/Plugin/Field/FieldType/DateTimeItem.php b/core/modules/datetime/src/Plugin/Field/FieldType/DateTimeItem.php index 912bea2..119e381 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldType/DateTimeItem.php +++ b/core/modules/datetime/src/Plugin/Field/FieldType/DateTimeItem.php @@ -51,29 +51,29 @@ public static function defaultStorageSettings() { * {@inheritdoc} */ public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) { + $has_end = $field_definition->getSetting('enddate_get'); + $properties['value'] = DataDefinition::create('datetime_iso8601') - ->setLabel(t('Date value (start)')) + ->setLabel($has_end ? t('Date value (start)') : t('Date value')) ->setRequired(TRUE); $properties['date'] = DataDefinition::create('any') - ->setLabel(t('Computed date (start)')) + ->setLabel($has_end ? t('Computed date (start)') : t('Computed date')) ->setDescription(t('The computed start DateTime object.')) ->setComputed(TRUE) ->setClass('\Drupal\datetime\DateTimeComputed') ->setSetting('date source', 'value'); - if ($field_definition->getSetting('enddate_get')) { - $properties['value2'] = DataDefinition::create('datetime_iso8601') - ->setLabel(t('Date value (end)')) - ->setRequired(TRUE); - - $properties['date2'] = DataDefinition::create('any') - ->setLabel(t('Computed date (end)')) - ->setDescription(t('The computed end DateTime object.')) - ->setComputed(TRUE) - ->setClass('\Drupal\datetime\DateTimeComputed') - ->setSetting('date source', 'value2'); - } + $properties['value2'] = DataDefinition::create('datetime_iso8601') + ->setLabel(t('Date value (end)')) + ->setRequired($has_end); + + $properties['date2'] = DataDefinition::create('any') + ->setLabel(t('Computed date (end)')) + ->setDescription(t('The computed end DateTime object.')) + ->setComputed(TRUE) + ->setClass('\Drupal\datetime\DateTimeComputed') + ->setSetting('date source', 'value2'); return $properties; } @@ -89,21 +89,18 @@ public static function schema(FieldStorageDefinitionInterface $field_definition) 'type' => 'varchar', 'length' => 20, ), + 'value2' => array( + 'description' => 'The end date value.', + 'type' => 'varchar', + 'length' => 20, + ), ), 'indexes' => array( 'value' => array('value'), + 'value2' => array('value2'), ), ); - if ($field_definition->getSetting('enddate_get')) { - $schema['columns']['value2'] = array( - 'description' => 'The end date value.', - 'type' => 'varchar', - 'length' => 20, - ); - $schema['indexes']['value2'] = array('value2'); - } - return $schema; } @@ -147,13 +144,13 @@ public static function generateSampleValue(FieldDefinitionInterface $field_defin if ($type == DateTimeItem::DATETIME_TYPE_DATE) { $values['value'] = gmdate(DATETIME_DATE_STORAGE_FORMAT, $timestamp); if ($collect_end_date) { - $values['value2'] = gmdate(DATETIME_DATE_STORAGE_FORMAT, $timestamp); + $values['value2'] = gmdate(DATETIME_DATE_STORAGE_FORMAT, $timestamp + 86400); } } else { $values['value'] = gmdate(DATETIME_DATETIME_STORAGE_FORMAT, $timestamp); if ($collect_end_date) { - $values['value2'] = gmdate(DATETIME_DATETIME_STORAGE_FORMAT, $timestamp); + $values['value2'] = gmdate(DATETIME_DATETIME_STORAGE_FORMAT, $timestamp + 86400); } } return $values;