diff --git a/core/modules/datetime/datetime.install b/core/modules/datetime/datetime.install new file mode 100644 index 0000000..856f3a6 --- /dev/null +++ b/core/modules/datetime/datetime.install @@ -0,0 +1,103 @@ +getDefinitions() as $entity_type_id => $entity_type) { + $storage = \Drupal::entityTypeManager()->getStorage($entity_type_id); + if ($storage instanceof DynamicallyFieldableEntityStorageSchemaInterface) { + $field_changes = []; + $field_storage_definitions = \Drupal::service('entity_field.manager')->getFieldStorageDefinitions($entity_type_id); + $original_storage_definitions = \Drupal::service('entity.last_installed_schema.repository')->getLastInstalledFieldStorageDefinitions($entity_type_id); + foreach (array_intersect_key($field_storage_definitions, $original_storage_definitions) as $field_name => $storage_definition) { + if ($storage_definition->getType() === 'datetime' && $storage->requiresFieldStorageSchemaChanges($storage_definition, $original_storage_definitions[$field_name])) { + /** @var \Drupal\Core\Entity\Sql\DefaultTableMapping $table_mapping */ + $table_mapping = $storage->getTableMapping(); + $field_changes[$field_name] = $table_mapping->getFieldTableName($field_name); + } + } + + if (!empty($field_changes)) { + + + $change_list[$entity_type_id] = [ + 'field_storage_definitions' => $field_changes, + 'revision_table' => $entity_type->getRevisionTable(), + ]; + } + } + } + + $sandbox['change_list'] = $change_list; + $sandbox['max'] = count($change_list); + } + + $remaining = array_diff(array_keys($sandbox['change_list']), $sandbox['processed']); + if (!empty($remaining)) { + $entity_type_id = array_pop($remaining); + $field_changes = $sandbox['change_list'][$entity_type_id]; + + $field_spec = [ + 'description' => 'The date timezone.', + 'type' => 'varchar', + 'length' => 50, + ]; + $schema = Database::getConnection()->schema(); + + foreach ($field_changes['field_storage_definitions'] as $field_name => $field_table) { + $timezone_field_name = $field_name . '_timezone'; + $field_schema = [ + 'fields' => [ + // Include the 'value' field in order to properly create the index. + $field_name . '_value' => [ + 'description' => 'The date value.', + 'type' => 'varchar', + 'length' => 20, + ], + $timezone_field_name => $field_spec, + ], + 'indexes' => [ + 'value_timezone' => [$field_name . '_value', $timezone_field_name], + ], + ]; + $base_table = $field_changes['base_table'] . '__' . $field_name; + $schema->addField($field_table, $timezone_field_name, $field_spec); + $schema->addIndex($field_table, 'value_timezone', $field_schema['indexes']['value_timezone'], $field_schema); + + if ($field_changes['revision_table']) { + $revision_table = $field_changes['revision_table'] . '__' . $field_name; + $schema->addField($revision_table, $timezone_field_name, $field_spec); + $schema->addIndex($revision_table, 'value_timezone', $field_schema['indexes']['value_timezone'], $field_schema); + } + + // Set timezone handling to 'user', which is the behavior prior to the + // introduction of configurable timezone handling. + $field_storage = FieldStorageConfig::load($entity_type_id . '.' . $field_name); + $field_storage->setSetting('timezone_handling', DateTimeItem::TIMEZONE_USER); + \Drupal::entityDefinitionUpdateManager() + ->updateFieldStorageDefinition($field_storage); + } + $sandbox['processed'][] = $entity_type_id; + } + + $sandbox['#finished'] = empty($remaining); +}