diff --git a/metatag.module b/metatag.module index da1d1bf..79c0c82 100644 --- a/metatag.module +++ b/metatag.module @@ -5,12 +5,18 @@ * Contains metatag.module. */ +use Drupal\Core\Database\Query\SelectInterface; use Drupal\Core\Entity\ContentEntityInterface; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\Display\EntityViewDisplayInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Routing\RouteMatchInterface; use Drupal\Core\Url; +use Drupal\migrate\Plugin\migrate\destination\EntityContentBase; +use Drupal\migrate\Plugin\migrate\source\SqlBase; +use Drupal\migrate\Plugin\MigrateSourceInterface; +use Drupal\migrate\Plugin\MigrationInterface; +use Drupal\migrate\Row; /** * Implements hook_help(). @@ -308,3 +314,65 @@ function metatag_get_default_tags() { return $metatags->get('tags'); } + +/** + * Implement hook_migrate_prepare_row(). + * + * @param Row $row + * @param MigrateSourceInterface $source + * @param MigrationInterface $migration + * @return bool + */ +function metatag_migrate_prepare_row(Row $row, MigrateSourceInterface $source, MigrationInterface $migration) { + // @todo Write a more general version rather than hard-coded. + $source_can_have_metatags = in_array($source->getPluginId(), [ + 'd7_node', + 'd7_node_revision', + 'taxonomy_term', + 'd7_user' + ]); + if ($source_can_have_metatags && $migration->getDestinationPlugin() instanceof EntityContentBase) { + $entity_type = NULL; + $entity_id = NULL; + $revision_id = NULL; + + // @todo Write a more general version rather than switch statement. + switch ($source->getPluginId()) { + case 'd7_node': + case 'd7_node_revision': + $entity_type = 'node'; + $entity_id = $row->getSourceProperty('nid'); + $revision_id = $row->getSourceProperty('vid'); + break; + + case 'taxonomy_term': + $entity_type = 'taxonomy_term'; + $entity_id = $row->getSourceProperty('tid'); + break; + + case 'd7_user': + $entity_type = 'user'; + $entity_id = $row->getSourceProperty('uid'); + break; + + } + + /** @var SqlBase $source */ + $db = $source->getDatabase(); + /** @var SelectInterface $query */ + $query = $db->select('metatag', 'm') + ->fields('m', ['data']) + ->condition('entity_type', $entity_type) + ->condition('entity_id', $entity_id); + if (!is_null($revision_id)) { + $query->condition('revision_id', $revision_id); + } + $metatag_value = []; + foreach ($query->execute() as $metatag_row) { + $metatag_value[]['value'] = $metatag_row->data; + } + $row->setSourceProperty('field_metatag', $metatag_value); + } + + return TRUE; +} diff --git a/metatag.services.yml b/metatag.services.yml index ab98d77..a2a8770 100644 --- a/metatag.services.yml +++ b/metatag.services.yml @@ -14,3 +14,8 @@ services: metatag.manager: class: Drupal\metatag\MetatagManager arguments: ['@plugin.manager.metatag.group', '@plugin.manager.metatag.tag', '@metatag.token', '@logger.factory'] + + metatag.migration_subscriber: + class: Drupal\metatag\EventSubscriber\MigrationSubscriber + tags: + - { name: event_subscriber } diff --git a/migration_templates/d7_metatag_field.yml b/migration_templates/d7_metatag_field.yml new file mode 100644 index 0000000..db2d65a --- /dev/null +++ b/migration_templates/d7_metatag_field.yml @@ -0,0 +1,19 @@ +id: d7_metatag_field +label: Metatag field +migration_tags: + - Drupal 7 +source: + plugin: d7_metatag_field + constants: + status: true + langcode: und + field_name: field_metatag + type: metatag +process: + entity_type: entity_type + status: 'constants/status' + langcode: 'constants/langcode' + field_name: 'constants/field_name' + type: 'constants/type' +destination: + plugin: entity:field_storage_config diff --git a/migration_templates/d7_metatag_field_instance.yml b/migration_templates/d7_metatag_field_instance.yml new file mode 100644 index 0000000..40ffd17 --- /dev/null +++ b/migration_templates/d7_metatag_field_instance.yml @@ -0,0 +1,20 @@ +id: d7_metatag_field_instance +label: Metatag field instance +migration_tags: + - Drupal 7 +source: + plugin: d7_metatag_field_instance + constants: + field_name: field_metatag + label: Metatags +process: + entity_type: entity_type + field_name: 'constants/field_name' + bundle: bundle + label: 'constants/label' +destination: + plugin: entity:field_config +migration_dependencies: + required: + - d7_metatag_field + - d7_node_type diff --git a/migration_templates/d7_metatag_field_instance_widget_settings.yml b/migration_templates/d7_metatag_field_instance_widget_settings.yml new file mode 100644 index 0000000..e8d78b7 --- /dev/null +++ b/migration_templates/d7_metatag_field_instance_widget_settings.yml @@ -0,0 +1,20 @@ +id: d7_metatag_field_instance_widget_settings +label: Metatag field instance widget settings +migration_tags: + - Drupal 7 +source: + plugin: d7_metatag_field_instance + constants: + form_mode: default + field_name: field_metatag + entity_type: node +process: + bundle: bundle + form_mode: 'constants/form_mode' + field_name: 'constants/field_name' + entity_type: 'constants/entity_type' +destination: + plugin: component_entity_form_display +migration_dependencies: + required: + - d7_metatag_field_instance diff --git a/src/EventSubscriber/MigrationSubscriber.php b/src/EventSubscriber/MigrationSubscriber.php new file mode 100644 index 0000000..cb94ff1 --- /dev/null +++ b/src/EventSubscriber/MigrationSubscriber.php @@ -0,0 +1,49 @@ +getMigration(); + if ($migration->getDestinationPlugin() instanceof EntityContentBase) { + $process = $migration->getProcess(); + $process['field_metatag'] = 'field_metatag'; + $migration->setProcess($process); + + $migration_dependencies = $migration->getMigrationDependencies(); + $migration_dependencies['required'][] = 'd7_metatag_field_instance'; + $migration->set('migration_dependencies', $migration_dependencies); + } + } + +} diff --git a/src/Plugin/migrate/source/d7/MetatagField.php b/src/Plugin/migrate/source/d7/MetatagField.php new file mode 100644 index 0000000..48fb524 --- /dev/null +++ b/src/Plugin/migrate/source/d7/MetatagField.php @@ -0,0 +1,46 @@ +select('metatag', 'm') + ->fields('m', ['entity_type']) + ->groupBy('entity_type'); + } + + /** + * {@inheritdoc} + */ + public function fields() { + $fields = array('entity_type' => $this->t('Entity type')); + return $fields; + } + + /** + * {@inheritdoc} + */ + public function getIds() { + $ids['entity_type']['type'] = 'string'; + return $ids; + } + +} diff --git a/src/Plugin/migrate/source/d7/MetatagFieldInstance.php b/src/Plugin/migrate/source/d7/MetatagFieldInstance.php new file mode 100644 index 0000000..b41305a --- /dev/null +++ b/src/Plugin/migrate/source/d7/MetatagFieldInstance.php @@ -0,0 +1,69 @@ +select('metatag', 'm') + ->fields('m', ['entity_type']) + ->groupBy('entity_type'); + } + + /** + * {@inheritdoc} + */ + public function fields() { + return array( + 'entity_type' => $this->t('Entity type'), + 'bundle' => $this->t('Bundle'), + ); + } + + /** + * Returns each entity_type/bundle pair. + */ + public function initializeIterator() { + $bundles = []; + foreach (parent::initializeIterator() as $instance) { + $bundle_info = \Drupal::getContainer() + ->get('entity_type.bundle.info') + ->getBundleInfo($instance['entity_type']); + foreach (array_keys($bundle_info) as $bundle) { + $bundles[] = [ + 'entity_type' => $instance['entity_type'], + 'bundle' => $bundle + ]; + } + } + return new \ArrayIterator($bundles); + } + + /** + * {@inheritdoc} + */ + public function getIds() { + $ids['entity_type']['type'] = 'string'; + $ids['bundle']['type'] = 'string'; + return $ids; + } + +} diff --git a/src/Tests/MetatagNodeTranslationTest.php b/src/Tests/MetatagNodeTranslationTest.php index 8175966..7ef39a4 100644 --- a/src/Tests/MetatagNodeTranslationTest.php +++ b/src/Tests/MetatagNodeTranslationTest.php @@ -28,6 +28,7 @@ class MetatagNodeTranslationTest extends WebTestBase { 'field_ui', 'metatag', 'node', + 'migrate', ]; /**