diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/ChangedItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/ChangedItem.php index 9f2096f26eb08507dbc2415e330f75d2451949b7..9c53665ab55831e36f112dabfdee6993c806d5be 100644 --- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/ChangedItem.php +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/ChangedItem.php @@ -13,7 +13,7 @@ * label = @Translation("Last changed"), * description = @Translation("An entity field containing a UNIX timestamp of when the entity has been last updated."), * no_ui = TRUE, - * default_widget = "datetime_default", + * default_widget = "datetime_timestamp", * default_formatter = "timestamp", * list_class = "\Drupal\Core\Field\ChangedFieldItemList" * ) diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/CreatedItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/CreatedItem.php index 228c8e6bbac15c0228cf72443a6d02c020b0eebd..da2e2a74506b31ae2f3e9b0f380c632776c17619 100644 --- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/CreatedItem.php +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/CreatedItem.php @@ -10,7 +10,7 @@ * label = @Translation("Created"), * description = @Translation("An entity field containing a UNIX timestamp of when the entity has been created."), * no_ui = TRUE, - * default_widget = "datetime_default", + * default_widget = "datetime_timestamp", * default_formatter = "timestamp" * ) */ diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/TimestampItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/TimestampItem.php index f48e4f01cac608a4c81416694c4fa850f086ecaf..8c3ffd2119243ae23d19c063e64be856943d32a1 100644 --- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/TimestampItem.php +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/TimestampItem.php @@ -13,7 +13,7 @@ * id = "timestamp", * label = @Translation("Timestamp"), * description = @Translation("An entity field containing a UNIX timestamp value."), - * default_widget = "datetime_default", + * default_widget = "datetime_timestamp", * default_formatter = "timestamp", * constraints = { * "ComplexData" = { diff --git a/core/modules/system/system.post_update.php b/core/modules/system/system.post_update.php index 01f304b2083c966bf29cc81daf5b405188f1638a..e123f91fc90d51dc0a958ad99154416454a5b271 100644 --- a/core/modules/system/system.post_update.php +++ b/core/modules/system/system.post_update.php @@ -65,3 +65,21 @@ function system_post_update_add_region_to_entity_displays() { function system_post_update_hashes_clear_cache() { // Empty post-update hook. } + +/** + * @addtogroup updates-8.3.x + * @{ + */ + +/** + * Force plugin definitions to be cleared. + * + * @see https://www.drupal.org/node/2802663 + */ +function system_post_update_timestamp_plugins() { + // Empty post-update hook. +} + +/** + * @} End of "addtogroup uupdates-8.3.x". + */ diff --git a/core/tests/Drupal/FunctionalTests/Datetime/TimestampTest.php b/core/tests/Drupal/FunctionalTests/Datetime/TimestampTest.php new file mode 100644 index 0000000000000000000000000000000000000000..8faf8c6c915e047554b1c12a145cb15a850dec9f --- /dev/null +++ b/core/tests/Drupal/FunctionalTests/Datetime/TimestampTest.php @@ -0,0 +1,149 @@ +drupalCreateUser([ + 'access content', + 'view test entity', + 'administer entity_test content', + 'administer entity_test form display', + 'administer content types', + 'administer node fields', + ]); + + $this->drupalLogin($web_user); + $field_name = 'field_timestamp'; + $type = 'timestamp'; + $widget_type = 'datetime_timestamp'; + $formatter_type = 'timestamp'; + + $this->fieldStorage = FieldStorageConfig::create([ + 'field_name' => $field_name, + 'entity_type' => 'entity_test', + 'type' => $type, + ]); + $this->fieldStorage->save(); + $this->field = FieldConfig::create([ + 'field_storage' => $this->fieldStorage, + 'bundle' => 'entity_test', + 'required' => TRUE, + ]); + $this->field->save(); + + EntityFormDisplay::load('entity_test.entity_test.default') + ->setComponent($field_name, ['type' => $widget_type]) + ->save(); + + $this->displayOptions = [ + 'type' => $formatter_type, + 'label' => 'hidden', + ]; + + EntityViewDisplay::create([ + 'targetEntityType' => $this->field->getTargetEntityTypeId(), + 'bundle' => $this->field->getTargetBundle(), + 'mode' => 'full', + 'status' => TRUE, + ])->setComponent($field_name, $this->displayOptions) + ->save(); + } + + /** + * Tests the "datetime_timestamp" widget. + */ + public function testWidget() { + // Build up a date in the UTC timezone. + $value = '2012-12-31 00:00:00'; + $date = new DrupalDateTime($value, 'UTC'); + + // Update the timezone to the system default. + $date->setTimezone(timezone_open(drupal_get_user_timezone())); + + // Display creation form. + $this->drupalGet('entity_test/add'); + + // Make sure the "datetime_timestamp" widget is on the page. + $fields = $this->xpath('//div[contains(@class, "field--widget-datetime-timestamp") and @id="edit-field-timestamp-wrapper"]'); + $this->assertEquals(1, count($fields)); + + // Look for the widget elements and make sure they are empty. + $this->assertSession()->fieldExists('field_timestamp[0][value][date]'); + $this->assertSession()->fieldValueEquals('field_timestamp[0][value][date]', ''); + $this->assertSession()->fieldExists('field_timestamp[0][value][time]'); + $this->assertSession()->fieldValueEquals('field_timestamp[0][value][time]', ''); + + // Submit the date. + $date_format = DateFormat::load('html_date')->getPattern(); + $time_format = DateFormat::load('html_time')->getPattern(); + + $edit = [ + 'field_timestamp[0][value][date]' => $date->format($date_format), + 'field_timestamp[0][value][time]' => $date->format($time_format), + ]; + $this->drupalPostForm(NULL, $edit, 'Save'); + + // Make sure the submitted date is set as the default in the widget. + $this->assertSession()->fieldExists('field_timestamp[0][value][date]'); + $this->assertSession()->fieldValueEquals('field_timestamp[0][value][date]', $date->format($date_format)); + $this->assertSession()->fieldExists('field_timestamp[0][value][time]'); + $this->assertSession()->fieldValueEquals('field_timestamp[0][value][time]', $date->format($time_format)); + + // Make sure the entity was saved. + preg_match('|entity_test/manage/(\d+)|', $this->getSession()->getCurrentUrl(), $match); + $id = $match[1]; + $this->assertSession()->pageTextContains(sprintf('entity_test %s has been created.', $id)); + + // Make sure the timestamp is output properly with the default formatter. + $medium = DateFormat::load('medium')->getPattern(); + $this->drupalGet('entity_test/' . $id); + $this->assertSession()->pageTextContains($date->format($medium)); + } + +}