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();
      }
    }
  }
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc