diff --git a/core/modules/datetime/datetime.install b/core/modules/datetime/datetime.install index 45c593c..05f4780 100644 --- a/core/modules/datetime/datetime.install +++ b/core/modules/datetime/datetime.install @@ -5,26 +5,37 @@ * Contains update functions for the Datetime module. */ +use Drupal\field\Entity\FieldStorageConfig; + /** * Update datetime fields to explicitly store UTC timezone. */ function datetime_update_8601(&$sandbox) { // Update field storage for existing datetime fields. - $entity_manager = \Drupal::entityManager(); - $entity_manager->useCaches(FALSE); + + /** @var \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager */ + $entity_type_manager = \Drupal::getContainer()->get('entity_type.manager'); + /** @var \Drupal\Core\Entity\EntityFieldManagerInterface $entity_field_manager */ + $entity_field_manager = \Drupal::getContainer()->get('entity_field.manager'); + /** @var \Drupal\Core\Entity\EntityLastInstalledSchemaRepositoryInterface $entity_last_installed_schema_repository */ + $entity_last_installed_schema_repository = \Drupal::getContainer()->get('entity.last_installed_schema.repository'); + + $entity_type_manager->useCaches(FALSE); + $entity_field_manager->useCaches(FALSE); + $change_list = []; - foreach ($entity_manager->getDefinitions() as $entity_type_id => $entity_type) { - if ($entity_manager->getStorage($entity_type_id) instanceof \Drupal\Core\Entity\Schema\DynamicallyFieldableEntityStorageSchemaInterface) { + foreach ($entity_type_manager->getDefinitions() as $entity_type_id => $entity_type) { + if ($entity_type_manager->getStorage($entity_type_id) instanceof \Drupal\Core\Entity\Schema\DynamicallyFieldableEntityStorageSchemaInterface) { $field_changes = []; - $storage_definitions = $entity_manager->getFieldStorageDefinitions($entity_type_id); - $original_storage_definitions = $entity_manager->getLastInstalledFieldStorageDefinitions($entity_type_id); + $storage_definitions = $entity_field_manager->getFieldStorageDefinitions($entity_type_id); + $original_storage_definitions = $entity_last_installed_schema_repository->getLastInstalledFieldStorageDefinitions($entity_type_id); // Detect updated field storage definitions. foreach (array_intersect_key($storage_definitions, $original_storage_definitions) as $field_name => $storage_definition) { if ($storage_definition->getType() === 'datetime') { - if ($entity_manager->getStorage($entity_type_id)->requiresFieldStorageSchemaChanges($storage_definition, $original_storage_definitions[$field_name])) { + if ($entity_type_manager->getStorage($entity_type_id)->requiresFieldStorageSchemaChanges($storage_definition, $original_storage_definitions[$field_name])) { $field_changes[$field_name] = TRUE; } } @@ -32,6 +43,7 @@ function datetime_update_8601(&$sandbox) { if ($field_changes) { $change_list[$entity_type_id] = [ + 'entity_type' => $entity_type->id(), 'field_storage_definitions' => $field_changes, 'base_table' => $entity_type->getBaseTable(), 'revision_table' => $entity_type->getRevisionTable(), @@ -81,4 +93,25 @@ function datetime_update_8601(&$sandbox) { } } } + + $definitions = \Drupal::keyValue('entity.definitions.installed')->getAll(); + $definitions_copy = $definitions; + foreach ($definitions as $item_name => $item_value) { + $suffix = '.field_storage_definitions'; + if (substr($item_name, -strlen($suffix)) == $suffix) { + foreach ($item_value as $field_name => $field_definition) { + if ($field_definition instanceof FieldStorageConfig && $field_definition->getType() === 'datetime') { + $reflection = new \ReflectionObject($field_definition); + $schema_property = $reflection->getProperty('schema'); + $schema_property->setAccessible(TRUE); + $schema = $field_definition->getSchema(); + $schema['columns']['value']['length'] = 25; + $schema_property->setValue($field_definition, $schema); + $schema_property->setAccessible(FALSE); + $definitions_copy[$item_name][$field_name] = $field_definition; + } + } + } + } + \Drupal::keyValue('entity.definitions.installed')->setMultiple($definitions_copy); }