pluginreference-2.0.0/pluginreference.install
pluginreference.install
<?php
/**
* @file
* Provides install hooks for the pluginreference module.
*/
use Drupal\Core\Entity\Sql\SqlEntityStorageInterface;
/**
* Move all plugin_reference fields data from _value to _plugin_id.
*/
function pluginreference_update_9001() {
$field_type = 'plugin_reference';
$schema = \Drupal::database()->schema();
$entity_type_manager = \Drupal::entityTypeManager();
$entity_field_manager = \Drupal::service('entity_field.manager');
$entity_field_map = $entity_field_manager->getFieldMapByFieldType($field_type);
$entity_storage_schema_sql = \Drupal::keyValue('entity.storage_schema.sql');
/** @var \Drupal\Core\Entity\EntityLastInstalledSchemaRepositoryInterface $last_installed_schema_repository */
$last_installed_schema_repository = \Drupal::service('entity.last_installed_schema.repository');
$specification = [
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
];
foreach ($entity_field_map as $entity_type_id => $fields) {
$entity_storage = $entity_type_manager->getStorage($entity_type_id);
if (!$entity_storage instanceof SqlEntityStorageInterface) {
continue;
}
/** @var \Drupal\Core\Entity\EntityTypeInterface $entity_type */
$entity_type = $entity_type_manager->getDefinition($entity_type_id);
// Loads definitions for all fields.
$entity_field_storage_definitions = $entity_field_manager->getFieldStorageDefinitions($entity_type_id);
/** @var \Drupal\Core\Entity\Sql\DefaultTableMapping $table_mapping */
$table_mapping = $entity_storage->getTableMapping($entity_field_storage_definitions);
// Intersect plugin_reference fields with storage definitions for all
// fields.
/** @var \Drupal\Core\Field\FieldStorageDefinitionInterface[] $field_definitions */
$field_definitions = array_intersect_key($entity_field_storage_definitions, $fields);
// Iterate over all plugin_reference field definitions for this entity type.
foreach ($field_definitions as $field_definition) {
$field_name = $field_definition->getName();
$tables = [];
$tables[] = $table_mapping->getFieldTableName($field_name);
if ($entity_type->isRevisionable() && $field_definition->isRevisionable()) {
$tables[] = $table_mapping->getDedicatedRevisionTableName($field_definition);
}
// Field type column names map to real table column names.
$columns = $table_mapping->getColumnNames($field_name);
$plugin_id_column_name = $columns['plugin_id'];
$old_field_name = $field_name . '_value';
foreach ($tables as $table) {
$schema->changeField($table, $old_field_name, $plugin_id_column_name, $specification);
}
// Update the tracked entity table schema.
$schema_key = "$entity_type_id.field_schema_data.$field_name";
$field_schema_data = $entity_storage_schema_sql->get($schema_key);
foreach ($field_schema_data as $table_name => $field_schema) {
// Type is now 'text'.
$field_schema_data[$table_name]['fields'][$plugin_id_column_name] = $specification;
// Type previously was 'varchar', remove the length portion.
unset($field_schema_data[$table_name]['fields'][$old_field_name]);
}
$entity_storage_schema_sql->set($schema_key, $field_schema_data);
$definitions = $last_installed_schema_repository->getLastInstalledFieldStorageDefinitions($entity_type_id);
$definitions[$field_name] = $field_definition;
$last_installed_schema_repository->setLastInstalledFieldStorageDefinitions($entity_type_id, $definitions);
}
}
}
/**
* Add an index to the plugin_id column.
*/
function pluginreference_update_9002() {
$field_type = 'plugin_reference';
$schema = \Drupal::database()->schema();
$entity_type_manager = \Drupal::entityTypeManager();
$entity_field_manager = \Drupal::service('entity_field.manager');
$entity_field_map = $entity_field_manager->getFieldMapByFieldType($field_type);
$entity_storage_schema_sql = \Drupal::keyValue('entity.storage_schema.sql');
/** @var \Drupal\Core\Entity\EntityLastInstalledSchemaRepositoryInterface $last_installed_schema_repository */
$last_installed_schema_repository = \Drupal::service('entity.last_installed_schema.repository');
foreach ($entity_field_map as $entity_type_id => $fields) {
$entity_storage = $entity_type_manager->getStorage($entity_type_id);
if (!$entity_storage instanceof SqlEntityStorageInterface) {
continue;
}
/** @var \Drupal\Core\Entity\EntityTypeInterface $entity_type */
$entity_type = $entity_type_manager->getDefinition($entity_type_id);
// Loads definitions for all fields.
$entity_field_storage_definitions = $entity_field_manager->getFieldStorageDefinitions($entity_type_id);
/** @var \Drupal\Core\Entity\Sql\DefaultTableMapping $table_mapping */
$table_mapping = $entity_storage->getTableMapping($entity_field_storage_definitions);
// Intersect plugin_reference fields with storage definitions for all
// fields.
/** @var \Drupal\Core\Field\FieldStorageDefinitionInterface[] $field_definitions */
$field_definitions = array_intersect_key($entity_field_storage_definitions, $fields);
// Iterate over all plugin_reference field definitions for this entity type.
foreach ($field_definitions as $field_definition) {
$field_name = $field_definition->getName();
$tables = [];
$tables[] = $table_mapping->getFieldTableName($field_name);
if ($entity_type->isRevisionable() && $field_definition->isRevisionable()) {
$tables[] = $table_mapping->getDedicatedRevisionTableName($field_definition);
}
$columns = $table_mapping->getColumnNames($field_name);
$plugin_id_column_name = $columns['plugin_id'];
$schema_key = "$entity_type_id.field_schema_data.$field_name";
$field_schema_data = $entity_storage_schema_sql->get($schema_key);
// Add the index and update the field_schema_data.
foreach ($tables as $table) {
if (!$schema->indexExists($table, $plugin_id_column_name)) {
$schema->addIndex($table, $plugin_id_column_name, [$plugin_id_column_name], $field_schema_data[$table]);
$field_schema_data[$table]['indexes'][$plugin_id_column_name] = [$plugin_id_column_name];
$field_schema_data[$table]['fields'][$plugin_id_column_name]['not null'] = TRUE;
}
}
$entity_storage_schema_sql->set($schema_key, $field_schema_data);
$definitions = $last_installed_schema_repository->getLastInstalledFieldStorageDefinitions($entity_type_id);
$definitions[$field_name] = $field_definition;
$last_installed_schema_repository->setLastInstalledFieldStorageDefinitions($entity_type_id, $definitions);
}
}
}
/**
* Add configuration column to plugin_reference fields.
*/
function pluginreference_update_9003() {
$field_type = 'plugin_reference';
$connection = \Drupal::database();
$schema = $connection->schema();
$entity_type_manager = \Drupal::entityTypeManager();
$entity_field_manager = \Drupal::service('entity_field.manager');
$entity_field_map = $entity_field_manager->getFieldMapByFieldType($field_type);
$entity_storage_schema_sql = \Drupal::keyValue('entity.storage_schema.sql');
/** @var \Drupal\Core\Entity\EntityLastInstalledSchemaRepositoryInterface $last_installed_schema_repository */
$last_installed_schema_repository = \Drupal::service('entity.last_installed_schema.repository');
$specification = [
'description' => 'Serialized array of plugin configuration.',
'type' => 'blob',
'size' => 'big',
'serialize' => TRUE,
'not null' => FALSE,
];
foreach ($entity_field_map as $entity_type_id => $fields) {
$entity_storage = $entity_type_manager->getStorage($entity_type_id);
if (!$entity_storage instanceof SqlEntityStorageInterface) {
continue;
}
/** @var \Drupal\Core\Entity\EntityTypeInterface $entity_type */
$entity_type = $entity_type_manager->getDefinition($entity_type_id);
// Loads definitions for all fields.
$entity_field_storage_definitions = $entity_field_manager->getFieldStorageDefinitions($entity_type_id);
/** @var \Drupal\Core\Entity\Sql\DefaultTableMapping $table_mapping */
$table_mapping = $entity_storage->getTableMapping($entity_field_storage_definitions);
// Intersect plugin_reference fields with storage definitions for all
// fields.
/** @var \Drupal\Core\Field\FieldStorageDefinitionInterface[] $field_definitions */
$field_definitions = array_intersect_key($entity_field_storage_definitions, $fields);
// Iterate over all plugin_reference field definitions for this entity type.
foreach ($field_definitions as $field_definition) {
$field_name = $field_definition->getName();
$tables = [];
$tables[] = $table_mapping->getFieldTableName($field_name);
if ($entity_type->isRevisionable() && $field_definition->isRevisionable()) {
$tables[] = $table_mapping->getDedicatedRevisionTableName($field_definition);
}
$columns = $table_mapping->getColumnNames($field_name);
$plugin_configuration_column_name = $columns['configuration'];
$schema_key = "$entity_type_id.field_schema_data.$field_name";
$field_schema_data = $entity_storage_schema_sql->get($schema_key);
// Add the configuration column and add to the field_schema_data.
foreach ($tables as $table) {
if (!$schema->fieldExists($table, $plugin_configuration_column_name)) {
$schema->addField($table, $plugin_configuration_column_name, $specification);
$field_schema_data[$table]['fields'][$plugin_configuration_column_name] = $specification;
}
}
$entity_storage_schema_sql->set($schema_key, $field_schema_data);
$definitions = $last_installed_schema_repository->getLastInstalledFieldStorageDefinitions($entity_type_id);
$definitions[$field_name] = $field_definition;
$last_installed_schema_repository->setLastInstalledFieldStorageDefinitions($entity_type_id, $definitions);
// Set default empty array.
foreach ($tables as $table) {
$connection->update($table)
->fields([
$plugin_configuration_column_name => serialize([]),
])
->isNull($plugin_configuration_column_name)
->execute();
}
}
}
}
