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.');
}