Commit 7d18091b authored by catch's avatar catch

Issue #2854878 by maxocub, joelpittet, mikeryan, quietone, hansrossel,...

Issue #2854878 by maxocub, joelpittet, mikeryan, quietone, hansrossel, phenaproxima: Taxonomy vocabulary with name Type cannot migrate from d6 to d8
parent 3b04db8a
...@@ -56,9 +56,9 @@ function migrate_drupal_migration_plugins_alter(&$definitions) { ...@@ -56,9 +56,9 @@ function migrate_drupal_migration_plugins_alter(&$definitions) {
$source_vid = $row->getSourceProperty('vid'); $source_vid = $row->getSourceProperty('vid');
$plugin_ids = ['d6_term_node:' . $source_vid, 'd6_term_node_revision:' . $source_vid]; $plugin_ids = ['d6_term_node:' . $source_vid, 'd6_term_node_revision:' . $source_vid];
foreach ($plugin_ids as $plugin_id) { foreach ($plugin_ids as $plugin_id) {
if (isset($definitions[$plugin_id])) { // Match the field name derivation in d6_vocabulary_field.yml.
$definitions[$plugin_id]['process'][$row->getDestinationProperty('vid')] = 'tid'; $field_name = substr('field_' . $row->getDestinationProperty('vid'), 0, 32);
} $definitions[$plugin_id]['process'][$field_name] = 'tid';
} }
} }
} }
......
...@@ -9558,6 +9558,14 @@ ...@@ -9558,6 +9558,14 @@
'objectindex' => '0', 'objectindex' => '0',
'format' => '0', 'format' => '0',
)) ))
->values(array(
'lid' => '1672',
'objectid' => '6',
'type' => 'vocabulary',
'property' => 'name',
'objectindex' => '6',
'format' => '0',
))
->execute(); ->execute();
$connection->schema()->createTable('i18n_variable', array( $connection->schema()->createTable('i18n_variable', array(
...@@ -22010,6 +22018,13 @@ ...@@ -22010,6 +22018,13 @@
'source' => '%name: Title mismatch. Please check your selection.', 'source' => '%name: Title mismatch. Please check your selection.',
'version' => 'none', 'version' => 'none',
)) ))
->values(array(
'lid' => '1672',
'location' => 'vocabulary:6:name',
'textgroup' => 'taxonomy',
'source' => 'Type',
'version' => '1',
))
->execute(); ->execute();
$connection->schema()->createTable('locales_target', array( $connection->schema()->createTable('locales_target', array(
...@@ -48226,6 +48241,20 @@ ...@@ -48226,6 +48241,20 @@
'weight' => '7', 'weight' => '7',
'language' => '', 'language' => '',
)) ))
->values(array(
'vid' => '6',
'name' => 'Type',
'description' => '',
'help' => '',
'relations' => '1',
'hierarchy' => '0',
'multiple' => '0',
'required' => '0',
'tags' => '0',
'module' => 'taxonomy',
'weight' => '0',
'language' => '',
))
->execute(); ->execute();
$connection->schema()->createTable('vocabulary_node_types', array( $connection->schema()->createTable('vocabulary_node_types', array(
...@@ -48268,6 +48297,10 @@ ...@@ -48268,6 +48297,10 @@
'vid' => '4', 'vid' => '4',
'type' => 'page', 'type' => 'page',
)) ))
->values(array(
'vid' => '6',
'type' => 'sponsor',
))
->values(array( ->values(array(
'vid' => '1', 'vid' => '1',
'type' => 'story', 'type' => 'story',
...@@ -60,7 +60,7 @@ protected function getEntityCounts() { ...@@ -60,7 +60,7 @@ protected function getEntityCounts() {
'action' => 23, 'action' => 23,
'menu' => 8, 'menu' => 8,
'taxonomy_term' => 7, 'taxonomy_term' => 7,
'taxonomy_vocabulary' => 6, 'taxonomy_vocabulary' => 7,
'tour' => 4, 'tour' => 4,
'user' => 7, 'user' => 7,
'user_role' => 6, 'user_role' => 6,
......
...@@ -11,6 +11,7 @@ source: ...@@ -11,6 +11,7 @@ source:
label: hidden label: hidden
type: entity_reference_label type: entity_reference_label
weight: 20 weight: 20
field_prefix: field_
process: process:
entity_type: 'constants/entity_type' entity_type: 'constants/entity_type'
view_mode: 'constants/view_mode' view_mode: 'constants/view_mode'
...@@ -23,10 +24,26 @@ process: ...@@ -23,10 +24,26 @@ process:
- -
plugin: skip_on_empty plugin: skip_on_empty
method: row method: row
# This value is only used in the 'field_name' process pipeline below.
raw_field_name:
-
plugin: migration_lookup
migration: d6_taxonomy_vocabulary
source: vid
-
plugin: skip_on_empty
method: row
field_name: field_name:
plugin: migration_lookup # Prepend field_ to avoid conflicts with base fields, and make sure the
migration: d6_taxonomy_vocabulary # result is no longer than 32 characters.
source: vid -
plugin: concat
source:
- constants/field_prefix
- '@raw_field_name'
-
plugin: substr
length: 32
destination: destination:
plugin: component_entity_display plugin: component_entity_display
migration_dependencies: migration_dependencies:
......
...@@ -9,6 +9,7 @@ source: ...@@ -9,6 +9,7 @@ source:
form_mode: default form_mode: default
options: options:
weight: 20 weight: 20
field_prefix: field_
process: process:
entity_type: 'constants/entity_type' entity_type: 'constants/entity_type'
form_mode: 'constants/form_mode' form_mode: 'constants/form_mode'
...@@ -27,10 +28,26 @@ process: ...@@ -27,10 +28,26 @@ process:
- -
plugin: skip_on_empty plugin: skip_on_empty
method: row method: row
# This value is only used in the 'field_name' process pipeline below.
raw_field_name:
-
plugin: migration_lookup
migration: d6_taxonomy_vocabulary
source: vid
-
plugin: skip_on_empty
method: row
field_name: field_name:
plugin: migration_lookup # Prepend field_ to avoid conflicts with base fields, and make sure the
migration: d6_taxonomy_vocabulary # result is no longer than 32 characters.
source: vid -
plugin: concat
source:
- constants/field_prefix
- '@raw_field_name'
-
plugin: substr
length: 32
destination: destination:
plugin: component_entity_form_display plugin: component_entity_form_display
migration_dependencies: migration_dependencies:
......
...@@ -8,10 +8,12 @@ source: ...@@ -8,10 +8,12 @@ source:
entity_type: node entity_type: node
type: entity_reference type: entity_reference
target_entity_type: taxonomy_term target_entity_type: taxonomy_term
field_prefix: field_
process: process:
entity_type: 'constants/entity_type' entity_type: 'constants/entity_type'
type: 'constants/type' type: 'constants/type'
field_name: # This value is only used in the 'field_name' process pipeline below.
raw_field_name:
- -
plugin: migration_lookup plugin: migration_lookup
migration: d6_taxonomy_vocabulary migration: d6_taxonomy_vocabulary
...@@ -19,6 +21,17 @@ process: ...@@ -19,6 +21,17 @@ process:
- -
plugin: skip_on_empty plugin: skip_on_empty
method: row method: row
field_name:
# Prepend field_ to avoid conflicts with base fields, and make sure the
# result is no longer than 32 characters.
-
plugin: concat
source:
- constants/field_prefix
- '@raw_field_name'
-
plugin: substr
length: 32
'settings/target_type': 'constants/target_entity_type' 'settings/target_type': 'constants/target_entity_type'
cardinality: cardinality cardinality: cardinality
destination: destination:
......
...@@ -8,6 +8,7 @@ source: ...@@ -8,6 +8,7 @@ source:
entity_type: node entity_type: node
auto_create: true auto_create: true
selection_handler: 'default:taxonomy_term' selection_handler: 'default:taxonomy_term'
field_prefix: field_
process: process:
entity_type: 'constants/entity_type' entity_type: 'constants/entity_type'
bundle: bundle:
...@@ -18,7 +19,8 @@ process: ...@@ -18,7 +19,8 @@ process:
- -
plugin: skip_on_empty plugin: skip_on_empty
method: row method: row
field_name: # This value is only used in the 'field_name' process pipeline below.
raw_field_name:
- -
plugin: migration_lookup plugin: migration_lookup
migration: d6_taxonomy_vocabulary migration: d6_taxonomy_vocabulary
...@@ -26,6 +28,17 @@ process: ...@@ -26,6 +28,17 @@ process:
- -
plugin: skip_on_empty plugin: skip_on_empty
method: row method: row
field_name:
# Prepend field_ to avoid conflicts with base fields, and make sure the
# result is no longer than 32 characters.
-
plugin: concat
source:
- constants/field_prefix
- '@raw_field_name'
-
plugin: substr
length: 32
label: name label: name
'settings/handler': 'constants/selection_handler' 'settings/handler': 'constants/selection_handler'
'settings/handler_settings/target_bundles/0': '@field_name' 'settings/handler_settings/target_bundles/0': '@field_name'
......
...@@ -89,8 +89,8 @@ public function testTaxonomyTerms() { ...@@ -89,8 +89,8 @@ public function testTaxonomyTerms() {
$language = isset($values['language']) ? $values['language'] . ' - ' : ''; $language = isset($values['language']) ? $values['language'] . ' - ' : '';
$this->assertSame("{$language}term {$tid} of vocabulary {$values['source_vid']}", $term->name->value); $this->assertSame("{$language}term {$tid} of vocabulary {$values['source_vid']}", $term->name->value);
$this->assertSame("{$language}description of term {$tid} of vocabulary {$values['source_vid']}", $term->description->value); $this->assertSame("{$language}description of term {$tid} of vocabulary {$values['source_vid']}", $term->description->value);
$this->assertIdentical($values['vid'], $term->vid->target_id); $this->assertSame($values['vid'], $term->vid->target_id);
$this->assertIdentical((string) $values['weight'], $term->weight->value); $this->assertSame((string) $values['weight'], $term->weight->value);
if ($values['parent'] === [0]) { if ($values['parent'] === [0]) {
$this->assertNull($term->parent->target_id); $this->assertNull($term->parent->target_id);
} }
...@@ -99,7 +99,7 @@ public function testTaxonomyTerms() { ...@@ -99,7 +99,7 @@ public function testTaxonomyTerms() {
foreach (\Drupal::entityManager()->getStorage('taxonomy_term')->loadParents($tid) as $parent) { foreach (\Drupal::entityManager()->getStorage('taxonomy_term')->loadParents($tid) as $parent) {
$parents[] = (int) $parent->id(); $parents[] = (int) $parent->id();
} }
$this->assertIdentical($parents, $values['parent']); $this->assertSame($parents, $values['parent']);
} }
$this->assertArrayHasKey($tid, $tree_terms, "Term $tid exists in vocabulary tree"); $this->assertArrayHasKey($tid, $tree_terms, "Term $tid exists in vocabulary tree");
......
...@@ -32,17 +32,17 @@ public function testTaxonomyVocabulary() { ...@@ -32,17 +32,17 @@ public function testTaxonomyVocabulary() {
for ($i = 0; $i < 3; $i++) { for ($i = 0; $i < 3; $i++) {
$j = $i + 1; $j = $i + 1;
$vocabulary = Vocabulary::load("vocabulary_{$j}_i_{$i}_"); $vocabulary = Vocabulary::load("vocabulary_{$j}_i_{$i}_");
$this->assertIdentical($this->getMigration('d6_taxonomy_vocabulary')->getIdMap()->lookupDestinationID([$j]), [$vocabulary->id()]); $this->assertSame($this->getMigration('d6_taxonomy_vocabulary')->getIdMap()->lookupDestinationID([$j]), [$vocabulary->id()]);
$this->assertIdentical("vocabulary $j (i=$i)", $vocabulary->label()); $this->assertSame("vocabulary $j (i=$i)", $vocabulary->label());
$this->assertIdentical("description of vocabulary $j (i=$i)", $vocabulary->getDescription()); $this->assertSame("description of vocabulary $j (i=$i)", $vocabulary->getDescription());
$this->assertIdentical($i, $vocabulary->getHierarchy()); $this->assertSame($i, $vocabulary->getHierarchy());
$this->assertIdentical(4 + $i, $vocabulary->get('weight')); $this->assertSame(4 + $i, $vocabulary->get('weight'));
} }
$vocabulary = Vocabulary::load('vocabulary_name_much_longer_than'); $vocabulary = Vocabulary::load('vocabulary_name_much_longer_than');
$this->assertIdentical('vocabulary name much longer than thirty two characters', $vocabulary->label()); $this->assertSame('vocabulary name much longer than thirty two characters', $vocabulary->label());
$this->assertIdentical('description of vocabulary name much longer than thirty two characters', $vocabulary->getDescription()); $this->assertSame('description of vocabulary name much longer than thirty two characters', $vocabulary->getDescription());
$this->assertIdentical(3, $vocabulary->getHierarchy()); $this->assertSame(3, $vocabulary->getHierarchy());
$this->assertIdentical(7, $vocabulary->get('weight')); $this->assertSame(7, $vocabulary->get('weight'));
} }
} }
...@@ -32,9 +32,9 @@ protected function setUp() { ...@@ -32,9 +32,9 @@ protected function setUp() {
*/ */
public function testTermRevisionNode() { public function testTermRevisionNode() {
$node = \Drupal::entityManager()->getStorage('node')->loadRevision(2); $node = \Drupal::entityManager()->getStorage('node')->loadRevision(2);
$this->assertIdentical(2, count($node->vocabulary_3_i_2_)); $this->assertSame(2, count($node->field_vocabulary_3_i_2_));
$this->assertIdentical('4', $node->vocabulary_3_i_2_[0]->target_id); $this->assertSame('4', $node->field_vocabulary_3_i_2_[0]->target_id);
$this->assertIdentical('5', $node->vocabulary_3_i_2_[1]->target_id); $this->assertSame('5', $node->field_vocabulary_3_i_2_[1]->target_id);
} }
} }
...@@ -40,12 +40,12 @@ public function testTermNode() { ...@@ -40,12 +40,12 @@ public function testTermNode() {
$nodes = Node::loadMultiple([1, 2]); $nodes = Node::loadMultiple([1, 2]);
$node = $nodes[1]; $node = $nodes[1];
$this->assertIdentical(1, count($node->vocabulary_1_i_0_)); $this->assertSame(1, count($node->field_vocabulary_1_i_0_));
$this->assertIdentical('1', $node->vocabulary_1_i_0_[0]->target_id); $this->assertSame('1', $node->field_vocabulary_1_i_0_[0]->target_id);
$node = $nodes[2]; $node = $nodes[2];
$this->assertIdentical(2, count($node->vocabulary_2_i_1_)); $this->assertSame(2, count($node->field_vocabulary_2_i_1_));
$this->assertIdentical('2', $node->vocabulary_2_i_1_[0]->target_id); $this->assertSame('2', $node->field_vocabulary_2_i_1_[0]->target_id);
$this->assertIdentical('3', $node->vocabulary_2_i_1_[1]->target_id); $this->assertSame('3', $node->field_vocabulary_2_i_1_[1]->target_id);
} }
/** /**
......
...@@ -41,11 +41,16 @@ public function testVocabularyEntityDisplay() { ...@@ -41,11 +41,16 @@ public function testVocabularyEntityDisplay() {
$this->executeMigration('d6_vocabulary_entity_display'); $this->executeMigration('d6_vocabulary_entity_display');
// Test that the field exists. // Test that the field exists.
$component = EntityViewDisplay::load('node.page.default')->getComponent('tags'); $component = EntityViewDisplay::load('node.page.default')->getComponent('field_tags');
$this->assertIdentical('entity_reference_label', $component['type']); $this->assertSame('entity_reference_label', $component['type']);
$this->assertIdentical(20, $component['weight']); $this->assertSame(20, $component['weight']);
// Test the Id map. // Test the Id map.
$this->assertIdentical(['node', 'article', 'default', 'tags'], $this->getMigration('d6_vocabulary_entity_display')->getIdMap()->lookupDestinationID([4, 'article'])); $this->assertSame(['node', 'article', 'default', 'field_tags'], $this->getMigration('d6_vocabulary_entity_display')->getIdMap()->lookupDestinationID([4, 'article']));
// Tests that a vocabulary named like a D8 base field will be migrated and
// prefixed with 'field_' to avoid conflicts.
$field_type = EntityViewDisplay::load('node.sponsor.default')->getComponent('field_type');
$this->assertTrue(is_array($field_type));
} }
/** /**
......
...@@ -41,16 +41,21 @@ public function testVocabularyEntityFormDisplay() { ...@@ -41,16 +41,21 @@ public function testVocabularyEntityFormDisplay() {
$this->executeMigration('d6_vocabulary_entity_form_display'); $this->executeMigration('d6_vocabulary_entity_form_display');
// Test that the field exists. // Test that the field exists.
$component = EntityFormDisplay::load('node.page.default')->getComponent('tags'); $component = EntityFormDisplay::load('node.page.default')->getComponent('field_tags');
$this->assertIdentical('options_select', $component['type']); $this->assertSame('options_select', $component['type']);
$this->assertIdentical(20, $component['weight']); $this->assertSame(20, $component['weight']);
// Test the Id map. // Test the Id map.
$this->assertIdentical(['node', 'article', 'default', 'tags'], $this->getMigration('d6_vocabulary_entity_form_display')->getIdMap()->lookupDestinationID([4, 'article'])); $this->assertSame(['node', 'article', 'default', 'field_tags'], $this->getMigration('d6_vocabulary_entity_form_display')->getIdMap()->lookupDestinationID([4, 'article']));
// Test the term widget tags setting. // Test the term widget tags setting.
$entity_form_display = EntityFormDisplay::load('node.story.default'); $entity_form_display = EntityFormDisplay::load('node.story.default');
$this->assertIdentical($entity_form_display->getComponent('vocabulary_1_i_0_')['type'], 'options_select'); $this->assertSame($entity_form_display->getComponent('field_vocabulary_1_i_0_')['type'], 'options_select');
$this->assertIdentical($entity_form_display->getComponent('vocabulary_2_i_1_')['type'], 'entity_reference_autocomplete_tags'); $this->assertSame($entity_form_display->getComponent('field_vocabulary_2_i_1_')['type'], 'entity_reference_autocomplete_tags');
// Tests that a vocabulary named like a D8 base field will be migrated and
// prefixed with 'field_' to avoid conflicts.
$field_type = EntityFormDisplay::load('node.sponsor.default')->getComponent('field_type');
$this->assertTrue(is_array($field_type));
} }
/** /**
......
...@@ -40,30 +40,35 @@ public function testVocabularyFieldInstance() { ...@@ -40,30 +40,35 @@ public function testVocabularyFieldInstance() {
$this->executeMigration('d6_vocabulary_field_instance'); $this->executeMigration('d6_vocabulary_field_instance');
// Test that the field exists. // Test that the field exists.
$field_id = 'node.article.tags'; $field_id = 'node.article.field_tags';
$field = FieldConfig::load($field_id); $field = FieldConfig::load($field_id);
$this->assertIdentical($field_id, $field->id(), 'Field instance exists on article bundle.'); $this->assertSame($field_id, $field->id(), 'Field instance exists on article bundle.');
$this->assertIdentical('Tags', $field->label()); $this->assertSame('Tags', $field->label());
$this->assertTrue($field->isRequired(), 'Field is required'); $this->assertTrue($field->isRequired(), 'Field is required');
// Test the page bundle as well. // Test the page bundle as well.
$field_id = 'node.page.tags'; $field_id = 'node.page.field_tags';
$field = FieldConfig::load($field_id); $field = FieldConfig::load($field_id);
$this->assertIdentical($field_id, $field->id(), 'Field instance exists on page bundle.'); $this->assertSame($field_id, $field->id(), 'Field instance exists on page bundle.');
$this->assertIdentical('Tags', $field->label()); $this->assertSame('Tags', $field->label());
$this->assertTrue($field->isRequired(), 'Field is required'); $this->assertTrue($field->isRequired(), 'Field is required');
$settings = $field->getSettings(); $settings = $field->getSettings();
$this->assertIdentical('default:taxonomy_term', $settings['handler'], 'The handler plugin ID is correct.'); $this->assertSame('default:taxonomy_term', $settings['handler'], 'The handler plugin ID is correct.');
$this->assertIdentical(['tags'], $settings['handler_settings']['target_bundles'], 'The target_bundles handler setting is correct.'); $this->assertSame(['field_tags'], $settings['handler_settings']['target_bundles'], 'The target_bundles handler setting is correct.');
$this->assertIdentical(TRUE, $settings['handler_settings']['auto_create'], 'The "auto_create" setting is correct.'); $this->assertSame(TRUE, $settings['handler_settings']['auto_create'], 'The "auto_create" setting is correct.');
$this->assertIdentical(['node', 'article', 'tags'], $this->getMigration('d6_vocabulary_field_instance')->getIdMap()->lookupDestinationID([4, 'article'])); $this->assertSame(['node', 'article', 'field_tags'], $this->getMigration('d6_vocabulary_field_instance')->getIdMap()->lookupDestinationID([4, 'article']));
// Test the the field vocabulary_1_i_0_. // Test the the field vocabulary_1_i_0_.
$field_id = 'node.story.vocabulary_1_i_0_'; $field_id = 'node.story.field_vocabulary_1_i_0_';
$field = FieldConfig::load($field_id); $field = FieldConfig::load($field_id);
$this->assertFalse($field->isRequired(), 'Field is not required'); $this->assertFalse($field->isRequired(), 'Field is not required');
// Tests that a vocabulary named like a D8 base field will be migrated and
// prefixed with 'field_' to avoid conflicts.
$field_type = FieldConfig::load('node.sponsor.field_type');
$this->assertInstanceOf(FieldConfig::class, $field_type);
} }
/** /**
......
...@@ -30,16 +30,21 @@ protected function setUp() { ...@@ -30,16 +30,21 @@ protected function setUp() {
*/ */
public function testVocabularyField() { public function testVocabularyField() {
// Test that the field exists. // Test that the field exists.
$field_storage_id = 'node.tags'; $field_storage_id = 'node.field_tags';
/** @var \Drupal\field\FieldStorageConfigInterface $field_storage */ /** @var \Drupal\field\FieldStorageConfigInterface $field_storage */
$field_storage = FieldStorageConfig::load($field_storage_id); $field_storage = FieldStorageConfig::load($field_storage_id);
$this->assertIdentical($field_storage_id, $field_storage->id()); $this->assertSame($field_storage_id, $field_storage->id());
$settings = $field_storage->getSettings(); $settings = $field_storage->getSettings();
$this->assertIdentical('taxonomy_term', $settings['target_type'], "Target type is correct."); $this->assertSame('taxonomy_term', $settings['target_type'], "Target type is correct.");
$this->assertIdentical(1, $field_storage->getCardinality(), "Field cardinality in 1."); $this->assertSame(1, $field_storage->getCardinality(), "Field cardinality in 1.");
$this->assertIdentical(['node', 'tags'], $this->getMigration('d6_vocabulary_field')->getIdMap()->lookupDestinationID([4]), "Test IdMap"); $this->assertSame(['node', 'field_tags'], $this->getMigration('d6_vocabulary_field')->getIdMap()->lookupDestinationID([4]), "Test IdMap");
// Tests that a vocabulary named like a D8 base field will be migrated and
// prefixed with 'field_' to avoid conflicts.
$field_type = FieldStorageConfig::load('node.field_type');
$this->assertInstanceOf(FieldStorageConfig::class, $field_type);
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment