Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 

253 wiersze
8.3 KiB

<?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());
}
}