commit 64bbef62e1bb7114b70cf24e124b0a31fe9b865b Author: Darrick Servis Date: Mon Feb 1 21:20:17 2016 -0700 2161337-50.patch diff --git a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeDefaultFormatter.php b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeDefaultFormatter.php index a1637a9..6dad92e 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeDefaultFormatter.php +++ b/core/modules/datetime/src/Plugin/Field/FieldFormatter/DateTimeDefaultFormatter.php @@ -60,7 +60,7 @@ public function viewElements(FieldItemListInterface $items, $langcode) { $output = $this->formatDate($date); } - if ($item->date2) { + if ($item->date2 && $item->date != $item->date2) { /** @var \Drupal\Core\Datetime\DrupalDateTime $date */ $date2 = $item->date2; // Create the ISO date in Universal Time. @@ -73,6 +73,13 @@ public function viewElements(FieldItemListInterface $items, $langcode) { $this->setTimeZone($date2); $output2 = $this->formatDate($date2); + + // Check if start day == end day. + $length = strspn($output2, $output); + if ($length) { + + $output2 = substr($output2, $length - 1); + } } // Display the date using theme datetime. @@ -91,7 +98,7 @@ public function viewElements(FieldItemListInterface $items, $langcode) { ]; // Append on the end date. - if ($this->getFieldSetting('enddate_get')) { + if ($this->getFieldSetting('enddate_get') && !empty($output2)) { $elements[$delta][] = [ '#markup' => $this->t(' to '), ]; diff --git a/core/modules/datetime/src/Plugin/Field/FieldType/DateTimeFieldItemList.php b/core/modules/datetime/src/Plugin/Field/FieldType/DateTimeFieldItemList.php index b0bc7ba..5b4470a 100644 --- a/core/modules/datetime/src/Plugin/Field/FieldType/DateTimeFieldItemList.php +++ b/core/modules/datetime/src/Plugin/Field/FieldType/DateTimeFieldItemList.php @@ -29,6 +29,11 @@ class DateTimeFieldItemList extends FieldItemList { const DEFAULT_VALUE_CUSTOM = 'relative'; /** + * Defines the default value as relative. + */ + const DEFAULT_VALUE_SAME = 'same'; + + /** * {@inheritdoc} */ public function defaultValuesForm(array &$form, FormStateInterface $form_state) { @@ -56,11 +61,44 @@ public function defaultValuesForm(array &$form, FormStateInterface $form_state) '#states' => array( 'visible' => array( ':input[id="edit-default-value-input-default-date-type"]' => array('value' => static::DEFAULT_VALUE_CUSTOM), - ) - ) - ) + ), + ), + ), ); + if ($this->getFieldDefinition()->getSetting('enddate_get')) { + $element += array( + 'default_date_type2' => array( + '#type' => 'select', + '#title' => t('Default end date'), + '#description' => t('Set a default value for this end date.'), + '#default_value' => isset($default_value[0]['default_date_type2']) ? $default_value[0]['default_date_type2'] : '', + '#options' => array( + static::DEFAULT_VALUE_SAME => t('Same as Default date'), + static::DEFAULT_VALUE_NOW => t('Current date'), + static::DEFAULT_VALUE_CUSTOM => t('Relative date'), + ), + '#empty_value' => '', + '#states' => array( + 'visible' => array( + ':input[id="edit-default-value-input-default-date-type"]' => array('filled' => TRUE), + ), + ), + ), + 'default_date2' => array( + '#type' => 'textfield', + '#title' => t('Relative default end value'), + '#description' => 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.", array('@strtotime' => 'strtotime', '@url' => 'http://www.php.net/manual/en/function.strtotime.php')), + '#default_value' => (isset($default_value[0]['default_date_type2']) && $default_value[0]['default_date_type2'] == static::DEFAULT_VALUE_CUSTOM) ? $default_value[0]['default_date2'] : '', + '#states' => array( + 'visible' => array( + ':input[id="edit-default-value-input-default-date-type2"]' => array('value' => static::DEFAULT_VALUE_CUSTOM), + ), + ), + ), + ); + } + return $element; } } @@ -75,6 +113,13 @@ public function defaultValuesFormValidate(array $element, array &$form, FormStat $form_state->setErrorByName('default_value_input][default_date', t('The relative date value entered is invalid.')); } } + + if ($form_state->getValue(['default_value_input', 'default_date_type2']) == static::DEFAULT_VALUE_CUSTOM) { + $is_strtotime = @strtotime($form_state->getValue(array('default_value_input', 'default_date2'))); + if (!$is_strtotime) { + $form_state->setErrorByName('default_value_input][default_date2', t('The relative date value entered is invalid.')); + } + } } /** @@ -82,9 +127,18 @@ public function defaultValuesFormValidate(array $element, array &$form, FormStat */ public function defaultValuesFormSubmit(array $element, array &$form, FormStateInterface $form_state) { if ($form_state->getValue(array('default_value_input', 'default_date_type'))) { + // Set the start date default to now. if ($form_state->getValue(array('default_value_input', 'default_date_type')) == static::DEFAULT_VALUE_NOW) { $form_state->setValueForElement($element['default_date'], static::DEFAULT_VALUE_NOW); } + // Set the end date default to now. + if ($form_state->getValue(array('default_value_input', 'default_date_type2')) == static::DEFAULT_VALUE_NOW) { + $form_state->setValueForElement($element['default_date2'], static::DEFAULT_VALUE_NOW); + } + // Set the end date default to same default as start date. + if ($form_state->getValue(array('default_value_input', 'default_date_type2')) == static::DEFAULT_VALUE_SAME) { + $form_state->setValueForElement($element['default_date2'], $form_state->getValue(array('default_value_input', 'default_date'))); + } return array($form_state->getValue('default_value_input')); } return array(); @@ -95,12 +149,13 @@ public function defaultValuesFormSubmit(array $element, array &$form, FormStateI */ public static function processDefaultValue($default_value, FieldableEntityInterface $entity, FieldDefinitionInterface $definition) { $default_value = parent::processDefaultValue($default_value, $entity, $definition); + $default_date_type2 = $default_value[0]['default_date_type2']; if (isset($default_value[0]['default_date_type'])) { // A default value should be in the format and timezone used for date // storage. $date = new DrupalDateTime($default_value[0]['default_date'], DATETIME_STORAGE_TIMEZONE); - $storage_format = $definition->getSetting('datetime_type') == DateTimeItem::DATETIME_TYPE_DATE ? DATETIME_DATE_STORAGE_FORMAT: DATETIME_DATETIME_STORAGE_FORMAT; + $storage_format = $definition->getSetting('datetime_type') == DateTimeItem::DATETIME_TYPE_DATE ? DATETIME_DATE_STORAGE_FORMAT : DATETIME_DATETIME_STORAGE_FORMAT; $value = $date->format($storage_format); // 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 @@ -109,12 +164,24 @@ public static function processDefaultValue($default_value, FieldableEntityInterf array( 'value' => $value, 'date' => $date, - ) + ), ); - if ($definition->getSetting('enddate_get')) { - $default_value[0]['value2'] = $value; - $default_value[0]['date2'] = $date; } + + // Repeat for end date. + if ($definition->getSetting('enddate_get') && !empty($default_date_type2)) { + // A default value should be in the format and timezone used for date + // storage. + $date = new DrupalDateTime($default_value[0]['default_date2'], DATETIME_STORAGE_TIMEZONE); + $storage_format = $definition->getSetting('datetime_type2') == DateTimeItem::DATETIME_TYPE_DATE ? DATETIME_DATE_STORAGE_FORMAT : DATETIME_DATETIME_STORAGE_FORMAT; + $value = $date->format($storage_format); + // 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[0] += array( + 'value2' => $value, + 'date2' => $date, + ); } return $default_value; }