|
|
- <?php
-
- /**
- * @file
- * Contains sample_migration.module.
- */
-
- use Drupal\Core\Routing\RouteMatchInterface;
- use \Drupal\Core\Database\Database;
-
- /**
- * Implements hook_help().
- */
- function sample_migration_help($route_name, RouteMatchInterface $route_match) {
- switch ($route_name) {
- // Main module help for the sample_migration module.
- case 'help.page.sample_migration':
- $output = '';
- $output .= '<h3>' . t('About') . '</h3>';
- $output .= '<p>' . t('Sample Migrations') . '</p>';
- return $output;
-
- default:
- }
- }
-
- /**
- * Batch Process to migrate all Title Body Field Collections from Drupal 7
- * into the Title Body Paragraphs in Drupal 8
- * You can read more about Batches in Drupal 8 here:
- * https://api.drupal.org/api/drupal/core%21includes%21form.inc/group/batch/8.5.x
- *
- * @param [type] $context
- * @return void
- */
- function sample_migration_title_body_paragraphs(&$context) {
- $entity_type_manager = \Drupal::service('entity_type.manager');
- /* @var NodeStorage $node_storage */
- $node_storage = $entity_type_manager->getStorage('node');
-
- if (empty($context['sandbox'])) {
- $context['sandbox'] = [];
- }
-
- if (!isset($context['sandbox']['progress'])) {
- $context['sandbox']['progress'] = 0;
- $context['sandbox']['current_index'] = 0;
-
- // Load all Current Nodes type of Page
- $all_pages = $node_storage->loadByProperties([
- 'type' => 'page'
- ]);
-
- // Need to set a bunch of data on the sandbox key to keep it on every loop through the batch process
- $context['sandbox']['page_content'] = array_values($all_pages);
- $context['sandbox']['title_page_fc'] = sample_migration_get_title_body_field_collections();
- $context['sandbox']['test_paragraph_map'] = sample_migration_get_test_paragraph_content_map();
-
- $context['sandbox']['index'] = array_values($context['sandbox']['page_content']);
- $context['sandbox']['max'] = count($context['sandbox']['page_content']);
- }
-
- $limit = 10;
- $indexes = range($context['sandbox']['current_index'], $context['sandbox']['current_index'] + $limit);
-
- // here is each loop through the batch process
- foreach ($indexes as $index) {
- // based on index get the current field collection item I'm on
- // use a bunch of ifs to make sure we can proceed without breaking everything
- $current_result = $context['sandbox']['title_page_fc'][$index];
- if (!is_null($current_result)) {
- $d7_nid = $current_result->entity_id;
- if (!is_null($context['sandbox']['title_page_fc'][$index])) {
- $d8_nid = $context['sandbox']['test_paragraph_map'][$d7_nid]->destid1;
- if (!is_null($d8_nid)) {
- // if we made it this far it's safe to try and create a paragraph
- // Once the paragraph data is setup pass it to our create paragraph function
- $paragraph_data = [
- 'field_title' => $current_result->field_fc_title_value,
- 'field_body' => [
- 'value' => $current_result->field_fc_body_value,
- 'format' => 'full_html',
- ],
- 'field_drupal7_item_id' => $current_result->field_test_paragraphs_content_value,
- 'parent_type' => 'node',
- 'type' => 'title_body',
- 'status' => '1',
- 'parent_field_name' => 'field_content',
- 'parent_id' => $d8_nid
- ];
- sample_migration_create_title_body_paragraph($current_result, $paragraph_data);
- }
- }
- }
-
- $context['sandbox']['progress']++;
- $context['sandbox']['current_index'] = $index;
- $context['message'] = t('Now processing Paragraphs');
- }
-
- // Update batch on our progress.
- if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
- $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
- }
- else {
- $context['sandbox']['finished'] = 1;
- }
- }
-
- /**
- * Simple batch process finished function
- *
- * @param [type] $success
- * @param [type] $results
- * @param [type] $operations
- * @return void
- */
- function sample_migration_title_body_paragraphs_finished($success, $results, $operations) {
- $messenger = \Drupal::messenger();
- if ($success) {
- $message = t('@count Reviews were added to Groups', ['@count' => count($results)]);
- $messenger->addMessage($message);
- }
- else {
- // Something went wrong
- $error_operation = reset($operations);
- $messenger->addMessage(
- t('An error occurred while processing @operation with arguments : @args',
- [
- '@operation' => $error_operation[0],
- '@args' => print_r($error_operation[0], TRUE)
- ]
- )
- );
- }
- }
-
- /**
- * Undocumented function
- *
- * @return void
- */
- function sample_migration_get_title_body_field_collections() {
- Database::setActiveConnection('drupal7');
- $drupal7db = Database::getConnection();
- $query = $drupal7db->select('field_data_field_test_paragraphs_content', 'fc');
- $query->fields('fc', [
- 'entity_id',
- 'field_test_paragraphs_content_value',
- 'delta'
- ]);
- $query->innerJoin('field_collection_item', 'fci', 'fc.entity_id = fci.item_id');
- $query->fields('fci', [
- 'item_id',
- 'field_name',
- 'revision_id'
- ]);
- $query->innerJoin('field_data_field_fc_title', 'title', 'title.entity_id = fci.item_id');
- $query->fields('title', [
- 'entity_type',
- 'bundle',
- 'entity_id',
- 'field_fc_title_value'
- ]);
- $query->innerJoin('field_data_field_fc_body', 'body', 'body.entity_id = fci.item_id');
- $query->fields('body', [
- 'entity_type',
- 'field_fc_body_value',
- 'field_fc_body_format',
- 'bundle',
- 'entity_id'
- ]);
-
- $results = $query->execute()->fetchAll();
- Database::setActiveConnection('default');
- return $results;
- }
-
- /**
- * Undocumented function
- *
- * @return void
- */
- function sample_migration_get_test_paragraph_content_map() {
- $drupal8db = Database::getConnection();
- $query = $drupal8db->select('migrate_map_d7_node__test_paragraphs', 'mm');
- $query->fields('mm', [
- 'sourceid1',
- 'destid1'
- ]);
- $map_results = $query->execute()->fetchAllAssoc('sourceid1');
- return $map_results;
- }
-
- /**
- * Create / Update a paragraph based on the data passed into it
- *
- * @param [type] $current_result
- * @param [type] $paragraph_data
- * @return void
- */
- function sample_migration_create_title_body_paragraph($current_result, $paragraph_data) {
- $paragraph_storage = \Drupal::entityTypeManager()->getStorage('paragraph');
- $node_storage = \Drupal::entityTypeManager()->getStorage('node');
-
- // check if paragraph already exists, if so we need to update it
- // we set field_drupal7_item_id on it so we can make sure we aren't duplicating paragraphs
- // so we don't build a million paragraphs
- $existing_paragraph = $paragraph_storage->loadByProperties([
- 'field_drupal7_item_id' => $current_result->field_test_paragraphs_content_value
- ]);
- if (!is_null($existing_paragraph) && count($existing_paragraph)) {
- $this_paragraph = reset($existing_paragraph);
- }
- else {
- $this_paragraph = $paragraph_storage->create($paragraph_data);
- $this_paragraph->save();
- }
-
- // attach paragraph to node
- $parent_node = $node_storage->load($current_result->entity_id);
- if (!is_null($parent_node)) {
- // parent field name
- $field_name = 'field_content';
-
- // find all paragraphs already on the node so we don't add this one twice
- // also so we don't delete a paragraph by adding a new one
- $node_paragraphs = $parent_node->get($field_name)->getValue();
- $should_add_paragraph = true;
- if (count($node_paragraphs)) {
- foreach ($node_paragraphs as $node_paragraph) {
- if ($node_paragraph['target_id'] === $this_paragraph->id()) {
- // if this paragraph is alrady attached, there is no reason to attach it again
- $should_add_paragraph = false;
- break;
- }
- }
- }
- if ($should_add_paragraph) {
- // add this paragraph to the paragraphs array on the node and save it
- $node_paragraphs[] = [
- 'target_id' => $this_paragraph->id(),
- 'target_revision_id' => $this_paragraph->getRevisionId()
- ];
- $parent_node->set($field_name, $node_paragraphs);
- $parent_node->save();
- }
- }
- else {
- \Drupal::messenger()->addMessage(t("Unable to attach paragraph to content. Paragraph ID: " . $this_paragraph->id()), 'error');
- \Drupal::logger('joco_migrations')->error("Unable to attach paragraph to content. Paragraph ID: " . $this_paragraph->id());
- }
- }
|