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..f70160f 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangeCustomFormatter.php +++ b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangeCustomFormatter.php @@ -46,7 +46,7 @@ public function viewElements(FieldItemListInterface $items, $langcode) { /** @var \Drupal\Core\Datetime\DrupalDateTime $end_date */ $end_date = $item->end_date; - if ($this->getFieldSetting('daterange_type') == DateRangeItem::DATERANGE_TYPE_DATE) { + if ($this->getFieldSetting('datetime_type') == DateRangeItem::DATETIME_TYPE_DATE) { // A date without time will pick up the current time, use the default. datetime_date_default_time($start_date); datetime_date_default_time($end_date); diff --git a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangeDefaultFormatter.php b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangeDefaultFormatter.php index 24eb436..1ee4ef8 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangeDefaultFormatter.php +++ b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangeDefaultFormatter.php @@ -47,7 +47,7 @@ public function viewElements(FieldItemListInterface $items, $langcode) { /** @var \Drupal\Core\Datetime\DrupalDateTime $end_date */ $end_date = $item->end_date; - if ($this->getFieldSetting('daterange_type') == DateRangeItem::DATERANGE_TYPE_DATE) { + if ($this->getFieldSetting('datetime_type') == DateRangeItem::DATETIME_TYPE_DATE) { // A date without time will pick up the current time, use the default. datetime_date_default_time($start_date); datetime_date_default_time($end_date); diff --git a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangeFormatterBase.php b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangeFormatterBase.php index bc2f17a..f0c40d4 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangeFormatterBase.php +++ b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangeFormatterBase.php @@ -165,7 +165,7 @@ public function settingsSummary() { * A DrupalDateTime object. */ protected function setTimeZone(DrupalDateTime $date) { - if ($this->getFieldSetting('daterange_type') === DateRangeItem::DATERANGE_TYPE_DATE) { + if ($this->getFieldSetting('datetime_type') === DateRangeItem::DATETIME_TYPE_DATE) { // A date without time has no timezone conversion. $timezone = DATETIME_STORAGE_TIMEZONE; } diff --git a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangePlainFormatter.php b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangePlainFormatter.php index 91c0560..06c24ac 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangePlainFormatter.php +++ b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateRangePlainFormatter.php @@ -36,7 +36,7 @@ public function viewElements(FieldItemListInterface $items, $langcode) { /** @var \Drupal\Core\Datetime\DrupalDateTime $end_date */ $end_date = $item->end_date; - if ($this->getFieldSetting('daterange_type') == DateRangeItem::DATERANGE_TYPE_DATE) { + if ($this->getFieldSetting('datetime_type') == DateRangeItem::DATETIME_TYPE_DATE) { // A date without time will pick up the current time, use the default. datetime_date_default_time($start_date); datetime_date_default_time($end_date); @@ -72,7 +72,7 @@ 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; + $format = $this->getFieldSetting('datetime_type') == DateRangeItem::DATETIME_TYPE_DATE ? DATETIME_DATE_STORAGE_FORMAT : DATETIME_DATETIME_STORAGE_FORMAT; $timezone = $this->getSetting('timezone_override') ?: $date->getTimezone()->getName(); return $this->dateFormatter->format($date->getTimestamp(), 'custom', $format, $timezone != '' ? $timezone : NULL); } diff --git a/core/modules/datetime/src/Plugin/Field/FieldType/DateRangeFieldItemList.php b/core/modules/datetime/src/Plugin/Field/FieldType/DateRangeFieldItemList.php index 05f55a9..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, - 'end_value' => $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 b49bbc5..6779d4f 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} + * Value for the 'datetime_type' setting: store a date and time. */ - 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. - */ - const DATERANGE_TYPE_ALLDAY = 'allday'; + const DATETIME_TYPE_ALLDAY = 'allday'; /** * {@inheritdoc} @@ -80,44 +60,28 @@ 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, - ], - 'end_value' => [ - 'description' => 'The end date value.', - 'type' => 'varchar', - 'length' => 20, - ], - ], - 'indexes' => [ - 'value' => ['value'], - 'end_value' => ['end_value'], - ], + $schema = parent::schema($field_definition); + + $schema['columns']['value']['description'] = 'The start date value.'; + + $schema['columns']['end_value'] = [ + 'description' => 'The end date value.', + 'type' => 'varchar', + 'length' => 20, ]; + + $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,24 +90,20 @@ 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['end_value'] = 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); } - elseif ($type == static::DATERANGE_TYPE_ALLDAY) { + else { $values['value'] = gmdate(DATETIME_DATE_STORAGE_FORMAT, $start); $values['end_value'] = gmdate(DATETIME_DATE_STORAGE_FORMAT, $end); } - else { - $values['value'] = gmdate(DATETIME_DATETIME_STORAGE_FORMAT, $start); - $values['end_value'] = gmdate(DATETIME_DATETIME_STORAGE_FORMAT, $end); - } return $values; } diff --git a/core/modules/datetime/src/Plugin/Field/FieldWidget/DateRangeDatelistWidget.php b/core/modules/datetime/src/Plugin/Field/FieldWidget/DateRangeDatelistWidget.php index 9f96b24..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'); } @@ -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 f29c164..fc04de0 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldWidget/DateRangeDefaultWidget.php +++ b/core/modules/datetime/src/Plugin/Field/FieldWidget/DateRangeDefaultWidget.php @@ -60,15 +60,15 @@ 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: + switch ($this->getFieldSetting('datetime_type')) { + case DateRangeItem::DATETIME_TYPE_DATE: $date_type = 'date'; $time_type = 'none'; $date_format = $this->dateStorage->load('html_date')->getPattern(); $time_format = ''; break; - case DateRangeItem::DATERANGE_TYPE_ALLDAY: + case DateRangeItem::DATETIME_TYPE_ALLDAY: $date_type = 'date'; $time_type = 'none'; $date_format = $this->dateStorage->load('html_date')->getPattern(); diff --git a/core/modules/datetime/src/Plugin/Field/FieldWidget/DateRangeWidgetBase.php b/core/modules/datetime/src/Plugin/Field/FieldWidget/DateRangeWidgetBase.php index 36ae446..8842d0d 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldWidget/DateRangeWidgetBase.php +++ b/core/modules/datetime/src/Plugin/Field/FieldWidget/DateRangeWidgetBase.php @@ -45,7 +45,7 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen '#required' => $element['#required'], ]; - if ($this->getFieldSetting('daterange_type') == DateRangeItem::DATERANGE_TYPE_DATE) { + if ($this->getFieldSetting('datetime_type') == DateRangeItem::DATETIME_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; @@ -57,7 +57,7 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen $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) { + if ($this->getFieldSetting('datetime_type') == DateRangeItem::DATETIME_TYPE_DATE) { // A date without time will pick up the current time, use the default // time. datetime_date_default_time($start_date); @@ -71,7 +71,7 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen $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) { + if ($this->getFieldSetting('datetime_type') == DateRangeItem::DATETIME_TYPE_DATE) { // A date without time will pick up the current time, use the default // time. datetime_date_default_time($end_date); @@ -94,15 +94,15 @@ 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: + case DateRangeItem::DATETIME_TYPE_ALLDAY: // All day field 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 @@ -124,15 +124,15 @@ public function massageFormValues(array $values, array $form, FormStateInterface if (!empty($item['end_value']) && $item['end_value'] instanceof DrupalDateTime) { /** @var \Drupal\Core\Datetime\DrupalDateTime $end_date */ $end_date = $item['end_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($end_date); $format = DATETIME_DATE_STORAGE_FORMAT; break; - case DateRangeItem::DATERANGE_TYPE_ALLDAY: + case DateRangeItem::DATETIME_TYPE_ALLDAY: // All day field 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 diff --git a/core/modules/datetime/src/Tests/DateRangeFieldTest.php b/core/modules/datetime/src/Tests/DateRangeFieldTest.php index e4fc89c..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,7 +151,7 @@ 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. @@ -266,7 +266,7 @@ 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. @@ -362,7 +362,7 @@ 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. @@ -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. @@ -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. @@ -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. @@ -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'); @@ -833,8 +833,8 @@ public function testDefaultValue() { // 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'); @@ -887,15 +887,15 @@ public function testDefaultValue() { // 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(); @@ -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(); @@ -1148,8 +1180,8 @@ public function testDateStorageSettings() { ]; $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.'); }