diff --git a/core/modules/datetime/config/schema/datetime.schema.yml b/core/modules/datetime/config/schema/datetime.schema.yml index 4a3ed9d..b600660 100644 --- a/core/modules/datetime/config/schema/datetime.schema.yml +++ b/core/modules/datetime/config/schema/datetime.schema.yml @@ -92,7 +92,7 @@ field.storage_settings.daterange: type: mapping label: 'Date range settings' mapping: - daterange_type: + datetime_type: type: string label: 'Date type' @@ -104,10 +104,10 @@ field.value.daterange: type: mapping label: 'Default value' mapping: - default_start_date_type: + default_date_type: type: string label: 'Default start date type' - default_start_date: + default_date: type: string label: 'Default start date value' default_end_date_type: diff --git a/core/modules/datetime/src/DateTimeComputed.php b/core/modules/datetime/src/DateTimeComputed.php index 1a19a7a..6b33161 100644 --- a/core/modules/datetime/src/DateTimeComputed.php +++ b/core/modules/datetime/src/DateTimeComputed.php @@ -43,9 +43,8 @@ public function getValue($langcode = NULL) { /** @var \Drupal\Core\Field\FieldItemInterface $item */ $item = $this->getParent(); $value = $item->{($this->definition->getSetting('date source'))}; - $type = $item->getFieldDefinition()->getType(); - $storage_format = $item->getFieldDefinition()->getSetting($type . '_type') == 'date' ? DATETIME_DATE_STORAGE_FORMAT : DATETIME_DATETIME_STORAGE_FORMAT; + $storage_format = $item->getFieldDefinition()->getSetting('datetime_type') == 'date' ? DATETIME_DATE_STORAGE_FORMAT : DATETIME_DATETIME_STORAGE_FORMAT; try { $date = DrupalDateTime::createFromFormat($storage_format, $value, DATETIME_STORAGE_TIMEZONE); if ($date instanceof DrupalDateTime && !$date->hasErrors()) { diff --git a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangeCustomFormatter.php b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangeCustomFormatter.php index 6fa9555..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('daterange_type') == DateRangeItem::DATERANGE_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 24eb436..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('daterange_type') == DateRangeItem::DATERANGE_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 bc2f17a..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('daterange_type') === DateRangeItem::DATERANGE_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 91c0560..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('daterange_type') == DateRangeItem::DATERANGE_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('daterange_type') == DateRangeItem::DATERANGE_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; + } + } diff --git a/core/modules/datetime/src/Plugin/Field/FieldType/DateRangeFieldItemList.php b/core/modules/datetime/src/Plugin/Field/FieldType/DateRangeFieldItemList.php index d6dbf7d..f04efb1 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldType/DateRangeFieldItemList.php +++ b/core/modules/datetime/src/Plugin/Field/FieldType/DateRangeFieldItemList.php @@ -11,17 +11,7 @@ /** * Represents a configurable entity daterange field. */ -class DateRangeFieldItemList extends FieldItemList { - - /** - * Defines the default value as now. - */ - const DEFAULT_VALUE_NOW = 'now'; - - /** - * Defines the default value as relative. - */ - const DEFAULT_VALUE_CUSTOM = 'relative'; +class DateRangeFieldItemList extends DateTimeFieldItemList { /** * {@inheritdoc} @@ -30,50 +20,31 @@ public function defaultValuesForm(array &$form, FormStateInterface $form_state) if (empty($this->getFieldDefinition()->getDefaultValueCallback())) { $default_value = $this->getFieldDefinition()->getDefaultValueLiteral(); - $element = [ - '#parents' => ['default_value_input'], - 'default_start_date_type' => [ - '#type' => 'select', - '#title' => $this->t('Default start date'), - '#description' => $this->t('Set a default value for the start date.'), - '#default_value' => isset($default_value[0]['default_start_date_type']) ? $default_value[0]['default_start_date_type'] : '', - '#options' => [ - static::DEFAULT_VALUE_NOW => $this->t('Current date'), - static::DEFAULT_VALUE_CUSTOM => $this->t('Relative date'), - ], - '#empty_value' => '', - ], - 'default_start_date' => [ - '#type' => 'textfield', - '#title' => $this->t('Relative default value'), - '#description' => $this->t("Describe a time by reference to the current day, like '+90 days' (90 days from the day the field is created) or '+1 Saturday' (the next Saturday). See strtotime for more details."), - '#default_value' => (isset($default_value[0]['default_start_date_type']) && $default_value[0]['default_start_date_type'] == static::DEFAULT_VALUE_CUSTOM) ? $default_value[0]['default_start_date'] : '', - '#states' => [ - 'visible' => [ - ':input[id="edit-default-value-input-default-start-date-type"]' => ['value' => static::DEFAULT_VALUE_CUSTOM], - ], - ], - ], - 'default_end_date_type' => [ - '#type' => 'select', - '#title' => $this->t('Default end date'), - '#description' => $this->t('Set a default value for the end date.'), - '#default_value' => isset($default_value[0]['default_end_date_type']) ? $default_value[0]['default_end_date_type'] : '', - '#options' => [ - static::DEFAULT_VALUE_NOW => $this->t('Current date'), - static::DEFAULT_VALUE_CUSTOM => $this->t('Relative date'), - ], - '#empty_value' => '', + $element = parent::defaultValuesForm($form, $form_state); + + $element['default_date_type']['#title'] = $this->t('Default start date'); + $element['default_date_type']['#description'] = $this->t('Set a default value for the start date.'); + + $element['default_end_date_type'] = [ + '#type' => 'select', + '#title' => $this->t('Default end date'), + '#description' => $this->t('Set a default value for the end date.'), + '#default_value' => isset($default_value[0]['default_end_date_type']) ? $default_value[0]['default_end_date_type'] : '', + '#options' => [ + static::DEFAULT_VALUE_NOW => $this->t('Current date'), + static::DEFAULT_VALUE_CUSTOM => $this->t('Relative date'), ], - 'default_end_date' => [ - '#type' => 'textfield', - '#title' => $this->t('Relative default value'), - '#description' => $this->t("Describe a time by reference to the current day, like '+90 days' (90 days from the day the field is created) or '+1 Saturday' (the next Saturday). See strtotime for more details."), - '#default_value' => (isset($default_value[0]['default_end_date_type']) && $default_value[0]['default_end_date_type'] == static::DEFAULT_VALUE_CUSTOM) ? $default_value[0]['default_end_date'] : '', - '#states' => [ - 'visible' => [ - ':input[id="edit-default-value-input-default-end-date-type"]' => ['value' => static::DEFAULT_VALUE_CUSTOM], - ], + '#empty_value' => '', + ]; + + $element['default_end_date'] = [ + '#type' => 'textfield', + '#title' => $this->t('Relative default value'), + '#description' => $this->t("Describe a time by reference to the current day, like '+90 days' (90 days from the day the field is created) or '+1 Saturday' (the next Saturday). See strtotime for more details."), + '#default_value' => (isset($default_value[0]['default_end_date_type']) && $default_value[0]['default_end_date_type'] == static::DEFAULT_VALUE_CUSTOM) ? $default_value[0]['default_end_date'] : '', + '#states' => [ + 'visible' => [ + ':input[id="edit-default-value-input-default-end-date-type"]' => ['value' => static::DEFAULT_VALUE_CUSTOM], ], ], ]; @@ -86,10 +57,10 @@ public function defaultValuesForm(array &$form, FormStateInterface $form_state) * {@inheritdoc} */ public function defaultValuesFormValidate(array $element, array &$form, FormStateInterface $form_state) { - if ($form_state->getValue(['default_value_input', 'default_start_date_type']) == static::DEFAULT_VALUE_CUSTOM) { - $is_strtotime = @strtotime($form_state->getValue(['default_value_input', 'default_start_date'])); + if ($form_state->getValue(['default_value_input', 'default_date_type']) == static::DEFAULT_VALUE_CUSTOM) { + $is_strtotime = @strtotime($form_state->getValue(['default_value_input', 'default_date'])); if (!$is_strtotime) { - $form_state->setErrorByName('default_value_input][default_start_date', $this->t('The relative start date value entered is invalid.')); + $form_state->setErrorByName('default_value_input][default_date', $this->t('The relative start date value entered is invalid.')); } } @@ -105,9 +76,9 @@ public function defaultValuesFormValidate(array $element, array &$form, FormStat * {@inheritdoc} */ public function defaultValuesFormSubmit(array $element, array &$form, FormStateInterface $form_state) { - if ($form_state->getValue(['default_value_input', 'default_start_date_type']) && $form_state->getValue(['default_value_input', 'default_end_date_type'])) { - if ($form_state->getValue(['default_value_input', 'default_start_date_type']) == static::DEFAULT_VALUE_NOW) { - $form_state->setValueForElement($element['default_start_date'], static::DEFAULT_VALUE_NOW); + if ($form_state->getValue(['default_value_input', 'default_date_type']) || $form_state->getValue(['default_value_input', 'default_end_date_type'])) { + if ($form_state->getValue(['default_value_input', 'default_date_type']) == static::DEFAULT_VALUE_NOW) { + $form_state->setValueForElement($element['default_date'], static::DEFAULT_VALUE_NOW); } if ($form_state->getValue(['default_value_input', 'default_end_date_type']) == static::DEFAULT_VALUE_NOW) { $form_state->setValueForElement($element['default_end_date'], static::DEFAULT_VALUE_NOW); @@ -121,28 +92,36 @@ public function defaultValuesFormSubmit(array $element, array &$form, FormStateI * {@inheritdoc} */ public static function processDefaultValue($default_value, FieldableEntityInterface $entity, FieldDefinitionInterface $definition) { - $default_value = parent::processDefaultValue($default_value, $entity, $definition); + // Explicitly call the base class so tht we can get the default value types. + $default_value = FieldItemList::processDefaultValue($default_value, $entity, $definition); - if (isset($default_value[0]['default_start_date_type']) && isset($default_value[0]['default_end_date_type'])) { + // Allow either the start or end date to have a default, but not the other. + if (!empty($default_value[0]['default_date_type']) || !empty($default_value[0]['default_end_date_type'])) { // A default value should be in the format and timezone used for date - // storage. All-day ranges are stored the same as date+time ranges. - $storage_format = $definition->getSetting('daterange_type') == DateRangeItem::DATERANGE_TYPE_DATE ? DATETIME_DATE_STORAGE_FORMAT : DATETIME_DATETIME_STORAGE_FORMAT; - $start_date = new DrupalDateTime($default_value[0]['default_start_date'], DATETIME_STORAGE_TIMEZONE); - $start_value = $start_date->format($storage_format); - $end_date = new DrupalDateTime($default_value[0]['default_end_date'], DATETIME_STORAGE_TIMEZONE); - $end_value = $end_date->format($storage_format); - // We only provide a default value for the first item, as do all fields. + // storage. All-day ranges are stored the same as date+time ranges. We + // only provide a default value for the first item, as do all fields. // Otherwise, there is no way to clear out unwanted values on multiple // value fields. - $default_value = [ - [ - 'value' => $start_value, - 'start_date' => $start_date, - 'value2' => $end_value, - 'end_date' => $end_date, - ], - ]; + $storage_format = $definition->getSetting('datetime_type') == DateRangeItem::DATETIME_TYPE_DATE ? DATETIME_DATE_STORAGE_FORMAT : DATETIME_DATETIME_STORAGE_FORMAT; + $default_values = [[]]; + + if (!empty($default_value[0]['default_date_type'])) { + $start_date = new DrupalDateTime($default_value[0]['default_date'], DATETIME_STORAGE_TIMEZONE); + $start_value = $start_date->format($storage_format); + $default_values[0]['value'] = $start_value; + $default_values[0]['start_date'] = $start_date; + } + + if (!empty($default_value[0]['default_end_date_type'])) { + $end_date = new DrupalDateTime($default_value[0]['default_end_date'], DATETIME_STORAGE_TIMEZONE); + $end_value = $end_date->format($storage_format); + $default_values[0]['end_value'] = $end_value; + $default_values[0]['end_date'] = $end_date; + } + + $default_value = $default_values; } + return $default_value; } diff --git a/core/modules/datetime/src/Plugin/Field/FieldType/DateRangeItem.php b/core/modules/datetime/src/Plugin/Field/FieldType/DateRangeItem.php index d95f2f9..3ab96ad 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldType/DateRangeItem.php +++ b/core/modules/datetime/src/Plugin/Field/FieldType/DateRangeItem.php @@ -6,7 +6,6 @@ use Drupal\Core\Field\FieldStorageDefinitionInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\TypedData\DataDefinition; -use Drupal\Core\Field\FieldItemBase; use Drupal\datetime\DateTimeComputed; /** @@ -21,31 +20,12 @@ * list_class = "\Drupal\datetime\Plugin\Field\FieldType\DateRangeFieldItemList" * ) */ -class DateRangeItem extends FieldItemBase { +class DateRangeItem extends DateTimeItem { /** - * {@inheritdoc} - */ - public static function defaultStorageSettings() { - return [ - 'daterange_type' => 'datetime', - ] + parent::defaultStorageSettings(); - } - - /** - * Value for the 'daterange_type' setting: store only a date. - */ - const DATERANGE_TYPE_DATE = 'date'; - - /** - * Value for the 'daterange_type' setting: store a date and time. - */ - const DATERANGE_TYPE_DATETIME = 'datetime'; - - /** - * Value for the 'daterange_type' setting: store a date and time. + * Value for the 'datetime_type' setting: store a date and time. */ - const DATERANGE_TYPE_ALLDAY = 'allday'; + const DATETIME_TYPE_ALLDAY = 'allday'; /** * {@inheritdoc} @@ -62,7 +42,7 @@ public static function propertyDefinitions(FieldStorageDefinitionInterface $fiel ->setClass(DateTimeComputed::class) ->setSetting('date source', 'value'); - $properties['value2'] = DataDefinition::create('datetime_iso8601') + $properties['end_value'] = DataDefinition::create('datetime_iso8601') ->setLabel(t('End date value')) ->setRequired(TRUE); @@ -71,7 +51,7 @@ public static function propertyDefinitions(FieldStorageDefinitionInterface $fiel ->setDescription(t('The computed end DateTime object.')) ->setComputed(TRUE) ->setClass(DateTimeComputed::class) - ->setSetting('date source', 'value2'); + ->setSetting('date source', 'end_value'); return $properties; } @@ -80,44 +60,26 @@ public static function propertyDefinitions(FieldStorageDefinitionInterface $fiel * {@inheritdoc} */ public static function schema(FieldStorageDefinitionInterface $field_definition) { - return [ - 'columns' => [ - 'value' => [ - 'description' => 'The start date value.', - 'type' => 'varchar', - 'length' => 20, - ], - 'value2' => [ - 'description' => 'The end date value.', - 'type' => 'varchar', - 'length' => 20, - ], - ], - 'indexes' => [ - 'value' => ['value'], - 'value2' => ['value2'], - ], - ]; + $schema = parent::schema($field_definition); + + $schema['columns']['value']['description'] = 'The start date value.'; + + $schema['columns']['end_value'] = [ + 'description' => 'The end date value.', + ] + $schema['columns']['value']; + + $schema['indexes']['end_value'] = ['end_value']; + + return $schema; } /** * {@inheritdoc} */ public function storageSettingsForm(array &$form, FormStateInterface $form_state, $has_data) { - $element = []; - - $element['daterange_type'] = [ - '#type' => 'select', - '#title' => $this->t('Date type'), - '#description' => $this->t('Choose the type of date to create.'), - '#default_value' => $this->getSetting('daterange_type'), - '#options' => [ - static::DATERANGE_TYPE_DATETIME => $this->t('Date and time'), - static::DATERANGE_TYPE_DATE => $this->t('Date only'), - static::DATERANGE_TYPE_ALLDAY => $this->t('All Day'), - ], - '#disabled' => $has_data, - ]; + $element = parent::storageSettingsForm($form, $form_state, $has_data); + + $element['datetime_type']['#options'][static::DATETIME_TYPE_ALLDAY] = $this->t('All Day'); return $element; } @@ -126,23 +88,19 @@ public function storageSettingsForm(array &$form, FormStateInterface $form_state * {@inheritdoc} */ public static function generateSampleValue(FieldDefinitionInterface $field_definition) { - $type = $field_definition->getSetting('daterange_type'); + $type = $field_definition->getSetting('datetime_type'); // Just pick a date in the past year. No guidance is provided by this Field // type. $start = REQUEST_TIME - mt_rand(0, 86400 * 365) - 86400; $end = $start + 86400; - if ($type == static::DATERANGE_TYPE_DATE) { - $values['value'] = gmdate(DATETIME_DATE_STORAGE_FORMAT, $start); - $values['value2'] = gmdate(DATETIME_DATE_STORAGE_FORMAT, $end); - } - elseif ($type == static::DATERANGE_TYPE_ALLDAY) { - $values['value'] = gmdate(DATETIME_DATE_STORAGE_FORMAT, $start); - $values['value2'] = gmdate(DATETIME_DATE_STORAGE_FORMAT, $end); + if ($type == static::DATETIME_TYPE_DATETIME) { + $values['value'] = gmdate(DATETIME_DATETIME_STORAGE_FORMAT, $start); + $values['end_value'] = gmdate(DATETIME_DATETIME_STORAGE_FORMAT, $end); } else { - $values['value'] = gmdate(DATETIME_DATETIME_STORAGE_FORMAT, $start); - $values['value2'] = gmdate(DATETIME_DATETIME_STORAGE_FORMAT, $end); + $values['value'] = gmdate(DATETIME_DATE_STORAGE_FORMAT, $start); + $values['end_value'] = gmdate(DATETIME_DATE_STORAGE_FORMAT, $end); } return $values; } @@ -152,7 +110,7 @@ public static function generateSampleValue(FieldDefinitionInterface $field_defin */ public function isEmpty() { $start_value = $this->get('value')->getValue(); - $end_value = $this->get('value2')->getValue(); + $end_value = $this->get('end_value')->getValue(); return ($start_value === NULL || $start_value === '') && ($end_value === NULL || $end_value === ''); } @@ -164,7 +122,7 @@ public function onChange($property_name, $notify = TRUE) { if ($property_name == 'value') { $this->start_date = NULL; } - elseif ($property_name == 'value2') { + elseif ($property_name == 'end_value') { $this->end_date = NULL; } parent::onChange($property_name, $notify); diff --git a/core/modules/datetime/src/Plugin/Field/FieldWidget/DateRangeDatelistWidget.php b/core/modules/datetime/src/Plugin/Field/FieldWidget/DateRangeDatelistWidget.php index d538f3b..65e8edd 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldWidget/DateRangeDatelistWidget.php +++ b/core/modules/datetime/src/Plugin/Field/FieldWidget/DateRangeDatelistWidget.php @@ -38,7 +38,7 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen $date_order = $this->getSetting('date_order'); - if ($this->getFieldSetting('daterange_type') == DateRangeItem::DATERANGE_TYPE_DATETIME) { + if ($this->getFieldSetting('datetime_type') == DateRangeItem::DATETIME_TYPE_DATETIME) { $time_type = $this->getSetting('time_type'); $increment = $this->getSetting('increment'); } @@ -81,11 +81,11 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen '#date_part_order' => $date_part_order, ] + $element['value']; - $element['value2'] = [ + $element['end_value'] = [ '#type' => 'datelist', '#date_increment' => $increment, '#date_part_order' => $date_part_order, - ] + $element['value2']; + ] + $element['end_value']; return $element; } @@ -103,7 +103,7 @@ function settingsForm(array $form, FormStateInterface $form_state) { '#options' => ['MDY' => $this->t('Month/Day/Year'), 'DMY' => $this->t('Day/Month/Year'), 'YMD' => $this->t('Year/Month/Day')], ]; - if ($this->getFieldSetting('daterange_type') == DateRangeItem::DATERANGE_TYPE_DATETIME) { + if ($this->getFieldSetting('datetime_type') == DateRangeItem::DATETIME_TYPE_DATETIME) { $element['time_type'] = [ '#type' => 'select', '#title' => $this->t('Time type'), @@ -146,7 +146,7 @@ public function settingsSummary() { $summary = []; $summary[] = $this->t('Date part order: @order', ['@order' => $this->getSetting('date_order')]); - if ($this->getFieldSetting('daterange_type') == DateRangeItem::DATERANGE_TYPE_DATETIME) { + if ($this->getFieldSetting('datetime_type') == DateRangeItem::DATETIME_TYPE_DATETIME) { $summary[] = $this->t('Time type: @time_type', ['@time_type' => $this->getSetting('time_type')]); $summary[] = $this->t('Time increments: @increment', ['@increment' => $this->getSetting('increment')]); } diff --git a/core/modules/datetime/src/Plugin/Field/FieldWidget/DateRangeDefaultWidget.php b/core/modules/datetime/src/Plugin/Field/FieldWidget/DateRangeDefaultWidget.php index 7d5cb8c..bd311d2 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldWidget/DateRangeDefaultWidget.php +++ b/core/modules/datetime/src/Plugin/Field/FieldWidget/DateRangeDefaultWidget.php @@ -60,15 +60,9 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen $element = parent::formElement($items, $delta, $element, $form, $form_state); // Identify the type of date and time elements to use. - switch ($this->getFieldSetting('daterange_type')) { - case DateRangeItem::DATERANGE_TYPE_DATE: - $date_type = 'date'; - $time_type = 'none'; - $date_format = $this->dateStorage->load('html_date')->getPattern(); - $time_format = ''; - break; - - case DateRangeItem::DATERANGE_TYPE_ALLDAY: + switch ($this->getFieldSetting('datetime_type')) { + case DateRangeItem::DATETIME_TYPE_DATE: + case DateRangeItem::DATETIME_TYPE_ALLDAY: $date_type = 'date'; $time_type = 'none'; $date_format = $this->dateStorage->load('html_date')->getPattern(); @@ -92,7 +86,7 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen '#date_time_callbacks' => [], ]; - $element['value2'] += [ + $element['end_value'] += [ '#date_date_format' => $date_format, '#date_date_element' => $date_type, '#date_date_callbacks' => [], diff --git a/core/modules/datetime/src/Plugin/Field/FieldWidget/DateRangeWidgetBase.php b/core/modules/datetime/src/Plugin/Field/FieldWidget/DateRangeWidgetBase.php index d8349be..ce0964d 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldWidget/DateRangeWidgetBase.php +++ b/core/modules/datetime/src/Plugin/Field/FieldWidget/DateRangeWidgetBase.php @@ -4,80 +4,36 @@ use Drupal\Core\Datetime\DrupalDateTime; use Drupal\Core\Field\FieldItemListInterface; -use Drupal\Core\Field\WidgetBase; use Drupal\Core\Form\FormStateInterface; use Drupal\datetime\Plugin\Field\FieldType\DateRangeItem; /** * Base class for the 'daterange_*' widgets. */ -class DateRangeWidgetBase extends WidgetBase { +class DateRangeWidgetBase extends DateTimeWidgetBase { /** * {@inheritdoc} */ public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) { - // We are nesting some sub-elements inside the parent, so we need a wrapper. - // We also need to add another #title attribute at the top level for ease in - // identifying this item in error messages. We do not want to display this - // title because the actual title display is handled at a higher level by - // the Field module. - - $element['#theme_wrappers'][] = 'datetime_wrapper'; - $element['#attributes']['class'][] = 'container-inline'; + $element = parent::formElement($items, $delta, $element, $form, $form_state); $element['#element_validate'][] = [$this, 'validateStartEnd']; + $element['value']['#title'] = $this->t('Start'); - $element['value'] = [ - '#title' => $this->t('Start'), - '#type' => 'datetime', - '#default_value' => NULL, - '#date_increment' => 1, - '#date_timezone' => drupal_get_user_timezone(), - '#required' => $element['#required'], - ]; - - $element['value2'] = [ + $element['end_value'] = [ '#title' => $this->t('End'), - '#type' => 'datetime', - '#default_value' => NULL, - '#date_increment' => 1, - '#date_timezone' => drupal_get_user_timezone(), - '#required' => $element['#required'], - ]; - - if ($this->getFieldSetting('daterange_type') == DateRangeItem::DATERANGE_TYPE_DATE) { - // A date-only field should have no timezone conversion performed, so - // use the same timezone as for storage. - $element['value']['#date_timezone'] = DATETIME_STORAGE_TIMEZONE; - $element['value2']['#date_timezone'] = DATETIME_STORAGE_TIMEZONE; - } + ] + $element['value']; if ($items[$delta]->start_date) { /** @var \Drupal\Core\Datetime\DrupalDateTime $start_date */ $start_date = $items[$delta]->start_date; - // The date was created and verified during field_load(), so it is safe to - // use without further inspection. - if ($this->getFieldSetting('daterange_type') == DateRangeItem::DATERANGE_TYPE_DATE) { - // A date without time will pick up the current time, use the default - // time. - datetime_date_default_time($start_date); - } - $start_date->setTimezone(new \DateTimeZone($element['value']['#date_timezone'])); - $element['value']['#default_value'] = $start_date; + $element['value']['#default_value'] = $this->createDefaultValue($start_date, $element['value']['#date_timezone']); } if ($items[$delta]->end_date) { - /** @var \Drupal\Core\Datetime\DrupalDateTime $start_date */ + /** @var \Drupal\Core\Datetime\DrupalDateTime $end_date */ $end_date = $items[$delta]->end_date; - // The date was created and verified during field_load(), so it is safe to - // use without further inspection. - if ($this->getFieldSetting('daterange_type') == DateRangeItem::DATERANGE_TYPE_DATE) { - // A date without time will pick up the current time, use the default - // time. - datetime_date_default_time($end_date); - } - $end_date->setTimezone(new \DateTimeZone($element['value2']['#date_timezone'])); - $element['value2']['#default_value'] = $end_date; + $element['end_value']['#default_value'] = $this->createDefaultValue($end_date, $element['end_value']['#date_timezone']); } return $element; @@ -94,16 +50,16 @@ public function massageFormValues(array $values, array $form, FormStateInterface if (!empty($item['value']) && $item['value'] instanceof DrupalDateTime) { /** @var \Drupal\Core\Datetime\DrupalDateTime $start_date */ $start_date = $item['value']; - switch ($this->getFieldSetting('daterange_type')) { - case DateRangeItem::DATERANGE_TYPE_DATE: + switch ($this->getFieldSetting('datetime_type')) { + case DateRangeItem::DATETIME_TYPE_DATE: // If this is a date-only field, set it to the default time so the // timezone conversion can be reversed. datetime_date_default_time($start_date); $format = DATETIME_DATE_STORAGE_FORMAT; break; - case DateRangeItem::DATERANGE_TYPE_ALLDAY: - // All day field start at midnight on the starting date, but are + case DateRangeItem::DATETIME_TYPE_ALLDAY: + // All day fields start at midnight on the starting date, but are // stored like datetime fields, so we need to adjust the time. // This function is called twice, so to prevent a double conversion // we need to explicitly set the timezone. @@ -121,19 +77,19 @@ public function massageFormValues(array $values, array $form, FormStateInterface $item['value'] = $start_date->format($format); } - if (!empty($item['value2']) && $item['value2'] instanceof DrupalDateTime) { + if (!empty($item['end_value']) && $item['end_value'] instanceof DrupalDateTime) { /** @var \Drupal\Core\Datetime\DrupalDateTime $end_date */ - $end_date = $item['value2']; - switch ($this->getFieldSetting('daterange_type')) { - case DateRangeItem::DATERANGE_TYPE_DATE: + $end_date = $item['end_value']; + switch ($this->getFieldSetting('datetime_type')) { + case DateRangeItem::DATETIME_TYPE_DATE: // If this is a date-only field, set it to the default time so the // timezone conversion can be reversed. datetime_date_default_time($end_date); $format = DATETIME_DATE_STORAGE_FORMAT; break; - case DateRangeItem::DATERANGE_TYPE_ALLDAY: - // All day field end at midnight on the end date, but are + case DateRangeItem::DATETIME_TYPE_ALLDAY: + // All day fields end at midnight on the end date, but are // stored like datetime fields, so we need to adjust the time. // This function is called twice, so to prevent a double conversion // we need to explicitly set the timezone. @@ -148,7 +104,7 @@ public function massageFormValues(array $values, array $form, FormStateInterface } // Adjust the date for storage. $end_date->setTimezone(new \DateTimezone(DATETIME_STORAGE_TIMEZONE)); - $item['value2'] = $end_date->format($format); + $item['end_value'] = $end_date->format($format); } } @@ -168,7 +124,7 @@ public function massageFormValues(array $values, array $form, FormStateInterface */ public function validateStartEnd(&$element, FormStateInterface $form_state, &$complete_form) { $start_date = $element['value']['#value']['object']; - $end_date = $element['value2']['#value']['object']; + $end_date = $element['end_value']['#value']['object']; if ($start_date instanceof DrupalDateTime && $end_date instanceof DrupalDateTime) { if ($start_date->format('U') !== $end_date->format('U')) { diff --git a/core/modules/datetime/src/Plugin/Field/FieldWidget/DateTimeWidgetBase.php b/core/modules/datetime/src/Plugin/Field/FieldWidget/DateTimeWidgetBase.php index aa6175a..054d3e0 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldWidget/DateTimeWidgetBase.php +++ b/core/modules/datetime/src/Plugin/Field/FieldWidget/DateTimeWidgetBase.php @@ -41,16 +41,9 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen } if ($items[$delta]->date) { + /** @var \Drupal\Core\Datetime\DrupalDateTime $date */ $date = $items[$delta]->date; - // The date was created and verified during field_load(), so it is safe to - // use without further inspection. - if ($this->getFieldSetting('datetime_type') == DateTimeItem::DATETIME_TYPE_DATE) { - // A date without time will pick up the current time, use the default - // time. - datetime_date_default_time($date); - } - $date->setTimezone(new \DateTimeZone($element['value']['#date_timezone'])); - $element['value']['#default_value'] = $date; + $element['value']['#default_value'] = $this->createDefaultValue($date, $element['value']['#date_timezone']); } return $element; @@ -86,4 +79,30 @@ public function massageFormValues(array $values, array $form, FormStateInterface return $values; } + /** + * Creates a date object for use as a default value. + * + * This will take a default value, apply the proper timezone for display in + * a widget, and set the default time for date-only fields. + * + * @param \Drupal\Core\Datetime\DrupalDateTime $date + * The UTC default date. + * @param string $timezone + * The timezone to apply. + * + * @return \Drupal\Core\Datetime\DrupalDateTime + * A date object for use as a default value in a field widget. + */ + protected function createDefaultValue($date, $timezone) { + // The date was created and verified during field_load(), so it is safe to + // use without further inspection. + if ($this->getFieldSetting('datetime_type') == DateTimeItem::DATETIME_TYPE_DATE) { + // A date without time will pick up the current time, use the default + // time. + datetime_date_default_time($date); + } + $date->setTimezone(new \DateTimeZone($timezone)); + return $date; + } + } diff --git a/core/modules/datetime/src/Tests/DateRangeFieldTest.php b/core/modules/datetime/src/Tests/DateRangeFieldTest.php index 7e90d90..be31cbe 100644 --- a/core/modules/datetime/src/Tests/DateRangeFieldTest.php +++ b/core/modules/datetime/src/Tests/DateRangeFieldTest.php @@ -105,7 +105,7 @@ protected function setUp() { 'field_name' => $field_name, 'entity_type' => 'entity_test', 'type' => 'daterange', - 'settings' => ['daterange_type' => DateRangeItem::DATERANGE_TYPE_DATE], + 'settings' => ['datetime_type' => DateRangeItem::DATETIME_TYPE_DATE], ]); $this->fieldStorage->save(); $this->field = FieldConfig::create([ @@ -151,22 +151,22 @@ public function testDateRangeField() { $this->setSiteTimezone($timezone); // Ensure field is set to a date-only field. - $this->fieldStorage->setSetting('daterange_type', DateRangeItem::DATERANGE_TYPE_DATE); + $this->fieldStorage->setSetting('datetime_type', DateRangeItem::DATETIME_TYPE_DATE); $this->fieldStorage->save(); // Display creation form. $this->drupalGet('entity_test/add'); $this->assertFieldByName("{$field_name}[0][value][date]", '', 'Start date element found.'); - $this->assertFieldByName("{$field_name}[0][value2][date]", '', 'End date element found.'); + $this->assertFieldByName("{$field_name}[0][end_value][date]", '', 'End date element found.'); $this->assertFieldByXPath('//*[@id="edit-' . $field_name . '-wrapper"]/h4[contains(@class, "js-form-required")]', TRUE, 'Required markup found'); $this->assertNoFieldByName("{$field_name}[0][value][time]", '', 'Start time element not found.'); - $this->assertNoFieldByName("{$field_name}[0][value2][time]", '', 'End time element not found.'); + $this->assertNoFieldByName("{$field_name}[0][end_value][time]", '', 'End time element not found.'); // Build up dates in the UTC timezone. $value = '2012-12-31 00:00:00'; $start_date = new DrupalDateTime($value, 'UTC'); - $value2 = '2013-06-06 00:00:00'; - $end_date = new DrupalDateTime($value2, 'UTC'); + $end_value = '2013-06-06 00:00:00'; + $end_date = new DrupalDateTime($end_value, 'UTC'); // Submit a valid date and ensure it is accepted. $date_format = DateFormat::load('html_date')->getPattern(); @@ -174,7 +174,7 @@ public function testDateRangeField() { $edit = array( "{$field_name}[0][value][date]" => $start_date->format($date_format), - "{$field_name}[0][value2][date]" => $end_date->format($date_format), + "{$field_name}[0][end_value][date]" => $end_date->format($date_format), ); $this->drupalPostForm(NULL, $edit, t('Save')); preg_match('|entity_test/manage/(\d+)|', $this->url, $match); @@ -188,7 +188,7 @@ public function testDateRangeField() { // Verify the date doesn't change when entity is edited through the form. $entity = EntityTest::load($id); $this->assertEqual('2012-12-31', $entity->{$field_name}->value); - $this->assertEqual('2013-06-06', $entity->{$field_name}->value2); + $this->assertEqual('2013-06-06', $entity->{$field_name}->end_value); $this->drupalGet('entity_test/manage/' . $id . '/edit'); $this->drupalPostForm(NULL, [], t('Save')); $this->drupalGet('entity_test/manage/' . $id . '/edit'); @@ -197,7 +197,7 @@ public function testDateRangeField() { $this->drupalPostForm(NULL, [], t('Save')); $entity = EntityTest::load($id); $this->assertEqual('2012-12-31', $entity->{$field_name}->value); - $this->assertEqual('2013-06-06', $entity->{$field_name}->value2); + $this->assertEqual('2013-06-06', $entity->{$field_name}->end_value); // Formats that display a time component for date-only fields will display // the default time, so that is applied before calculating the expected @@ -266,21 +266,21 @@ public function testDatetimeRangeField() { $field_name = $this->fieldStorage->getName(); // Ensure the field to a datetime field. - $this->fieldStorage->setSetting('daterange_type', DateRangeItem::DATERANGE_TYPE_DATETIME); + $this->fieldStorage->setSetting('datetime_type', DateRangeItem::DATETIME_TYPE_DATETIME); $this->fieldStorage->save(); // Display creation form. $this->drupalGet('entity_test/add'); $this->assertFieldByName("{$field_name}[0][value][date]", '', 'Start date element found.'); $this->assertFieldByName("{$field_name}[0][value][time]", '', 'Start time element found.'); - $this->assertFieldByName("{$field_name}[0][value2][date]", '', 'End date element found.'); - $this->assertFieldByName("{$field_name}[0][value2][time]", '', 'End time element found.'); + $this->assertFieldByName("{$field_name}[0][end_value][date]", '', 'End date element found.'); + $this->assertFieldByName("{$field_name}[0][end_value][time]", '', 'End time element found.'); // Build up dates in the UTC timezone. $value = '2012-12-31 00:00:00'; $start_date = new DrupalDateTime($value, 'UTC'); - $value2 = '2013-06-06 00:00:00'; - $end_date = new DrupalDateTime($value2, 'UTC'); + $end_value = '2013-06-06 00:00:00'; + $end_date = new DrupalDateTime($end_value, 'UTC'); // Update the timezone to the system default. $start_date->setTimezone(timezone_open(drupal_get_user_timezone())); @@ -293,8 +293,8 @@ public function testDatetimeRangeField() { $edit = array( "{$field_name}[0][value][date]" => $start_date->format($date_format), "{$field_name}[0][value][time]" => $start_date->format($time_format), - "{$field_name}[0][value2][date]" => $end_date->format($date_format), - "{$field_name}[0][value2][time]" => $end_date->format($time_format), + "{$field_name}[0][end_value][date]" => $end_date->format($date_format), + "{$field_name}[0][end_value][time]" => $end_date->format($time_format), ); $this->drupalPostForm(NULL, $edit, t('Save')); preg_match('|entity_test/manage/(\d+)|', $this->url, $match); @@ -362,22 +362,22 @@ public function testAlldayRangeField() { $field_name = $this->fieldStorage->getName(); // Ensure field is set to a all-day field. - $this->fieldStorage->setSetting('daterange_type', DateRangeItem::DATERANGE_TYPE_ALLDAY); + $this->fieldStorage->setSetting('datetime_type', DateRangeItem::DATETIME_TYPE_ALLDAY); $this->fieldStorage->save(); // Display creation form. $this->drupalGet('entity_test/add'); $this->assertFieldByName("{$field_name}[0][value][date]", '', 'Start date element found.'); - $this->assertFieldByName("{$field_name}[0][value2][date]", '', 'End date element found.'); + $this->assertFieldByName("{$field_name}[0][end_value][date]", '', 'End date element found.'); $this->assertFieldByXPath('//*[@id="edit-' . $field_name . '-wrapper"]/h4[contains(@class, "js-form-required")]', TRUE, 'Required markup found'); $this->assertNoFieldByName("{$field_name}[0][value][time]", '', 'Start time element not found.'); - $this->assertNoFieldByName("{$field_name}[0][value2][time]", '', 'End time element not found.'); + $this->assertNoFieldByName("{$field_name}[0][end_value][time]", '', 'End time element not found.'); // Build up dates in the proper timezone. $value = '2012-12-31 00:00:00'; $start_date = new DrupalDateTime($value, timezone_open(drupal_get_user_timezone())); - $value2 = '2013-06-06 23:59:59'; - $end_date = new DrupalDateTime($value2, timezone_open(drupal_get_user_timezone())); + $end_value = '2013-06-06 23:59:59'; + $end_date = new DrupalDateTime($end_value, timezone_open(drupal_get_user_timezone())); // Submit a valid date and ensure it is accepted. $date_format = DateFormat::load('html_date')->getPattern(); @@ -385,7 +385,7 @@ public function testAlldayRangeField() { $edit = array( "{$field_name}[0][value][date]" => $start_date->format($date_format), - "{$field_name}[0][value2][date]" => $end_date->format($date_format), + "{$field_name}[0][end_value][date]" => $end_date->format($date_format), ); $this->drupalPostForm(NULL, $edit, t('Save')); preg_match('|entity_test/manage/(\d+)|', $this->url, $match); @@ -453,7 +453,7 @@ public function testDatelistWidget() { $field_name = $this->fieldStorage->getName(); // Ensure field is set to a date only field. - $this->fieldStorage->setSetting('daterange_type', DateRangeItem::DATERANGE_TYPE_DATE); + $this->fieldStorage->setSetting('datetime_type', DateRangeItem::DATETIME_TYPE_DATE); $this->fieldStorage->save(); // Change the widget to a datelist widget. @@ -473,8 +473,8 @@ public function testDatelistWidget() { // Assert that Hour and Minute Elements do not appear on Date Only $this->assertNoFieldByXPath("//*[@id=\"edit-$field_name-0-value-hour\"]", NULL, 'Hour element not found on Date Only.'); $this->assertNoFieldByXPath("//*[@id=\"edit-$field_name-0-value-minute\"]", NULL, 'Minute element not found on Date Only.'); - $this->assertNoFieldByXPath("//*[@id=\"edit-$field_name-0-value2-hour\"]", NULL, 'Hour element not found on Date Only.'); - $this->assertNoFieldByXPath("//*[@id=\"edit-$field_name-0-value2-minute\"]", NULL, 'Minute element not found on Date Only.'); + $this->assertNoFieldByXPath("//*[@id=\"edit-$field_name-0-end-value-hour\"]", NULL, 'Hour element not found on Date Only.'); + $this->assertNoFieldByXPath("//*[@id=\"edit-$field_name-0-end-value-minute\"]", NULL, 'Minute element not found on Date Only.'); // Go to the form display page to assert that increment option does not appear on Date Only $fieldEditUrl = 'entity_test/structure/entity_test/form-display'; @@ -486,7 +486,7 @@ public function testDatelistWidget() { $this->assertNoFieldByXPath($xpathIncr, NULL, 'Increment element not found for Date Only.'); // Change the field is set to an all day field. - $this->fieldStorage->setSetting('daterange_type', DateRangeItem::DATERANGE_TYPE_ALLDAY); + $this->fieldStorage->setSetting('datetime_type', DateRangeItem::DATETIME_TYPE_ALLDAY); $this->fieldStorage->save(); // Change the widget to a datelist widget. @@ -506,8 +506,8 @@ public function testDatelistWidget() { // Assert that Hour and Minute Elements do not appear on Date Only $this->assertNoFieldByXPath("//*[@id=\"edit-$field_name-0-value-hour\"]", NULL, 'Hour element not found on Date Only.'); $this->assertNoFieldByXPath("//*[@id=\"edit-$field_name-0-value-minute\"]", NULL, 'Minute element not found on Date Only.'); - $this->assertNoFieldByXPath("//*[@id=\"edit-$field_name-0-value2-hour\"]", NULL, 'Hour element not found on Date Only.'); - $this->assertNoFieldByXPath("//*[@id=\"edit-$field_name-0-value2-minute\"]", NULL, 'Minute element not found on Date Only.'); + $this->assertNoFieldByXPath("//*[@id=\"edit-$field_name-0-end-value-hour\"]", NULL, 'Hour element not found on Date Only.'); + $this->assertNoFieldByXPath("//*[@id=\"edit-$field_name-0-end-value-minute\"]", NULL, 'Minute element not found on Date Only.'); // Go to the form display page to assert that increment option does not appear on Date Only $fieldEditUrl = 'entity_test/structure/entity_test/form-display'; @@ -519,7 +519,7 @@ public function testDatelistWidget() { $this->assertNoFieldByXPath($xpathIncr, NULL, 'Increment element not found for Date Only.'); // Change the field to a datetime field. - $this->fieldStorage->setSetting('daterange_type', DateRangeItem::DATERANGE_TYPE_DATETIME); + $this->fieldStorage->setSetting('datetime_type', DateRangeItem::DATETIME_TYPE_DATETIME); $this->fieldStorage->save(); // Change the widget to a datelist widget. @@ -546,7 +546,7 @@ public function testDatelistWidget() { // Display creation form. $this->drupalGet('entity_test/add'); - foreach (['value','value2'] as $column) { + foreach (['value','end-value'] as $column) { foreach (['year', 'month', 'day', 'hour', 'minute', 'ampm'] as $element) { $this->assertFieldByXPath("//*[@id=\"edit-$field_name-0-$column-$element\"]", NULL, $element . ' element found.'); $this->assertOptionSelected("edit-$field_name-0-$column-$element", '', 'No ' . $element . ' selected.'); @@ -565,7 +565,7 @@ public function testDatelistWidget() { $edit["{$field_name}[0][value][$part]"] = $value; } foreach ($end_date_value as $part => $value) { - $edit["{$field_name}[0][value2][$part]"] = $value; + $edit["{$field_name}[0][end_value][$part]"] = $value; } $this->drupalPostForm(NULL, $edit, t('Save')); @@ -580,12 +580,12 @@ public function testDatelistWidget() { $this->assertOptionSelected("edit-$field_name-0-value-minute", '15', 'Correct minute selected.'); $this->assertOptionSelected("edit-$field_name-0-value-ampm", 'am', 'Correct ampm selected.'); - $this->assertOptionSelected("edit-$field_name-0-value2-year", '2013', 'Correct year selected.'); - $this->assertOptionSelected("edit-$field_name-0-value2-month", '1', 'Correct month selected.'); - $this->assertOptionSelected("edit-$field_name-0-value2-day", '15', 'Correct day selected.'); - $this->assertOptionSelected("edit-$field_name-0-value2-hour", '3', 'Correct hour selected.'); - $this->assertOptionSelected("edit-$field_name-0-value2-minute", '30', 'Correct minute selected.'); - $this->assertOptionSelected("edit-$field_name-0-value2-ampm", 'pm', 'Correct ampm selected.'); + $this->assertOptionSelected("edit-$field_name-0-end-value-year", '2013', 'Correct year selected.'); + $this->assertOptionSelected("edit-$field_name-0-end-value-month", '1', 'Correct month selected.'); + $this->assertOptionSelected("edit-$field_name-0-end-value-day", '15', 'Correct day selected.'); + $this->assertOptionSelected("edit-$field_name-0-end-value-hour", '3', 'Correct hour selected.'); + $this->assertOptionSelected("edit-$field_name-0-end-value-minute", '30', 'Correct minute selected.'); + $this->assertOptionSelected("edit-$field_name-0-end-value-ampm", 'pm', 'Correct ampm selected.'); // Test the widget using increment other than 1 and 24 hour mode. entity_get_form_display($this->field->getTargetEntityTypeId(), $this->field->getTargetBundle(), 'default') @@ -607,9 +607,9 @@ public function testDatelistWidget() { $this->assertFieldByXPath("//*[@id=\"edit-$field_name-0-value-hour\"]", NULL, 'Hour element found.'); $this->assertOptionSelected("edit-$field_name-0-value-hour", '', 'No hour selected.'); $this->assertNoFieldByXPath("//*[@id=\"edit-$field_name-0-value-ampm\"]", NULL, 'AMPM element not found.'); - $this->assertFieldByXPath("//*[@id=\"edit-$field_name-0-value2-hour\"]", NULL, 'Hour element found.'); - $this->assertOptionSelected("edit-$field_name-0-value2-hour", '', 'No hour selected.'); - $this->assertNoFieldByXPath("//*[@id=\"edit-$field_name-0-value2-ampm\"]", NULL, 'AMPM element not found.'); + $this->assertFieldByXPath("//*[@id=\"edit-$field_name-0-end-value-hour\"]", NULL, 'Hour element found.'); + $this->assertOptionSelected("edit-$field_name-0-end-value-hour", '', 'No hour selected.'); + $this->assertNoFieldByXPath("//*[@id=\"edit-$field_name-0-end-value-ampm\"]", NULL, 'AMPM element not found.'); // Submit a valid date and ensure it is accepted. $start_date_value = ['year' => 2012, 'month' => 12, 'day' => 31, 'hour' => 17, 'minute' => 15]; @@ -620,7 +620,7 @@ public function testDatelistWidget() { $edit["{$field_name}[0][value][$part]"] = $value; } foreach ($end_date_value as $part => $value) { - $edit["{$field_name}[0][value2][$part]"] = $value; + $edit["{$field_name}[0][end_value][$part]"] = $value; } $this->drupalPostForm(NULL, $edit, t('Save')); @@ -634,11 +634,11 @@ public function testDatelistWidget() { $this->assertOptionSelected("edit-$field_name-0-value-hour", '17', 'Correct hour selected.'); $this->assertOptionSelected("edit-$field_name-0-value-minute", '15', 'Correct minute selected.'); - $this->assertOptionSelected("edit-$field_name-0-value2-year", '2013', 'Correct year selected.'); - $this->assertOptionSelected("edit-$field_name-0-value2-month", '1', 'Correct month selected.'); - $this->assertOptionSelected("edit-$field_name-0-value2-day", '15', 'Correct day selected.'); - $this->assertOptionSelected("edit-$field_name-0-value2-hour", '3', 'Correct hour selected.'); - $this->assertOptionSelected("edit-$field_name-0-value2-minute", '30', 'Correct minute selected.'); + $this->assertOptionSelected("edit-$field_name-0-end-value-year", '2013', 'Correct year selected.'); + $this->assertOptionSelected("edit-$field_name-0-end-value-month", '1', 'Correct month selected.'); + $this->assertOptionSelected("edit-$field_name-0-end-value-day", '15', 'Correct day selected.'); + $this->assertOptionSelected("edit-$field_name-0-end-value-hour", '3', 'Correct hour selected.'); + $this->assertOptionSelected("edit-$field_name-0-end-value-minute", '30', 'Correct minute selected.'); // Test the widget for partial completion of fields. entity_get_form_display($this->field->getTargetEntityTypeId(), $this->field->getTargetBundle(), 'default') @@ -666,7 +666,7 @@ public function testDatelistWidget() { $edit["{$field_name}[0][value][$part]"] = $value; } foreach ($end_date_value as $part => $value) { - $edit["{$field_name}[0][value2][$part]"] = $value; + $edit["{$field_name}[0][end_value][$part]"] = $value; } $this->drupalPostForm(NULL, $edit, t('Save')); @@ -686,7 +686,7 @@ public function testDatelistWidget() { $edit["{$field_name}[0][value][$part]"] = $value; } foreach ($end_date_value as $part => $value) { - $edit["{$field_name}[0][value2][$part]"] = $value; + $edit["{$field_name}[0][end_value][$part]"] = $value; } $this->drupalPostForm(NULL, $edit, t('Save')); @@ -705,13 +705,13 @@ public function testDatelistWidget() { $edit["{$field_name}[0][value][$part]"] = $value; } foreach ($end_date_value as $part => $value) { - $edit["{$field_name}[0][value2][$part]"] = $value; + $edit["{$field_name}[0][end_value][$part]"] = $value; } $this->drupalPostForm(NULL, $edit, t('Save')); $this->assertResponse(200); $this->assertOptionSelected("edit-$field_name-0-value-minute", '0', 'Correct minute selected.'); - $this->assertOptionSelected("edit-$field_name-0-value2-minute", '0', 'Correct minute selected.'); + $this->assertOptionSelected("edit-$field_name-0-end-value-minute", '0', 'Correct minute selected.'); } /** @@ -789,7 +789,7 @@ public function testDefaultValue() { 'field_name' => $field_name, 'entity_type' => 'node', 'type' => 'daterange', - 'settings' => ['daterange_type' => DateRangeItem::DATERANGE_TYPE_DATE], + 'settings' => ['datetime_type' => DateRangeItem::DATETIME_TYPE_DATE], ]); $field_storage->save(); @@ -801,23 +801,23 @@ public function testDefaultValue() { // Set now as default_value. $field_edit = [ - 'default_value_input[default_start_date_type]' => 'now', + 'default_value_input[default_date_type]' => 'now', 'default_value_input[default_end_date_type]' => 'now', ]; $this->drupalPostForm('admin/structure/types/manage/date_content/fields/node.date_content.' . $field_name, $field_edit, t('Save settings')); // Check that default value is selected in default value form. $this->drupalGet('admin/structure/types/manage/date_content/fields/node.date_content.' . $field_name); - $this->assertOptionSelected('edit-default-value-input-default-start-date-type', 'now', 'The default start value is selected in instance settings page'); - $this->assertFieldByName('default_value_input[default_start_date]', '', 'The relative start default value is empty in instance settings page'); + $this->assertOptionSelected('edit-default-value-input-default-date-type', 'now', 'The default start value is selected in instance settings page'); + $this->assertFieldByName('default_value_input[default_date]', '', 'The relative start default value is empty in instance settings page'); $this->assertOptionSelected('edit-default-value-input-default-end-date-type', 'now', 'The default end value is selected in instance settings page'); $this->assertFieldByName('default_value_input[default_end_date]', '', 'The relative end default value is empty in instance settings page'); // Check if default_date has been stored successfully. $config_entity = $this->config('field.field.node.date_content.' . $field_name)->get(); $this->assertEqual($config_entity['default_value'][0], [ - 'default_start_date_type' => 'now', - 'default_start_date' => 'now', + 'default_date_type' => 'now', + 'default_date' => 'now', 'default_end_date_type' => 'now', 'default_end_date' => 'now' ], 'Default value has been stored successfully'); @@ -829,12 +829,12 @@ public function testDefaultValue() { $new_node = Node::create(['type' => 'date_content']); $expected_date = new DrupalDateTime('now', DATETIME_STORAGE_TIMEZONE); $this->assertEqual($new_node->get($field_name)->offsetGet(0)->value, $expected_date->format(DATETIME_DATE_STORAGE_FORMAT)); - $this->assertEqual($new_node->get($field_name)->offsetGet(0)->value2, $expected_date->format(DATETIME_DATE_STORAGE_FORMAT)); + $this->assertEqual($new_node->get($field_name)->offsetGet(0)->end_value, $expected_date->format(DATETIME_DATE_STORAGE_FORMAT)); // Set an invalid relative default_value to test validation. $field_edit = [ - 'default_value_input[default_start_date_type]' => 'relative', - 'default_value_input[default_start_date]' => 'invalid date', + 'default_value_input[default_date_type]' => 'relative', + 'default_value_input[default_date]' => 'invalid date', 'default_value_input[default_end_date_type]' => 'relative', 'default_value_input[default_end_date]' => '+1 day', ]; @@ -842,8 +842,8 @@ public function testDefaultValue() { $this->assertText('The relative start date value entered is invalid.'); $field_edit = [ - 'default_value_input[default_start_date_type]' => 'relative', - 'default_value_input[default_start_date]' => '+1 day', + 'default_value_input[default_date_type]' => 'relative', + 'default_value_input[default_date]' => '+1 day', 'default_value_input[default_end_date_type]' => 'relative', 'default_value_input[default_end_date]' => 'invalid date', ]; @@ -852,8 +852,8 @@ public function testDefaultValue() { // Set a relative default_value. $field_edit = [ - 'default_value_input[default_start_date_type]' => 'relative', - 'default_value_input[default_start_date]' => '+45 days', + 'default_value_input[default_date_type]' => 'relative', + 'default_value_input[default_date]' => '+45 days', 'default_value_input[default_end_date_type]' => 'relative', 'default_value_input[default_end_date]' => '+90 days', ]; @@ -861,16 +861,16 @@ public function testDefaultValue() { // Check that default value is selected in default value form. $this->drupalGet('admin/structure/types/manage/date_content/fields/node.date_content.' . $field_name); - $this->assertOptionSelected('edit-default-value-input-default-start-date-type', 'relative', 'The default start value is selected in instance settings page'); - $this->assertFieldByName('default_value_input[default_start_date]', '+45 days', 'The relative default start value is displayed in instance settings page'); + $this->assertOptionSelected('edit-default-value-input-default-date-type', 'relative', 'The default start value is selected in instance settings page'); + $this->assertFieldByName('default_value_input[default_date]', '+45 days', 'The relative default start value is displayed in instance settings page'); $this->assertOptionSelected('edit-default-value-input-default-end-date-type', 'relative', 'The default end value is selected in instance settings page'); $this->assertFieldByName('default_value_input[default_end_date]', '+90 days', 'The relative default end value is displayed in instance settings page'); // Check if default_date has been stored successfully. $config_entity = $this->config('field.field.node.date_content.' . $field_name)->get(); $this->assertEqual($config_entity['default_value'][0], [ - 'default_start_date_type' => 'relative', - 'default_start_date' => '+45 days', + 'default_date_type' => 'relative', + 'default_date' => '+45 days', 'default_end_date_type' => 'relative', 'default_end_date' => '+90 days', ], 'Default value has been stored successfully'); @@ -883,19 +883,19 @@ public function testDefaultValue() { $expected_start_date = new DrupalDateTime('+45 days', DATETIME_STORAGE_TIMEZONE); $expected_end_date = new DrupalDateTime('+90 days', DATETIME_STORAGE_TIMEZONE); $this->assertEqual($new_node->get($field_name)->offsetGet(0)->value, $expected_start_date->format(DATETIME_DATE_STORAGE_FORMAT)); - $this->assertEqual($new_node->get($field_name)->offsetGet(0)->value2, $expected_end_date->format(DATETIME_DATE_STORAGE_FORMAT)); + $this->assertEqual($new_node->get($field_name)->offsetGet(0)->end_value, $expected_end_date->format(DATETIME_DATE_STORAGE_FORMAT)); // Remove default value. $field_edit = [ - 'default_value_input[default_start_date_type]' => '', + 'default_value_input[default_date_type]' => '', 'default_value_input[default_end_date_type]' => '', ]; $this->drupalPostForm('admin/structure/types/manage/date_content/fields/node.date_content.' . $field_name, $field_edit, t('Save settings')); // Check that default value is selected in default value form. $this->drupalGet('admin/structure/types/manage/date_content/fields/node.date_content.' . $field_name); - $this->assertOptionSelected('edit-default-value-input-default-start-date-type', '', 'The default start value is selected in instance settings page'); - $this->assertFieldByName('default_value_input[default_start_date]', '', 'The relative default start value is empty in instance settings page'); + $this->assertOptionSelected('edit-default-value-input-default-date-type', '', 'The default start value is selected in instance settings page'); + $this->assertFieldByName('default_value_input[default_date]', '', 'The relative default start value is empty in instance settings page'); $this->assertOptionSelected('edit-default-value-input-default-end-date-type', '', 'The default end value is selected in instance settings page'); $this->assertFieldByName('default_value_input[default_end_date]', '', 'The relative default end value is empty in instance settings page'); @@ -909,6 +909,38 @@ public function testDefaultValue() { // Create a new node to check that datetime field default value is not set. $new_node = Node::create(['type' => 'date_content']); $this->assertNull($new_node->get($field_name)->value, 'Default value is not set'); + + // Set now as default_value for start date only. + entity_get_form_display('node', 'date_content', 'default') + ->setComponent($field_name, [ + 'type' => 'datetime_default', + ]) + ->save(); + + $expected_date = new DrupalDateTime('now', DATETIME_STORAGE_TIMEZONE); + + $field_edit = [ + 'default_value_input[default_date_type]' => 'now', + 'default_value_input[default_end_date_type]' => '', + ]; + $this->drupalPostForm('admin/structure/types/manage/date_content/fields/node.date_content.' . $field_name, $field_edit, t('Save settings')); + + // Make sure only the start value is populated on node add page. + $this->drupalGet('node/add/date_content'); + $this->assertFieldByName("{$field_name}[0][value][date]", $expected_date->format(DATETIME_DATE_STORAGE_FORMAT), 'Start date element populated.'); + $this->assertFieldByName("{$field_name}[0][end_value][date]", '', 'End date element empty.'); + + // Set now as default_value for end date only. + $field_edit = [ + 'default_value_input[default_date_type]' => '', + 'default_value_input[default_end_date_type]' => 'now', + ]; + $this->drupalPostForm('admin/structure/types/manage/date_content/fields/node.date_content.' . $field_name, $field_edit, t('Save settings')); + + // Make sure only the start value is populated on node add page. + $this->drupalGet('node/add/date_content'); + $this->assertFieldByName("{$field_name}[0][value][date]", '', 'Start date element empty.'); + $this->assertFieldByName("{$field_name}[0][end_value][date]", $expected_date->format(DATETIME_DATE_STORAGE_FORMAT), 'End date element populated.'); } /** @@ -916,7 +948,7 @@ public function testDefaultValue() { */ public function testInvalidField() { // Change the field to a datetime field. - $this->fieldStorage->setSetting('daterange_type', DateRangeItem::DATERANGE_TYPE_DATETIME); + $this->fieldStorage->setSetting('datetime_type', DateRangeItem::DATETIME_TYPE_DATETIME); $this->fieldStorage->save(); $field_name = $this->fieldStorage->getName(); @@ -924,16 +956,16 @@ public function testInvalidField() { $this->drupalGet('entity_test/add'); $this->assertFieldByName("{$field_name}[0][value][date]", '', 'Start date element found.'); $this->assertFieldByName("{$field_name}[0][value][time]", '', 'Start time element found.'); - $this->assertFieldByName("{$field_name}[0][value2][date]", '', 'End date element found.'); - $this->assertFieldByName("{$field_name}[0][value2][time]", '', 'End time element found.'); + $this->assertFieldByName("{$field_name}[0][end_value][date]", '', 'End date element found.'); + $this->assertFieldByName("{$field_name}[0][end_value][time]", '', 'End time element found.'); // Submit invalid start dates and ensure they is not accepted. $date_value = ''; $edit = [ "{$field_name}[0][value][date]" => $date_value, "{$field_name}[0][value][time]" => '12:00:00', - "{$field_name}[0][value2][date]" => '2012-12-01', - "{$field_name}[0][value2][time]" => '12:00:00', + "{$field_name}[0][end_value][date]" => '2012-12-01', + "{$field_name}[0][end_value][time]" => '12:00:00', ]; $this->drupalPostForm(NULL, $edit, t('Save')); $this->assertText('date is invalid', 'Empty start date value has been caught.'); @@ -942,8 +974,8 @@ public function testInvalidField() { $edit = [ "{$field_name}[0][value][date]" => $date_value, "{$field_name}[0][value][time]" => '00:00:00', - "{$field_name}[0][value2][date]" => '2012-12-01', - "{$field_name}[0][value2][time]" => '12:00:00', + "{$field_name}[0][end_value][date]" => '2012-12-01', + "{$field_name}[0][end_value][time]" => '12:00:00', ]; $this->drupalPostForm(NULL, $edit, t('Save')); $this->assertText('date is invalid', new FormattableMarkup('Invalid start year value %date has been caught.', ['%date' => $date_value])); @@ -952,8 +984,8 @@ public function testInvalidField() { $edit = [ "{$field_name}[0][value][date]" => $date_value, "{$field_name}[0][value][time]" => '00:00:00', - "{$field_name}[0][value2][date]" => '2012-12-01', - "{$field_name}[0][value2][time]" => '12:00:00', + "{$field_name}[0][end_value][date]" => '2012-12-01', + "{$field_name}[0][end_value][time]" => '12:00:00', ]; $this->drupalPostForm(NULL, $edit, t('Save')); $this->assertText('date is invalid', new FormattableMarkup('Invalid start month value %date has been caught.', ['%date' => $date_value])); @@ -962,8 +994,8 @@ public function testInvalidField() { $edit = [ "{$field_name}[0][value][date]" => $date_value, "{$field_name}[0][value][time]" => '00:00:00', - "{$field_name}[0][value2][date]" => '2012-12-01', - "{$field_name}[0][value2][time]" => '12:00:00', + "{$field_name}[0][end_value][date]" => '2012-12-01', + "{$field_name}[0][end_value][time]" => '12:00:00', ]; $this->drupalPostForm(NULL, $edit, t('Save')); $this->assertText('date is invalid', new FormattableMarkup('Invalid start day value %date has been caught.', ['%date' => $date_value])); @@ -973,8 +1005,8 @@ public function testInvalidField() { $edit = [ "{$field_name}[0][value][date]" => '2012-12-01', "{$field_name}[0][value][time]" => $time_value, - "{$field_name}[0][value2][date]" => '2012-12-01', - "{$field_name}[0][value2][time]" => '12:00:00', + "{$field_name}[0][end_value][date]" => '2012-12-01', + "{$field_name}[0][end_value][time]" => '12:00:00', ]; $this->drupalPostForm(NULL, $edit, t('Save')); $this->assertText('date is invalid', 'Empty start time value has been caught.'); @@ -983,8 +1015,8 @@ public function testInvalidField() { $edit = [ "{$field_name}[0][value][date]" => '2012-12-01', "{$field_name}[0][value][time]" => $time_value, - "{$field_name}[0][value2][date]" => '2012-12-01', - "{$field_name}[0][value2][time]" => '12:00:00', + "{$field_name}[0][end_value][date]" => '2012-12-01', + "{$field_name}[0][end_value][time]" => '12:00:00', ]; $this->drupalPostForm(NULL, $edit, t('Save')); $this->assertText('date is invalid', new FormattableMarkup('Invalid start hour value %time has been caught.', ['%time' => $time_value])); @@ -993,8 +1025,8 @@ public function testInvalidField() { $edit = [ "{$field_name}[0][value][date]" => '2012-12-01', "{$field_name}[0][value][time]" => $time_value, - "{$field_name}[0][value2][date]" => '2012-12-01', - "{$field_name}[0][value2][time]" => '12:00:00', + "{$field_name}[0][end_value][date]" => '2012-12-01', + "{$field_name}[0][end_value][time]" => '12:00:00', ]; $this->drupalPostForm(NULL, $edit, t('Save')); $this->assertText('date is invalid', new FormattableMarkup('Invalid start minute value %time has been caught.', ['%time' => $time_value])); @@ -1003,8 +1035,8 @@ public function testInvalidField() { $edit = [ "{$field_name}[0][value][date]" => '2012-12-01', "{$field_name}[0][value][time]" => $time_value, - "{$field_name}[0][value2][date]" => '2012-12-01', - "{$field_name}[0][value2][time]" => '12:00:00', + "{$field_name}[0][end_value][date]" => '2012-12-01', + "{$field_name}[0][end_value][time]" => '12:00:00', ]; $this->drupalPostForm(NULL, $edit, t('Save')); $this->assertText('date is invalid', new FormattableMarkup('Invalid start second value %time has been caught.', ['%time' => $time_value])); @@ -1014,8 +1046,8 @@ public function testInvalidField() { $edit = [ "{$field_name}[0][value][date]" => '2012-12-01', "{$field_name}[0][value][time]" => '12:00:00', - "{$field_name}[0][value2][date]" => $date_value, - "{$field_name}[0][value2][time]" => '12:00:00', + "{$field_name}[0][end_value][date]" => $date_value, + "{$field_name}[0][end_value][time]" => '12:00:00', ]; $this->drupalPostForm(NULL, $edit, t('Save')); $this->assertText('date is invalid', 'Empty end date value has been caught.'); @@ -1024,8 +1056,8 @@ public function testInvalidField() { $edit = [ "{$field_name}[0][value][date]" => '2012-12-01', "{$field_name}[0][value][time]" => '12:00:00', - "{$field_name}[0][value2][date]" => $date_value, - "{$field_name}[0][value2][time]" => '00:00:00', + "{$field_name}[0][end_value][date]" => $date_value, + "{$field_name}[0][end_value][time]" => '00:00:00', ]; $this->drupalPostForm(NULL, $edit, t('Save')); $this->assertText('date is invalid', new FormattableMarkup('Invalid end year value %date has been caught.', ['%date' => $date_value])); @@ -1034,8 +1066,8 @@ public function testInvalidField() { $edit = [ "{$field_name}[0][value][date]" => '2012-12-01', "{$field_name}[0][value][time]" => '12:00:00', - "{$field_name}[0][value2][date]" => $date_value, - "{$field_name}[0][value2][time]" => '00:00:00', + "{$field_name}[0][end_value][date]" => $date_value, + "{$field_name}[0][end_value][time]" => '00:00:00', ]; $this->drupalPostForm(NULL, $edit, t('Save')); $this->assertText('date is invalid', new FormattableMarkup('Invalid end month value %date has been caught.', ['%date' => $date_value])); @@ -1044,8 +1076,8 @@ public function testInvalidField() { $edit = [ "{$field_name}[0][value][date]" => '2012-12-01', "{$field_name}[0][value][time]" => '12:00:00', - "{$field_name}[0][value2][date]" => $date_value, - "{$field_name}[0][value2][time]" => '00:00:00', + "{$field_name}[0][end_value][date]" => $date_value, + "{$field_name}[0][end_value][time]" => '00:00:00', ]; $this->drupalPostForm(NULL, $edit, t('Save')); $this->assertText('date is invalid', new FormattableMarkup('Invalid end day value %date has been caught.', ['%date' => $date_value])); @@ -1055,8 +1087,8 @@ public function testInvalidField() { $edit = [ "{$field_name}[0][value][date]" => '2012-12-01', "{$field_name}[0][value][time]" => '12:00:00', - "{$field_name}[0][value2][date]" => '2012-12-01', - "{$field_name}[0][value2][time]" => $time_value, + "{$field_name}[0][end_value][date]" => '2012-12-01', + "{$field_name}[0][end_value][time]" => $time_value, ]; $this->drupalPostForm(NULL, $edit, t('Save')); $this->assertText('date is invalid', 'Empty end time value has been caught.'); @@ -1065,8 +1097,8 @@ public function testInvalidField() { $edit = [ "{$field_name}[0][value][date]" => '2012-12-01', "{$field_name}[0][value][time]" => '12:00:00', - "{$field_name}[0][value2][date]" => '2012-12-01', - "{$field_name}[0][value2][time]" => $time_value, + "{$field_name}[0][end_value][date]" => '2012-12-01', + "{$field_name}[0][end_value][time]" => $time_value, ]; $this->drupalPostForm(NULL, $edit, t('Save')); $this->assertText('date is invalid', new FormattableMarkup('Invalid end hour value %time has been caught.', ['%time' => $time_value])); @@ -1075,8 +1107,8 @@ public function testInvalidField() { $edit = [ "{$field_name}[0][value][date]" => '2012-12-01', "{$field_name}[0][value][time]" => '12:00:00', - "{$field_name}[0][value2][date]" => '2012-12-01', - "{$field_name}[0][value2][time]" => $time_value, + "{$field_name}[0][end_value][date]" => '2012-12-01', + "{$field_name}[0][end_value][time]" => $time_value, ]; $this->drupalPostForm(NULL, $edit, t('Save')); $this->assertText('date is invalid', new FormattableMarkup('Invalid end minute value %time has been caught.', ['%time' => $time_value])); @@ -1085,8 +1117,8 @@ public function testInvalidField() { $edit = [ "{$field_name}[0][value][date]" => '2012-12-01', "{$field_name}[0][value][time]" => '12:00:00', - "{$field_name}[0][value2][date]" => '2012-12-01', - "{$field_name}[0][value2][time]" => $time_value, + "{$field_name}[0][end_value][date]" => '2012-12-01', + "{$field_name}[0][end_value][time]" => $time_value, ]; $this->drupalPostForm(NULL, $edit, t('Save')); $this->assertText('date is invalid', new FormattableMarkup('Invalid end second value %time has been caught.', ['%time' => $time_value])); @@ -1094,8 +1126,8 @@ public function testInvalidField() { $edit = [ "{$field_name}[0][value][date]" => '2012-12-01', "{$field_name}[0][value][time]" => '12:00:00', - "{$field_name}[0][value2][date]" => '2010-12-01', - "{$field_name}[0][value2][time]" => '12:00:00', + "{$field_name}[0][end_value][date]" => '2010-12-01', + "{$field_name}[0][end_value][time]" => '12:00:00', ]; $this->drupalPostForm(NULL, $edit, t('Save')); $this->assertText(new FormattableMarkup('The @title end date cannot be before the start date', ['@title' => $field_name]), 'End date before start date has been caught.'); @@ -1103,8 +1135,8 @@ public function testInvalidField() { $edit = [ "{$field_name}[0][value][date]" => '2012-12-01', "{$field_name}[0][value][time]" => '12:00:00', - "{$field_name}[0][value2][date]" => '2012-12-01', - "{$field_name}[0][value2][time]" => '11:00:00', + "{$field_name}[0][end_value][date]" => '2012-12-01', + "{$field_name}[0][end_value][time]" => '11:00:00', ]; $this->drupalPostForm(NULL, $edit, t('Save')); $this->assertText(new FormattableMarkup('The @title end date cannot be before the start date', ['@title' => $field_name]), 'End time before start time has been caught.'); @@ -1124,7 +1156,7 @@ public function testDateStorageSettings() { 'entity_type' => 'node', 'type' => 'daterange', 'settings' => [ - 'daterange_type' => DateRangeItem::DATERANGE_TYPE_DATE, + 'datetime_type' => DateRangeItem::DATETIME_TYPE_DATE, ], ]); $field_storage->save(); @@ -1144,12 +1176,12 @@ public function testDateStorageSettings() { 'title[0][value]' => $this->randomString(), 'body[0][value]' => $this->randomString(), $field_name . '[0][value][date]' => '2016-04-01', - $field_name . '[0][value2][date]' => '2016-04-02', + $field_name . '[0][end_value][date]' => '2016-04-02', ]; $this->drupalPostForm('node/add/date_content', $edit, t('Save')); $this->drupalGet('admin/structure/types/manage/date_content/fields/node.date_content.' . $field_name . '/storage'); - $result = $this->xpath("//*[@id='edit-settings-daterange-type' and contains(@disabled, 'disabled')]"); - $this->assertEqual(count($result), 1, "Changing daterange setting is disabled."); + $result = $this->xpath("//*[@id='edit-settings-datetime-type' and contains(@disabled, 'disabled')]"); + $this->assertEqual(count($result), 1, "Changing datetime setting is disabled."); $this->assertText('There is data for this field in the database. The field settings can no longer be changed.'); }