metatag.module | 32 +++++++++++++++++-- .../d7_metatag_field_instance_widget_settings.yml | 1 + .../source/d7/MetatagFieldInstanceDeriver.php | 37 ++++++++++++++++++++-- 3 files changed, 65 insertions(+), 5 deletions(-) diff --git a/metatag.module b/metatag.module index 0653214..64be628 100644 --- a/metatag.module +++ b/metatag.module @@ -830,12 +830,38 @@ function metatag_migration_plugins_alter(array &$definitions) { 'plugin' => 'd7_metatag_entities', 'source' => 'pseudo_metatag_entities', ]; - $definition['migration_dependencies']['optional'][] = 'd7_metatag_field'; - $definition['migration_dependencies']['optional'][] = 'd7_metatag_field_instance'; + $destination_plugin_parts = explode(':', $definition['destination']['plugin']); + $entity_destination_plugins = ['entity', 'entity_complete']; + $entity_type_id = in_array($destination_plugin_parts[0], $entity_destination_plugins, TRUE) ? + $destination_plugin_parts[1] : NULL; + $bundle_id = $definition['destination']['default_bundle'] ?? NULL; + + // When there are no bundle derivatives, make e.g. the d7_node_complete + // migration depend on: + // - d7_metatag_field:node + // - d7_metatag_field_instance:node + // - d7_field_instance_widget:node + // but if there is a bundle derivative such as d7_node_complete:article, + // then instead make it depend on: + // - d7_metatag_field:node + // - d7_metatag_field_instance:node:article + // - d7_field_instance_widget:node:article + // Either way, this matches the dependencies used by for example + // d7_node_complete, which has dependencies on d7_field_instance and + // d7_comment_field_instance to ensure correct migration order. + if ($bundle_id && isset($definitions["d7_metatag_field_instance:$entity_type_id:$bundle_id"])) { + $definition['migration_dependencies']['required'][] = "d7_metatag_field:$entity_type_id"; + $definition['migration_dependencies']['required'][] = "d7_metatag_field_instance:$entity_type_id:$bundle_id"; + $definition['migration_dependencies']['required'][] = "d7_metatag_field_instance_widget_settings:$entity_type_id:$bundle_id"; + } + elseif (isset($definitions["d7_metatag_field_instance:$entity_type_id"])) { + $definition['migration_dependencies']['required'][] = "d7_metatag_field:$entity_type_id"; + $definition['migration_dependencies']['required'][] = "d7_metatag_field_instance:$entity_type_id"; + $definition['migration_dependencies']['required'][] = "d7_metatag_field_instance_widget_settings:$entity_type_id"; + } } } } - \Drupal::classResolver(MigrationPluginAlterer::class)->alterMigrationPlugins($definitions); } /** diff --git a/migrations/d7_metatag_field_instance_widget_settings.yml b/migrations/d7_metatag_field_instance_widget_settings.yml index 3d456e9..789770f 100644 --- a/migrations/d7_metatag_field_instance_widget_settings.yml +++ b/migrations/d7_metatag_field_instance_widget_settings.yml @@ -7,6 +7,7 @@ label: Metatag field instance widget settings migration_tags: - Drupal 7 - Configuration +deriver: Drupal\metatag\Plugin\migrate\source\d7\MetatagFieldInstanceDeriver source: plugin: d7_metatag_field_instance source_module: metatag diff --git a/src/Plugin/migrate/source/d7/MetatagFieldInstanceDeriver.php b/src/Plugin/migrate/source/d7/MetatagFieldInstanceDeriver.php index 0b73988..c4d0aaa 100644 --- a/src/Plugin/migrate/source/d7/MetatagFieldInstanceDeriver.php +++ b/src/Plugin/migrate/source/d7/MetatagFieldInstanceDeriver.php @@ -13,7 +13,7 @@ use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase; use Symfony\Component\DependencyInjection\ContainerInterface; /** - * @todo. + * Deriver for d7_metatag_field_instance and d7_metatag_field_instance_widget_settings. */ class MetatagFieldInstanceDeriver extends DeriverBase implements ContainerDeriverInterface { @@ -62,7 +62,7 @@ class MetatagFieldInstanceDeriver extends DeriverBase implements ContainerDerive * {@inheritdoc} */ public function getDerivativeDefinitions($base_plugin_definition) { - $source = $this->getSourcePlugin('d7_metatag_field_instance'); + $source = $this->getSourcePlugin($base_plugin_definition['source']['plugin']); assert($source instanceof DrupalSqlBase); try { @@ -157,6 +157,31 @@ class MetatagFieldInstanceDeriver extends DeriverBase implements ContainerDerive '@type' => $bundle_label, '@entity-type-label' => $this->entityTypeManager->getDefinition($entity_type_id)->getPluralLabel(), ]); + // :: suffix for dependencies on + // d7_metatag_field_instance. + foreach (['d7_metatag_field_instance'] as $dep_id) { + $dependency_index = array_search($dep_id, $this->derivatives[$derivative_id]['migration_dependencies']['required']); + if ($dependency_index !== FALSE) { + $this->derivatives[$derivative_id]['migration_dependencies']['required'][$dependency_index] .= ":$entity_type_id:$bundle_id"; + } + } + // Add bundle dependency. + switch ($entity_type_id) { + case 'node': + $this->derivatives[$derivative_id]['migration_dependencies']['required'][] = "d7_node_type:$bundle_id"; + break; + case 'taxonomy_term': + $this->derivatives[$derivative_id]['migration_dependencies']['required'][] = "d7_taxonomy_vocabulary:$bundle_id"; + break; + } + + // : suffix for dependencies on d7_metatag_field. + foreach (['d7_metatag_field'] as $dep_id) { + $dependency_index = array_search($dep_id, $this->derivatives[$derivative_id]['migration_dependencies']['required']); + if ($dependency_index !== FALSE) { + $this->derivatives[$derivative_id]['migration_dependencies']['required'][$dependency_index] .= ":$entity_type_id"; + } + } } } // If we don't have per-bundle results, we will derive only a @@ -168,6 +193,14 @@ class MetatagFieldInstanceDeriver extends DeriverBase implements ContainerDerive '@label' => $base_plugin_definition['label'], '@type' => $this->entityTypeManager->getDefinition($entity_type_id)->getPluralLabel(), ]); + // : suffix for dependencies on + // d7_metatag_field and d7_metatag_field_instance. + foreach (['d7_metatag_field', 'd7_metatag_field_instance'] as $dep_id) { + $dependency_index = array_search($dep_id, $this->derivatives[$entity_type_id]['migration_dependencies']['required']); + if ($dependency_index !== FALSE) { + $this->derivatives[$entity_type_id]['migration_dependencies']['required'][$dependency_index] .= ":$entity_type_id"; + } + } } }