Same name and namespace in other branches
  1. 8.9.x core/modules/migrate_drupal/migrate_drupal.module \migrate_drupal_migration_plugins_alter()
  2. 9 core/modules/migrate_drupal/migrate_drupal.module \migrate_drupal_migration_plugins_alter()

Implements hook_migration_plugins_alter().

1 call to migrate_drupal_migration_plugins_alter()
NodeMigrationTypePluginAlterTest::testMigrationPluginAlter in core/modules/migrate_drupal/tests/src/Kernel/NodeMigrationTypePluginAlterTest.php
Tests the assignment of the node migration type.

File

core/modules/migrate_drupal/migrate_drupal.module, line 32
Provides migration from other Drupal sites.

Code

function migrate_drupal_migration_plugins_alter(array &$definitions) {
  $module_handler = \Drupal::service('module_handler');
  $migration_plugin_manager = \Drupal::service('plugin.manager.migration');

  // This is why the deriver can't do this: the 'd6_taxonomy_vocabulary'
  // definition is not available to the deriver as it is running inside
  // getDefinitions().
  if (isset($definitions['d6_taxonomy_vocabulary'])) {
    $vocabulary_migration_definition = [
      'source' => [
        'ignore_map' => TRUE,
        'plugin' => 'd6_taxonomy_vocabulary',
      ],
      'destination' => [
        'plugin' => 'null',
      ],
      'idMap' => [
        'plugin' => 'null',
      ],
    ];
    $vocabulary_migration = $migration_plugin_manager
      ->createStubMigration($vocabulary_migration_definition);
    $translation_active = $module_handler
      ->moduleExists('content_translation');
    try {
      $source_plugin = $vocabulary_migration
        ->getSourcePlugin();
      if ($source_plugin instanceof RequirementsInterface) {
        $source_plugin
          ->checkRequirements();
      }
      $executable = new MigrateExecutable($vocabulary_migration);
      $process = [
        'vid' => $definitions['d6_taxonomy_vocabulary']['process']['vid'],
      ];
      foreach ($source_plugin as $row) {
        $executable
          ->processRow($row, $process);
        $source_vid = $row
          ->getSourceProperty('vid');
        $plugin_ids = [
          'd6_term_node:' . $source_vid,
          'd6_term_node_revision:' . $source_vid,
        ];
        if ($translation_active) {
          $plugin_ids[] = 'd6_term_node_translation:' . $source_vid;
        }
        foreach (array_intersect($plugin_ids, array_keys($definitions)) as $plugin_id) {

          // Match the field name derivation in d6_vocabulary_field.yml.
          $field_name = substr('field_' . $row
            ->getDestinationProperty('vid'), 0, 32);

          // The Forum module is expecting 'taxonomy_forums' as the field name
          // for the forum nodes. The 'forum_vocabulary' source property is
          // evaluated in Drupal\taxonomy\Plugin\migrate\source\d6\Vocabulary
          // and is set to true if the vocabulary vid being migrated is the
          // same as the one in the 'forum_nav_vocabulary' variable on the
          // source site.
          $destination_vid = $row
            ->getSourceProperty('forum_vocabulary') ? 'taxonomy_forums' : $field_name;
          $definitions[$plugin_id]['process'][$destination_vid] = 'tid';
        }
      }
    } catch (RequirementsException $e) {

      // This code currently runs whenever the definitions are being loaded and
      // if you have a Drupal 7 source site then the requirements will not be
      // met for the d6_taxonomy_vocabulary migration.
    } catch (DatabaseExceptionWrapper $e) {

      // When the definitions are loaded it is possible the tables will not
      // exist.
    }
  }
  if (!$module_handler
    ->moduleExists('node')) {
    return;
  }
  $connection = \Drupal::database();

  // We need to get the version of the source database in order to check
  // if the classic or complete node tables have been used in a migration.
  if (isset($definitions['system_site'])) {

    // Use the source plugin of the system_site migration to get the
    // database connection.
    $migration = $definitions['system_site'];

    /** @var \Drupal\migrate\Plugin\migrate\source\SqlBase $source_plugin */
    $source_plugin = $migration_plugin_manager
      ->createStubMigration($migration)
      ->getSourcePlugin();
    try {
      $source_connection = $source_plugin
        ->getDatabase();
      $version = NodeMigrateType::getLegacyDrupalVersion($source_connection);
    } catch (\Exception $e) {
      \Drupal::messenger()
        ->addError(t('Failed to connect to your database server. The server reports the following message: %error.<ul><li>Is the database server running?</li><li>Does the database exist, and have you entered the correct database name?</li><li>Have you entered the correct username and password?</li><li>Have you entered the correct database hostname?</li></ul>', [
        '%error' => $e
          ->getMessage(),
      ]));
    }
  }

  // If this is a complete node migration then for all migrations, except the
  // classic node migrations, replace any dependency on a classic node migration
  // with a dependency on the complete node migration.
  if (NodeMigrateType::getNodeMigrateType($connection, $version ?? FALSE) === NodeMigrateType::NODE_MIGRATE_TYPE_COMPLETE) {
    $classic_migration_match = '/d([67])_(node|node_translation|node_revision|node_entity_translation)($|:.*)/';
    $replace_with_complete_migration = function (&$value, $key, $classic_migration_match) {
      if (is_string($value)) {
        $value = preg_replace($classic_migration_match, 'd$1_node_complete$3', $value);
      }
    };
    foreach ($definitions as &$definition) {
      $is_node_classic_migration = preg_match($classic_migration_match, $definition['id']);
      if (!$is_node_classic_migration && isset($definition['migration_dependencies'])) {
        array_walk_recursive($definition['migration_dependencies'], $replace_with_complete_migration, $classic_migration_match);
      }
    }
  }
}