Commit 50ab1958 authored by catch's avatar catch

Issue #2830094 by mpdonadio, Yogesh Pawar, arunkumark, jhedstrom, larowlan,...

Issue #2830094 by mpdonadio, Yogesh Pawar, arunkumark, jhedstrom, larowlan, alexpott: Deprecate and remove usages of datetime_date_default_time()
parent f1aa6b3e
...@@ -658,4 +658,15 @@ public function format($format, $settings = []) { ...@@ -658,4 +658,15 @@ public function format($format, $settings = []) {
return $value; return $value;
} }
/**
* Sets the default time for an object built from date-only data.
*
* The default time for a date without time can be anything, so long as it is
* consistently applied. If we use noon, dates in most timezones will have the
* same value for in both the local timezone and UTC.
*/
public function setDefaultDateTime() {
$this->dateTimeObject->setTime(12, 0, 0);
}
} }
...@@ -50,7 +50,20 @@ function datetime_help($route_name, RouteMatchInterface $route_match) { ...@@ -50,7 +50,20 @@ function datetime_help($route_name, RouteMatchInterface $route_match) {
* same value for in both the local timezone and UTC. * same value for in both the local timezone and UTC.
* *
* @param $date * @param $date
*
* @deprecated in Drupal 8.5.0 and will be removed before Drupal 9.0.0. Use
* \Drupal\Component\Datetime\DateTimePlus::setDefaultDateTime() or
* \Drupal\Core\Datetime\DrupalDateTime::setDefaultDateTime() instead.
*
* @see https://www.drupal.org/node/2880931
*/ */
function datetime_date_default_time($date) { function datetime_date_default_time($date) {
@trigger_error('datetime_date_default_time() is deprecated in Drupal 8.5.0 and will be removed before Drupal 9.0.0. Use \Drupal\Component\Datetime\DateTimePlus::setDefaultDateTime() or \Drupal\Core\Datetime\DrupalDateTime::setDefaultDateTime() instead. See https://www.drupal.org/node/2880931.', E_USER_DEPRECATED);
// For maximum BC before this method is removed, we do not use the
// recommendation from the deprecation method. Instead, we call the setTime()
// method directly. This allows the method to continue to work with
// \DateTime, DateTimePlus, and DrupalDateTime objects (and classes that
// may derive from them).
$date->setTime(12, 0, 0); $date->setTime(12, 0, 0);
} }
...@@ -56,12 +56,10 @@ public function getValue($langcode = NULL) { ...@@ -56,12 +56,10 @@ public function getValue($langcode = NULL) {
// set the time to 12:00:00 UTC for date-only fields. This is used so // set the time to 12:00:00 UTC for date-only fields. This is used so
// that the local date portion is the same, across nearly all time // that the local date portion is the same, across nearly all time
// zones. // zones.
// @see datetime_date_default_time() // @see \Drupal\Component\Datetime\DateTimePlus::setDefaultDateTime()
// @see http://php.net/manual/en/datetime.createfromformat.php // @see http://php.net/manual/en/datetime.createfromformat.php
// @todo Update comment and/or code per the chosen solution in
// https://www.drupal.org/node/2830094
if ($datetime_type === DateTimeItem::DATETIME_TYPE_DATE) { if ($datetime_type === DateTimeItem::DATETIME_TYPE_DATE) {
$this->date->setTime(12, 0, 0); $this->date->setDefaultDateTime();
} }
} }
} }
......
...@@ -202,10 +202,6 @@ protected function getFormatSettings() { ...@@ -202,10 +202,6 @@ protected function getFormatSettings() {
* A render array. * A render array.
*/ */
protected function buildDate(DrupalDateTime $date) { protected function buildDate(DrupalDateTime $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); $this->setTimeZone($date);
$build = [ $build = [
...@@ -230,11 +226,6 @@ protected function buildDate(DrupalDateTime $date) { ...@@ -230,11 +226,6 @@ protected function buildDate(DrupalDateTime $date) {
* A render array. * A render array.
*/ */
protected function buildDateWithIsoAttribute(DrupalDateTime $date) { protected function buildDateWithIsoAttribute(DrupalDateTime $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. // Create the ISO date in Universal Time.
$iso_date = $date->format("Y-m-d\TH:i:s") . 'Z'; $iso_date = $date->format("Y-m-d\TH:i:s") . 'Z';
......
...@@ -110,10 +110,6 @@ public function viewElements(FieldItemListInterface $items, $langcode) { ...@@ -110,10 +110,6 @@ public function viewElements(FieldItemListInterface $items, $langcode) {
$date = $item->date; $date = $item->date;
$output = []; $output = [];
if (!empty($item->date)) { if (!empty($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);
}
$output = $this->formatDate($date); $output = $this->formatDate($date);
} }
$elements[$delta] = $output; $elements[$delta] = $output;
......
...@@ -35,13 +35,8 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen ...@@ -35,13 +35,8 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
$date = $items[$delta]->date; $date = $items[$delta]->date;
// The date was created and verified during field_load(), so it is safe to // The date was created and verified during field_load(), so it is safe to
// use without further inspection. // 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'])); $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; return $element;
...@@ -59,9 +54,6 @@ public function massageFormValues(array $values, array $form, FormStateInterface ...@@ -59,9 +54,6 @@ public function massageFormValues(array $values, array $form, FormStateInterface
$date = $item['value']; $date = $item['value'];
switch ($this->getFieldSetting('datetime_type')) { switch ($this->getFieldSetting('datetime_type')) {
case DateTimeItem::DATETIME_TYPE_DATE: case DateTimeItem::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($date);
$format = DATETIME_DATE_STORAGE_FORMAT; $format = DATETIME_DATE_STORAGE_FORMAT;
break; break;
...@@ -77,4 +69,28 @@ public function massageFormValues(array $values, array $form, FormStateInterface ...@@ -77,4 +69,28 @@ public function massageFormValues(array $values, array $form, FormStateInterface
return $values; 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) {
$date->setDefaultDateTime();
}
$date->setTimezone(new \DateTimeZone($timezone));
return $date;
}
} }
...@@ -185,4 +185,20 @@ protected function setSiteTimezone($timezone) { ...@@ -185,4 +185,20 @@ protected function setSiteTimezone($timezone) {
->save(); ->save();
} }
/**
* Massages test date values.
*
* If a date object is generated directly by a test, then it needs to be
* adjusted to behave like the computed date from the item.
*
* @param \Drupal\Core\Datetime\DrupalDateTime $date
* A date object directly generated by the test.
*/
protected function massageTestDate($date) {
if ($this->field->getSetting('datetime_type') === DateTimeItem::DATETIME_TYPE_DATE) {
// Set the default time for date-only items.
$date->setDefaultDateTime();
}
}
} }
...@@ -183,4 +183,20 @@ protected function setSiteTimezone($timezone) { ...@@ -183,4 +183,20 @@ protected function setSiteTimezone($timezone) {
->save(); ->save();
} }
/**
* Massages test date values.
*
* If a date object is generated directly by a test, then it needs to be
* adjusted to behave like the computed date from the item.
*
* @param \Drupal\Core\Datetime\DrupalDateTime $date
* A date object directly generated by the test.
*/
protected function massageTestDate($date) {
if ($this->field->getSetting('datetime_type') === DateTimeItem::DATETIME_TYPE_DATE) {
// Set the default time for date-only items.
$date->setDefaultDateTime();
}
}
} }
...@@ -100,7 +100,7 @@ public function testDateField() { ...@@ -100,7 +100,7 @@ public function testDateField() {
// Formats that display a time component for date-only fields will display // Formats that display a time component for date-only fields will display
// the default time, so that is applied before calculating the expected // the default time, so that is applied before calculating the expected
// value. // value.
datetime_date_default_time($date); $this->massageTestDate($date);
foreach ($options as $setting => $values) { foreach ($options as $setting => $values) {
foreach ($values as $new_value) { foreach ($values as $new_value) {
// Update the entity display settings. // Update the entity display settings.
......
...@@ -122,22 +122,34 @@ public function testDateOnly() { ...@@ -122,22 +122,34 @@ public function testDateOnly() {
$this->assertEqual($entity->field_datetime->value, $value); $this->assertEqual($entity->field_datetime->value, $value);
$this->assertEqual($entity->field_datetime[0]->value, $value); $this->assertEqual($entity->field_datetime[0]->value, $value);
$this->assertEquals(DATETIME_STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName()); $this->assertEquals(DATETIME_STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName());
$this->assertEquals('12:00:00', $entity->field_datetime->date->format('H:i:s'));
$entity->field_datetime->date->setDefaultDateTime();
$this->assertEquals('12:00:00', $entity->field_datetime->date->format('H:i:s'));
// Verify changing the date value. // Verify changing the date value.
$new_value = '2016-11-04'; $new_value = '2016-11-04';
$entity->field_datetime->value = $new_value; $entity->field_datetime->value = $new_value;
$this->assertEqual($entity->field_datetime->value, $new_value); $this->assertEqual($entity->field_datetime->value, $new_value);
$this->assertEquals(DATETIME_STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName()); $this->assertEquals(DATETIME_STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName());
$this->assertEquals('12:00:00', $entity->field_datetime->date->format('H:i:s'));
$entity->field_datetime->date->setDefaultDateTime();
$this->assertEquals('12:00:00', $entity->field_datetime->date->format('H:i:s'));
// Read changed entity and assert changed values. // Read changed entity and assert changed values.
$this->entityValidateAndSave($entity); $this->entityValidateAndSave($entity);
$entity = EntityTest::load($id); $entity = EntityTest::load($id);
$this->assertEqual($entity->field_datetime->value, $new_value); $this->assertEqual($entity->field_datetime->value, $new_value);
$this->assertEquals(DATETIME_STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName()); $this->assertEquals(DATETIME_STORAGE_TIMEZONE, $entity->field_datetime->date->getTimeZone()->getName());
$this->assertEquals('12:00:00', $entity->field_datetime->date->format('H:i:s'));
$entity->field_datetime->date->setDefaultDateTime();
$this->assertEquals('12:00:00', $entity->field_datetime->date->format('H:i:s'));
// Test the generateSampleValue() method. // Test the generateSampleValue() method.
$entity = EntityTest::create(); $entity = EntityTest::create();
$entity->field_datetime->generateSampleItems(); $entity->field_datetime->generateSampleItems();
$this->assertEquals('12:00:00', $entity->field_datetime->date->format('H:i:s'));
$entity->field_datetime->date->setDefaultDateTime();
$this->assertEquals('12:00:00', $entity->field_datetime->date->format('H:i:s'));
$this->entityValidateAndSave($entity); $this->entityValidateAndSave($entity);
} }
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
use Drupal\Core\Datetime\DrupalDateTime; use Drupal\Core\Datetime\DrupalDateTime;
use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Form\FormStateInterface;
use Drupal\datetime\Plugin\Field\FieldType\DateTimeItem;
use Drupal\datetime\Plugin\Field\FieldWidget\DateTimeWidgetBase; use Drupal\datetime\Plugin\Field\FieldWidget\DateTimeWidgetBase;
use Drupal\datetime_range\Plugin\Field\FieldType\DateRangeItem; use Drupal\datetime_range\Plugin\Field\FieldType\DateRangeItem;
...@@ -58,9 +57,6 @@ public function massageFormValues(array $values, array $form, FormStateInterface ...@@ -58,9 +57,6 @@ public function massageFormValues(array $values, array $form, FormStateInterface
$start_date = $item['value']; $start_date = $item['value'];
switch ($this->getFieldSetting('datetime_type')) { switch ($this->getFieldSetting('datetime_type')) {
case DateRangeItem::DATETIME_TYPE_DATE: 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; $format = DATETIME_DATE_STORAGE_FORMAT;
break; break;
...@@ -88,9 +84,6 @@ public function massageFormValues(array $values, array $form, FormStateInterface ...@@ -88,9 +84,6 @@ public function massageFormValues(array $values, array $form, FormStateInterface
$end_date = $item['end_value']; $end_date = $item['end_value'];
switch ($this->getFieldSetting('datetime_type')) { switch ($this->getFieldSetting('datetime_type')) {
case DateRangeItem::DATETIME_TYPE_DATE: 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; $format = DATETIME_DATE_STORAGE_FORMAT;
break; break;
...@@ -142,30 +135,4 @@ public function validateStartEnd(array &$element, FormStateInterface $form_state ...@@ -142,30 +135,4 @@ public function validateStartEnd(array &$element, FormStateInterface $form_state
} }
} }
/**
* 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;
}
} }
...@@ -110,8 +110,8 @@ public function testDateRangeField() { ...@@ -110,8 +110,8 @@ public function testDateRangeField() {
// Formats that display a time component for date-only fields will display // Formats that display a time component for date-only fields will display
// the default time, so that is applied before calculating the expected // the default time, so that is applied before calculating the expected
// value. // value.
datetime_date_default_time($start_date); $this->massageTestDate($start_date);
datetime_date_default_time($end_date); $this->massageTestDate($end_date);
// Reset display options since these get changed below. // Reset display options since these get changed below.
$this->displayOptions = [ $this->displayOptions = [
...@@ -211,7 +211,7 @@ public function testDateRangeField() { ...@@ -211,7 +211,7 @@ public function testDateRangeField() {
$id = $match[1]; $id = $match[1];
$this->assertText(t('entity_test @id has been created.', ['@id' => $id])); $this->assertText(t('entity_test @id has been created.', ['@id' => $id]));
datetime_date_default_time($start_date); $this->massageTestDate($start_date);
$this->displayOptions = [ $this->displayOptions = [
'type' => 'daterange_default', 'type' => 'daterange_default',
......
...@@ -100,6 +100,8 @@ public function testDateOnly() { ...@@ -100,6 +100,8 @@ public function testDateOnly() {
sleep(1); sleep(1);
$end_date = $entity->{$field_name}->end_date; $end_date = $entity->{$field_name}->end_date;
$this->assertEquals($start_date->getTimestamp(), $end_date->getTimestamp()); $this->assertEquals($start_date->getTimestamp(), $end_date->getTimestamp());
$this->assertEquals('12:00:00', $start_date->format('H:i:s'));
$this->assertEquals('12:00:00', $end_date->format('H:i:s'));
} }
} }
...@@ -804,4 +804,17 @@ public function testValidateFormat() { ...@@ -804,4 +804,17 @@ public function testValidateFormat() {
$date = DateTimePlus::createFromFormat('Y-m-d H:i:s', '11-03-31 17:44:00', 'UTC', ['validate_format' => TRUE]); $date = DateTimePlus::createFromFormat('Y-m-d H:i:s', '11-03-31 17:44:00', 'UTC', ['validate_format' => TRUE]);
} }
/**
* Tests setting the default time for date-only objects.
*/
public function testDefaultDateTime() {
$utc = new \DateTimeZone('UTC');
$date = DateTimePlus::createFromFormat('Y-m-d H:i:s', '2017-05-23 22:58:00', $utc);
$this->assertEquals('22:58:00', $date->format('H:i:s'));
$date->setDefaultDateTime();
$this->assertEquals('12:00:00', $date->format('H:i:s'));
}
} }
...@@ -156,4 +156,16 @@ public function providerTestInvalidDateDiff() { ...@@ -156,4 +156,16 @@ public function providerTestInvalidDateDiff() {
]; ];
} }
/**
* Tests setting the default time for date-only objects.
*/
public function testDefaultDateTime() {
$utc = new \DateTimeZone('UTC');
$date = DrupalDateTime::createFromFormat('Y-m-d H:i:s', '2017-05-23 22:58:00', $utc, ['langcode' => 'en']);
$this->assertEquals('22:58:00', $date->format('H:i:s'));
$date->setDefaultDateTime();
$this->assertEquals('12:00:00', $date->format('H:i:s'));
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment