Issue #2854878 by maxocub, joelpittet, mikeryan, quietone, hansrossel, phenaproxima: Taxonomy vocabulary with name Type cannot migrate from d6 to d8
parent
3b04db8ada
commit
7d18091bc1
|
@ -56,9 +56,9 @@ function migrate_drupal_migration_plugins_alter(&$definitions) {
|
|||
$source_vid = $row->getSourceProperty('vid');
|
||||
$plugin_ids = ['d6_term_node:' . $source_vid, 'd6_term_node_revision:' . $source_vid];
|
||||
foreach ($plugin_ids as $plugin_id) {
|
||||
if (isset($definitions[$plugin_id])) {
|
||||
$definitions[$plugin_id]['process'][$row->getDestinationProperty('vid')] = 'tid';
|
||||
}
|
||||
// Match the field name derivation in d6_vocabulary_field.yml.
|
||||
$field_name = substr('field_' . $row->getDestinationProperty('vid'), 0, 32);
|
||||
$definitions[$plugin_id]['process'][$field_name] = 'tid';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9558,6 +9558,14 @@ $connection->insert('i18n_strings')
|
|||
'objectindex' => '0',
|
||||
'format' => '0',
|
||||
))
|
||||
->values(array(
|
||||
'lid' => '1672',
|
||||
'objectid' => '6',
|
||||
'type' => 'vocabulary',
|
||||
'property' => 'name',
|
||||
'objectindex' => '6',
|
||||
'format' => '0',
|
||||
))
|
||||
->execute();
|
||||
|
||||
$connection->schema()->createTable('i18n_variable', array(
|
||||
|
@ -22010,6 +22018,13 @@ $connection->insert('locales_source')
|
|||
'source' => '%name: Title mismatch. Please check your selection.',
|
||||
'version' => 'none',
|
||||
))
|
||||
->values(array(
|
||||
'lid' => '1672',
|
||||
'location' => 'vocabulary:6:name',
|
||||
'textgroup' => 'taxonomy',
|
||||
'source' => 'Type',
|
||||
'version' => '1',
|
||||
))
|
||||
->execute();
|
||||
|
||||
$connection->schema()->createTable('locales_target', array(
|
||||
|
@ -48226,6 +48241,20 @@ $connection->insert('vocabulary')
|
|||
'weight' => '7',
|
||||
'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();
|
||||
|
||||
$connection->schema()->createTable('vocabulary_node_types', array(
|
||||
|
@ -48268,6 +48297,10 @@ $connection->insert('vocabulary_node_types')
|
|||
'vid' => '4',
|
||||
'type' => 'page',
|
||||
))
|
||||
->values(array(
|
||||
'vid' => '6',
|
||||
'type' => 'sponsor',
|
||||
))
|
||||
->values(array(
|
||||
'vid' => '1',
|
||||
'type' => 'story',
|
||||
|
|
|
@ -60,7 +60,7 @@ class MigrateUpgrade6Test extends MigrateUpgradeTestBase {
|
|||
'action' => 23,
|
||||
'menu' => 8,
|
||||
'taxonomy_term' => 7,
|
||||
'taxonomy_vocabulary' => 6,
|
||||
'taxonomy_vocabulary' => 7,
|
||||
'tour' => 4,
|
||||
'user' => 7,
|
||||
'user_role' => 6,
|
||||
|
|
|
@ -11,6 +11,7 @@ source:
|
|||
label: hidden
|
||||
type: entity_reference_label
|
||||
weight: 20
|
||||
field_prefix: field_
|
||||
process:
|
||||
entity_type: 'constants/entity_type'
|
||||
view_mode: 'constants/view_mode'
|
||||
|
@ -23,10 +24,26 @@ process:
|
|||
-
|
||||
plugin: skip_on_empty
|
||||
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:
|
||||
plugin: migration_lookup
|
||||
migration: d6_taxonomy_vocabulary
|
||||
source: vid
|
||||
# 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
|
||||
destination:
|
||||
plugin: component_entity_display
|
||||
migration_dependencies:
|
||||
|
|
|
@ -9,6 +9,7 @@ source:
|
|||
form_mode: default
|
||||
options:
|
||||
weight: 20
|
||||
field_prefix: field_
|
||||
process:
|
||||
entity_type: 'constants/entity_type'
|
||||
form_mode: 'constants/form_mode'
|
||||
|
@ -27,10 +28,26 @@ process:
|
|||
-
|
||||
plugin: skip_on_empty
|
||||
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:
|
||||
plugin: migration_lookup
|
||||
migration: d6_taxonomy_vocabulary
|
||||
source: vid
|
||||
# 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
|
||||
destination:
|
||||
plugin: component_entity_form_display
|
||||
migration_dependencies:
|
||||
|
|
|
@ -8,10 +8,12 @@ source:
|
|||
entity_type: node
|
||||
type: entity_reference
|
||||
target_entity_type: taxonomy_term
|
||||
field_prefix: field_
|
||||
process:
|
||||
entity_type: 'constants/entity_type'
|
||||
type: 'constants/type'
|
||||
field_name:
|
||||
# This value is only used in the 'field_name' process pipeline below.
|
||||
raw_field_name:
|
||||
-
|
||||
plugin: migration_lookup
|
||||
migration: d6_taxonomy_vocabulary
|
||||
|
@ -19,6 +21,17 @@ process:
|
|||
-
|
||||
plugin: skip_on_empty
|
||||
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'
|
||||
cardinality: cardinality
|
||||
destination:
|
||||
|
|
|
@ -8,6 +8,7 @@ source:
|
|||
entity_type: node
|
||||
auto_create: true
|
||||
selection_handler: 'default:taxonomy_term'
|
||||
field_prefix: field_
|
||||
process:
|
||||
entity_type: 'constants/entity_type'
|
||||
bundle:
|
||||
|
@ -18,7 +19,8 @@ process:
|
|||
-
|
||||
plugin: skip_on_empty
|
||||
method: row
|
||||
field_name:
|
||||
# This value is only used in the 'field_name' process pipeline below.
|
||||
raw_field_name:
|
||||
-
|
||||
plugin: migration_lookup
|
||||
migration: d6_taxonomy_vocabulary
|
||||
|
@ -26,6 +28,17 @@ process:
|
|||
-
|
||||
plugin: skip_on_empty
|
||||
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
|
||||
'settings/handler': 'constants/selection_handler'
|
||||
'settings/handler_settings/target_bundles/0': '@field_name'
|
||||
|
|
|
@ -89,8 +89,8 @@ class MigrateTaxonomyTermTest extends MigrateDrupal6TestBase {
|
|||
$language = isset($values['language']) ? $values['language'] . ' - ' : '';
|
||||
$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->assertIdentical($values['vid'], $term->vid->target_id);
|
||||
$this->assertIdentical((string) $values['weight'], $term->weight->value);
|
||||
$this->assertSame($values['vid'], $term->vid->target_id);
|
||||
$this->assertSame((string) $values['weight'], $term->weight->value);
|
||||
if ($values['parent'] === [0]) {
|
||||
$this->assertNull($term->parent->target_id);
|
||||
}
|
||||
|
@ -99,7 +99,7 @@ class MigrateTaxonomyTermTest extends MigrateDrupal6TestBase {
|
|||
foreach (\Drupal::entityManager()->getStorage('taxonomy_term')->loadParents($tid) as $parent) {
|
||||
$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");
|
||||
|
|
|
@ -32,17 +32,17 @@ class MigrateTaxonomyVocabularyTest extends MigrateDrupal6TestBase {
|
|||
for ($i = 0; $i < 3; $i++) {
|
||||
$j = $i + 1;
|
||||
$vocabulary = Vocabulary::load("vocabulary_{$j}_i_{$i}_");
|
||||
$this->assertIdentical($this->getMigration('d6_taxonomy_vocabulary')->getIdMap()->lookupDestinationID([$j]), [$vocabulary->id()]);
|
||||
$this->assertIdentical("vocabulary $j (i=$i)", $vocabulary->label());
|
||||
$this->assertIdentical("description of vocabulary $j (i=$i)", $vocabulary->getDescription());
|
||||
$this->assertIdentical($i, $vocabulary->getHierarchy());
|
||||
$this->assertIdentical(4 + $i, $vocabulary->get('weight'));
|
||||
$this->assertSame($this->getMigration('d6_taxonomy_vocabulary')->getIdMap()->lookupDestinationID([$j]), [$vocabulary->id()]);
|
||||
$this->assertSame("vocabulary $j (i=$i)", $vocabulary->label());
|
||||
$this->assertSame("description of vocabulary $j (i=$i)", $vocabulary->getDescription());
|
||||
$this->assertSame($i, $vocabulary->getHierarchy());
|
||||
$this->assertSame(4 + $i, $vocabulary->get('weight'));
|
||||
}
|
||||
$vocabulary = Vocabulary::load('vocabulary_name_much_longer_than');
|
||||
$this->assertIdentical('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->assertIdentical(3, $vocabulary->getHierarchy());
|
||||
$this->assertIdentical(7, $vocabulary->get('weight'));
|
||||
$this->assertSame('vocabulary name much longer than thirty two characters', $vocabulary->label());
|
||||
$this->assertSame('description of vocabulary name much longer than thirty two characters', $vocabulary->getDescription());
|
||||
$this->assertSame(3, $vocabulary->getHierarchy());
|
||||
$this->assertSame(7, $vocabulary->get('weight'));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -32,9 +32,9 @@ class MigrateTermNodeRevisionTest extends MigrateDrupal6TestBase {
|
|||
*/
|
||||
public function testTermRevisionNode() {
|
||||
$node = \Drupal::entityManager()->getStorage('node')->loadRevision(2);
|
||||
$this->assertIdentical(2, count($node->vocabulary_3_i_2_));
|
||||
$this->assertIdentical('4', $node->vocabulary_3_i_2_[0]->target_id);
|
||||
$this->assertIdentical('5', $node->vocabulary_3_i_2_[1]->target_id);
|
||||
$this->assertSame(2, count($node->field_vocabulary_3_i_2_));
|
||||
$this->assertSame('4', $node->field_vocabulary_3_i_2_[0]->target_id);
|
||||
$this->assertSame('5', $node->field_vocabulary_3_i_2_[1]->target_id);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -40,12 +40,12 @@ class MigrateTermNodeTest extends MigrateDrupal6TestBase {
|
|||
|
||||
$nodes = Node::loadMultiple([1, 2]);
|
||||
$node = $nodes[1];
|
||||
$this->assertIdentical(1, count($node->vocabulary_1_i_0_));
|
||||
$this->assertIdentical('1', $node->vocabulary_1_i_0_[0]->target_id);
|
||||
$this->assertSame(1, count($node->field_vocabulary_1_i_0_));
|
||||
$this->assertSame('1', $node->field_vocabulary_1_i_0_[0]->target_id);
|
||||
$node = $nodes[2];
|
||||
$this->assertIdentical(2, count($node->vocabulary_2_i_1_));
|
||||
$this->assertIdentical('2', $node->vocabulary_2_i_1_[0]->target_id);
|
||||
$this->assertIdentical('3', $node->vocabulary_2_i_1_[1]->target_id);
|
||||
$this->assertSame(2, count($node->field_vocabulary_2_i_1_));
|
||||
$this->assertSame('2', $node->field_vocabulary_2_i_1_[0]->target_id);
|
||||
$this->assertSame('3', $node->field_vocabulary_2_i_1_[1]->target_id);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -41,11 +41,16 @@ class MigrateVocabularyEntityDisplayTest extends MigrateDrupal6TestBase {
|
|||
$this->executeMigration('d6_vocabulary_entity_display');
|
||||
|
||||
// Test that the field exists.
|
||||
$component = EntityViewDisplay::load('node.page.default')->getComponent('tags');
|
||||
$this->assertIdentical('entity_reference_label', $component['type']);
|
||||
$this->assertIdentical(20, $component['weight']);
|
||||
$component = EntityViewDisplay::load('node.page.default')->getComponent('field_tags');
|
||||
$this->assertSame('entity_reference_label', $component['type']);
|
||||
$this->assertSame(20, $component['weight']);
|
||||
// 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 @@ class MigrateVocabularyEntityFormDisplayTest extends MigrateDrupal6TestBase {
|
|||
$this->executeMigration('d6_vocabulary_entity_form_display');
|
||||
|
||||
// Test that the field exists.
|
||||
$component = EntityFormDisplay::load('node.page.default')->getComponent('tags');
|
||||
$this->assertIdentical('options_select', $component['type']);
|
||||
$this->assertIdentical(20, $component['weight']);
|
||||
$component = EntityFormDisplay::load('node.page.default')->getComponent('field_tags');
|
||||
$this->assertSame('options_select', $component['type']);
|
||||
$this->assertSame(20, $component['weight']);
|
||||
// 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.
|
||||
$entity_form_display = EntityFormDisplay::load('node.story.default');
|
||||
$this->assertIdentical($entity_form_display->getComponent('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_1_i_0_')['type'], 'options_select');
|
||||
$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 @@ class MigrateVocabularyFieldInstanceTest extends MigrateDrupal6TestBase {
|
|||
$this->executeMigration('d6_vocabulary_field_instance');
|
||||
|
||||
// Test that the field exists.
|
||||
$field_id = 'node.article.tags';
|
||||
$field_id = 'node.article.field_tags';
|
||||
$field = FieldConfig::load($field_id);
|
||||
$this->assertIdentical($field_id, $field->id(), 'Field instance exists on article bundle.');
|
||||
$this->assertIdentical('Tags', $field->label());
|
||||
$this->assertSame($field_id, $field->id(), 'Field instance exists on article bundle.');
|
||||
$this->assertSame('Tags', $field->label());
|
||||
$this->assertTrue($field->isRequired(), 'Field is required');
|
||||
|
||||
// Test the page bundle as well.
|
||||
$field_id = 'node.page.tags';
|
||||
$field_id = 'node.page.field_tags';
|
||||
$field = FieldConfig::load($field_id);
|
||||
$this->assertIdentical($field_id, $field->id(), 'Field instance exists on page bundle.');
|
||||
$this->assertIdentical('Tags', $field->label());
|
||||
$this->assertSame($field_id, $field->id(), 'Field instance exists on page bundle.');
|
||||
$this->assertSame('Tags', $field->label());
|
||||
$this->assertTrue($field->isRequired(), 'Field is required');
|
||||
|
||||
$settings = $field->getSettings();
|
||||
$this->assertIdentical('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->assertIdentical(TRUE, $settings['handler_settings']['auto_create'], 'The "auto_create" setting is correct.');
|
||||
$this->assertSame('default:taxonomy_term', $settings['handler'], 'The handler plugin ID is correct.');
|
||||
$this->assertSame(['field_tags'], $settings['handler_settings']['target_bundles'], 'The target_bundles handler 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_.
|
||||
$field_id = 'node.story.vocabulary_1_i_0_';
|
||||
$field_id = 'node.story.field_vocabulary_1_i_0_';
|
||||
$field = FieldConfig::load($field_id);
|
||||
$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 @@ class MigrateVocabularyFieldTest extends MigrateDrupal6TestBase {
|
|||
*/
|
||||
public function testVocabularyField() {
|
||||
// Test that the field exists.
|
||||
$field_storage_id = 'node.tags';
|
||||
$field_storage_id = 'node.field_tags';
|
||||
/** @var \Drupal\field\FieldStorageConfigInterface $field_storage */
|
||||
$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();
|
||||
$this->assertIdentical('taxonomy_term', $settings['target_type'], "Target type is correct.");
|
||||
$this->assertIdentical(1, $field_storage->getCardinality(), "Field cardinality in 1.");
|
||||
$this->assertSame('taxonomy_term', $settings['target_type'], "Target type is correct.");
|
||||
$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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue