Not quite working take 1

This commit is contained in:
benjamin melançon 2023-11-16 10:26:59 -05:00
parent 9df071a382
commit 0839ceb2d8

View file

@ -1,5 +1,7 @@
<?php <?php
use Psr\Log\LogLevel;
/** /**
* Entity query helper. * Entity query helper.
*/ */
@ -38,7 +40,6 @@ function migration_helpers_entity_query(
* Move (and optionally filter/transform) terms between term reference fields. * Move (and optionally filter/transform) terms between term reference fields.
*/ */
function migration_helpers_move_terms( function migration_helpers_move_terms(
$source_vocabulary,
$destination_vocabulary, $destination_vocabulary,
$source_field, $source_field,
$destination_field, $destination_field,
@ -51,15 +52,62 @@ function migration_helpers_move_terms(
// Destination bundle is also required but we default to making it // Destination bundle is also required but we default to making it
// the same as the source bundle. // the same as the source bundle.
$destination_bundle ??= $source_bundle; $destination_bundle ??= $source_bundle;
print("
$source_entity_type, /** @var \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager */
$source_bundle, $entity_type_manager = \Drupal::service('entity_type.manager');
$source_field,
$destination_entity_type, // Get any existing terms in destination vocabulary so we can efficiently
$destination_bundle, // prevent duplication.
$destination_field, $terms = migration_helpers_entity_query(
$source_vocabulary, entity_type: 'taxonomy_term',
$destination_vocabulary"); bundle: $destination_vocabulary,
);
$term_data = [];
foreach ($terms as $term) {
$term_data[$term->id()] = $term->label();
}
$nodes = migration_helpers_entity_query($source_entity_type, $source_bundle, $source_field);
foreach ($nodes as $node) {
$tids = [];
/** @var \Drupal\node\NodeInterface $node */
$orig_values = $node->get($source_field);
foreach ($orig_values as $orig_value) {
$tid = $orig_value->target_id;
$orig_term = $entity_type_manager->getStorage('taxonomy_term')->load($tid);
$orig = $orig_term->name->value;
$term_name = $mapping[$orig] ?? $orig;
// If our map intentionally blanked out the term name, do not create
// a term in the new vocabulary and assign it to the destination field.
// Note, the term must be blanked out ('') or assigned to FALSE in the
// mapping, setting a term to NULL is the same as not mapping it, and it
// would be created in the new vocab etc.
if (!$term_name) {
continue;
}
$tid = array_search($term_name, $term_data);
if (empty($tid)) {
$new_term = $entity_type_manager->getStorage('taxonomy_term')->create([
'name' => $term_name,
'vid' => $destination_vocabulary,
]);
$new_term->save();
$tid = $new_term->id();
\Drupal::logger('mass')->log(LogLevel::INFO, "Term $term_name created with TID $tid in focus area vocabulary.");
$tids[] = $tid;
}
}
// Now we have collected all the term IDs that have been created.
// We have to go through a surprising number of hoops to make our
$already_there_tids = [];
$already_there_values = $node->get($destination_field);
foreach ($already_there_values as $already_there_value) {
$already_there_tids[] = $already_there_value->target_id;
}
$node->set($destination_field, array_merge($tids, $already_there_tids));
$node->save();
}
} }
// The below almost serve more as examples that can be followed // The below almost serve more as examples that can be followed