commerce_product_bundle.install in Commerce Product Bundle 8
File
commerce_product_bundle.install
View source
<?php
use Drupal\Core\Entity\Sql\SqlContentEntityStorageException;
use Drupal\Core\Entity\Sql\SqlContentEntityStorage;
function commerce_product_bundle_update_8001() {
$database = \Drupal::database();
$field_tables = [];
$field_tables_processed = 0;
$keys = [
'primary key' => [
'entity_id',
'deleted',
'delta',
'langcode',
],
];
$field_type_manager = \Drupal::service('plugin.manager.field.field_type');
$selection_definition = $field_type_manager
->getDefinition('commerce_product_bundle_item_selection');
$selection_item_class = $selection_definition['class'];
$column_id = 'selected_qty';
$entity_type_manager = \Drupal::entityTypeManager();
$entity_field_manager = \Drupal::service('entity_field.manager');
$entity_field_map = $entity_field_manager
->getFieldMapByFieldType('commerce_product_bundle_item_selection');
$entity_storage_schema_sql = \Drupal::keyValue('entity.storage_schema.sql');
$entity_definitions_installed = \Drupal::keyValue('entity.definitions.installed');
foreach ($entity_field_map as $entity_type_id => $field_map) {
$entity_storage = $entity_type_manager
->getStorage($entity_type_id);
if (!$entity_storage instanceof SqlContentEntityStorage) {
continue;
}
$entity_type = $entity_type_manager
->getDefinition($entity_type_id);
$field_storage_definitions = $entity_field_manager
->getFieldStorageDefinitions($entity_type_id);
$table_mapping = $entity_storage
->getTableMapping($field_storage_definitions);
foreach (array_intersect_key($field_storage_definitions, $field_map) as $field_storage_definition) {
$field_name = $field_storage_definition
->getName();
try {
$table = $table_mapping
->getFieldTableName($field_name);
$selected_qty_field = $table_mapping
->getFieldColumnName($field_storage_definition, $column_id);
} catch (SqlContentEntityStorageException $e) {
continue;
}
$revision_table = NULL;
if ($entity_type
->isRevisionable() && $field_storage_definition
->isRevisionable()) {
if ($table_mapping
->requiresDedicatedTableStorage($field_storage_definition)) {
$revision_table = $table_mapping
->getDedicatedRevisionTableName($field_storage_definition);
}
elseif ($table_mapping
->allowsSharedTableStorage($field_storage_definition)) {
$revision_table = $entity_type
->getRevisionDataTable() ?: $entity_type
->getRevisionTable();
}
}
$schema_key = "{$entity_type_id}.field_schema_data.{$field_name}";
$field_schema_data = $entity_storage_schema_sql
->get($schema_key);
$field_schema = $selection_item_class::schema($field_storage_definition);
$spec = $field_schema['columns'][$column_id];
$db_column = $field_name . '_' . $column_id;
if ($field_schema_data) {
$field_schema_data[$table]['fields'][$selected_qty_field] = $spec;
$field_schema_data[$table]['fields'][$selected_qty_field]['precision'] = '17';
$field_schema_data[$table]['fields'][$selected_qty_field]['scale'] = '2';
if ($revision_table) {
$field_schema_data[$revision_table]['fields'][$selected_qty_field] = $spec;
$field_schema_data[$revision_table]['fields'][$selected_qty_field]['precision'] = '17';
$field_schema_data[$revision_table]['fields'][$selected_qty_field]['scale'] = '2';
}
$entity_storage_schema_sql
->set($schema_key, $field_schema_data);
if ($table_mapping
->allowsSharedTableStorage($field_storage_definition)) {
$key = "{$entity_type_id}.field_storage_definitions";
if ($definitions = $entity_definitions_installed
->get($key)) {
$definitions[$field_name] = $field_storage_definition;
$entity_definitions_installed
->set($key, $definitions);
}
}
if ($database
->schema()
->tableExists($table)) {
$field_tables[$table] = $database
->select($table, 't')
->fields('t')
->execute()
->fetchAll();
$database
->truncate($table)
->execute();
db_drop_primary_key($table);
$database
->schema()
->changeField($table, $db_column, $db_column, $field_schema_data[$table]['fields'][$selected_qty_field], $keys);
}
if ($database
->schema()
->tableExists($revision_table)) {
$field_tables[$revision_table] = $database
->select($revision_table, 't')
->fields('t')
->execute()
->fetchAll();
$database
->truncate($revision_table)
->execute();
db_drop_primary_key($revision_table);
$database
->schema()
->changeField($revision_table, $db_column, $db_column, $field_schema_data[$revision_table]['fields'][$selected_qty_field], $keys);
}
}
}
foreach ($field_tables as $table => $rows) {
foreach ($rows as $row) {
$database
->insert($table)
->fields((array) $row)
->execute();
}
$field_tables_processed++;
}
return t('@i bundle_item_selection fields were updated.', [
'@i' => $field_tables_processed,
]);
}
}