commerce_product_bundle-8.x-1.x-dev/commerce_product_bundle.install

commerce_product_bundle.install
<?php

/**
 * @file
 */

use Drupal\Core\Entity\Sql\SqlContentEntityStorageException;
use Drupal\Core\Entity\Sql\SqlContentEntityStorage;

/**
 * Update the 'commerce_product_bundle_item_selection' 'selected_qty' column.
 */
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');
  /** @var \Drupal\commerce_product_bundle\Plugin\Field\FieldType\BundleItemSelection $selection_item_class */
  $selection_item_class = $selection_definition['class'];
  $column_id = 'selected_qty';

  $entity_type_manager = \Drupal::entityTypeManager();
  /** @var \Drupal\Core\Entity\EntityFieldManagerInterface $entity_field_manager */
  $entity_field_manager = \Drupal::service('entity_field.manager');
  $entity_field_map = $entity_field_manager->getFieldMapByFieldType('commerce_product_bundle_item_selection');
  // The key-value collection for tracking installed storage schema.
  $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);
    // Only SQL storage based entities are supported / throw known exception.
    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);
    /** @var \Drupal\Core\Entity\Sql\DefaultTableMapping $table_mapping */
    $table_mapping = $entity_storage->getTableMapping($field_storage_definitions);
    /** @var \Drupal\Core\Field\FieldStorageDefinitionInterface $field_storage_definition */
    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;
      }
      // See if the field has a revision table.
      $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();
        }
      }
      // Load the installed field schema so that it can be updated.
      $schema_key = "$entity_type_id.field_schema_data.$field_name";
      $field_schema_data = $entity_storage_schema_sql->get($schema_key);

      // Update 'selected_qty' field from integer to decimal.
      $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';
        }

        // Save changes to the installed field schema.
        $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]);
  }

}

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

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