diff -u b/core/modules/field/migration_templates/d7_field.yml b/core/modules/field/migration_templates/d7_field.yml --- b/core/modules/field/migration_templates/d7_field.yml +++ b/core/modules/field/migration_templates/d7_field.yml @@ -34,7 +34,10 @@ phone: telephone text_long: text_long text_with_summary: text_with_summary - translatable: 'constants/status' + # Translatable is not migrated and the Drupal 8 default of true is used. + # If translatble is false in field storage then the field can not be + # set to translatable via the UI. + #translatable: translatable cardinality: cardinality settings: plugin: d7_field_settings diff -u b/core/modules/node/migration_templates/d7_node_translation.yml b/core/modules/node/migration_templates/d7_node.yml --- b/core/modules/node/migration_templates/d7_node_translation.yml +++ b/core/modules/node/migration_templates/d7_node.yml @@ -1,14 +1,16 @@ -id: d7_node_translation -label: Node translations +id: d7_node +label: Nodes migration_tags: - Drupal 7 deriver: Drupal\node\Plugin\migrate\D7NodeDeriver source: plugin: d7_node - translations: true process: + # In D7, nodes always have a tnid, but it's zero for untranslated nodes. + # We normalize it to equal the nid in that case. + # @see \Drupal\node\Plugin\migrate\source\d7\Node::prepareRow(). nid: tnid - type: type + vid: vid langcode: plugin: default_value source: language @@ -28,9 +30,6 @@ - translations: true migration_dependencies: required: - d7_user - d7_node_type - - language optional: - d7_field_instance -provider: migrate_drupal only in patch2: unchanged: --- a/core/modules/field/migration_templates/d7_field_instance.yml +++ b/core/modules/field/migration_templates/d7_field_instance.yml @@ -27,6 +27,7 @@ process: source: - default_value - widget_settings + translatable: translatable destination: plugin: entity:field_config migration_dependencies: only in patch2: unchanged: --- a/core/modules/field/src/Plugin/migrate/source/d7/FieldInstance.php +++ b/core/modules/field/src/Plugin/migrate/source/d7/FieldInstance.php @@ -26,6 +26,7 @@ public function query() { ->condition('fc.deleted', 0) ->condition('fc.storage_active', 1) ->fields('fc', array('type')); + $query->addField('fc', 'data', 'data_fc'); $query->innerJoin('field_config', 'fc', 'fci.field_id = fc.id'); @@ -81,6 +82,19 @@ public function prepareRow(Row $row) { // This is for parity with the d6_field_instance plugin. $row->setSourceProperty('widget_type', $data['widget']['type']); + // If node translations are enabled for this content type, set translatable + // to true. + $translatable = FALSE; + if ($row->getSourceProperty('entity_type') == 'node') { + if ($this->variableGet('language_content_type_' . $row->getSourceProperty('bundle'), 0) == 2) { + $translatable = TRUE; + } + } + else { + $data = unserialize($row->getSourceProperty('data_fc')); + $translatable = $data['translatable']; + } + $row->setSourceProperty('translatable', $translatable); return parent::prepareRow($row); } only in patch2: unchanged: --- a/core/modules/field/tests/src/Kernel/Migrate/d7/MigrateFieldInstanceTest.php +++ b/core/modules/field/tests/src/Kernel/Migrate/d7/MigrateFieldInstanceTest.php @@ -81,7 +81,7 @@ protected function createType($id) { * @param bool $is_required * Whether or not the field is required. */ - protected function assertEntity($id, $expected_label, $expected_field_type, $is_required) { + protected function assertEntity($id, $expected_label, $expected_field_type, $is_required, $expected_translatable ) { list ($expected_entity_type, $expected_bundle, $expected_name) = explode('.', $id); /** @var \Drupal\field\FieldConfigInterface $field */ @@ -94,6 +94,7 @@ protected function assertEntity($id, $expected_label, $expected_field_type, $is_ $this->assertIdentical($expected_name, $field->getName()); $this->assertEqual($is_required, $field->isRequired()); $this->assertIdentical($expected_entity_type . '.' . $expected_name, $field->getFieldStorageDefinition()->id()); + $this->assertSame($expected_translatable, $field->isTranslatable()); } /** @@ -113,37 +114,37 @@ protected function assertLinkFields($id, $title_setting) { * Tests migrating D7 field instances to field_config entities. */ public function testFieldInstances() { - $this->assertEntity('comment.comment_node_page.comment_body', 'Comment', 'text_long', TRUE); - $this->assertEntity('node.page.body', 'Body', 'text_with_summary', FALSE); - $this->assertEntity('comment.comment_node_article.comment_body', 'Comment', 'text_long', TRUE); - $this->assertEntity('node.article.body', 'Body', 'text_with_summary', FALSE); - $this->assertEntity('node.article.field_tags', 'Tags', 'entity_reference', FALSE); - $this->assertEntity('node.article.field_image', 'Image', 'image', FALSE); - $this->assertEntity('comment.comment_node_blog.comment_body', 'Comment', 'text_long', TRUE); - $this->assertEntity('node.blog.body', 'Body', 'text_with_summary', FALSE); - $this->assertEntity('comment.comment_node_book.comment_body', 'Comment', 'text_long', TRUE); - $this->assertEntity('node.book.body', 'Body', 'text_with_summary', FALSE); - $this->assertEntity('node.forum.taxonomy_forums', 'Forums', 'entity_reference', TRUE); - $this->assertEntity('comment.comment_node_forum.comment_body', 'Comment', 'text_long', TRUE); - $this->assertEntity('node.forum.body', 'Body', 'text_with_summary', FALSE); - $this->assertEntity('comment.comment_node_test_content_type.comment_body', 'Comment', 'text_long', TRUE); - $this->assertEntity('node.test_content_type.field_boolean', 'Boolean', 'boolean', FALSE); - $this->assertEntity('node.test_content_type.field_email', 'Email', 'email', FALSE); - $this->assertEntity('node.test_content_type.field_phone', 'Phone', 'telephone', TRUE); - $this->assertEntity('node.test_content_type.field_date', 'Date', 'datetime', FALSE); - $this->assertEntity('node.test_content_type.field_date_with_end_time', 'Date With End Time', 'datetime', FALSE); - $this->assertEntity('node.test_content_type.field_file', 'File', 'file', FALSE); - $this->assertEntity('node.test_content_type.field_float', 'Float', 'float', FALSE); - $this->assertEntity('node.test_content_type.field_images', 'Images', 'image', TRUE); - $this->assertEntity('node.test_content_type.field_integer', 'Integer', 'integer', TRUE); - $this->assertEntity('node.test_content_type.field_link', 'Link', 'link', FALSE); - $this->assertEntity('node.test_content_type.field_text_list', 'Text List', 'list_string', FALSE); - $this->assertEntity('node.test_content_type.field_integer_list', 'Integer List', 'list_integer', FALSE); - $this->assertEntity('node.test_content_type.field_long_text', 'Long text', 'text_with_summary', FALSE); - $this->assertEntity('node.test_content_type.field_term_reference', 'Term Reference', 'entity_reference', FALSE); - $this->assertEntity('node.test_content_type.field_text', 'Text', 'text', FALSE); - $this->assertEntity('comment.comment_node_test_content_type.field_integer', 'Integer', 'integer', FALSE); - $this->assertEntity('user.user.field_file', 'File', 'file', FALSE); + $this->assertEntity('comment.comment_node_page.comment_body', 'Comment', 'text_long', TRUE, FALSE); + $this->assertEntity('node.page.body', 'Body', 'text_with_summary', FALSE, FALSE); + $this->assertEntity('comment.comment_node_article.comment_body', 'Comment', 'text_long', TRUE, FALSE); + $this->assertEntity('node.article.body', 'Body', 'text_with_summary', FALSE, TRUE); + $this->assertEntity('node.article.field_tags', 'Tags', 'entity_reference', FALSE, TRUE); + $this->assertEntity('node.article.field_image', 'Image', 'image', FALSE, TRUE); + $this->assertEntity('comment.comment_node_blog.comment_body', 'Comment', 'text_long', TRUE, FALSE); + $this->assertEntity('node.blog.body', 'Body', 'text_with_summary', FALSE, TRUE); + $this->assertEntity('comment.comment_node_book.comment_body', 'Comment', 'text_long', TRUE, FALSE); + $this->assertEntity('node.book.body', 'Body', 'text_with_summary', FALSE, FALSE); + $this->assertEntity('node.forum.taxonomy_forums', 'Forums', 'entity_reference', TRUE, FALSE); + $this->assertEntity('comment.comment_node_forum.comment_body', 'Comment', 'text_long', TRUE, FALSE); + $this->assertEntity('node.forum.body', 'Body', 'text_with_summary', FALSE, FALSE); + $this->assertEntity('comment.comment_node_test_content_type.comment_body', 'Comment', 'text_long', TRUE, FALSE); + $this->assertEntity('node.test_content_type.field_boolean', 'Boolean', 'boolean', FALSE, FALSE); + $this->assertEntity('node.test_content_type.field_email', 'Email', 'email', FALSE, FALSE); + $this->assertEntity('node.test_content_type.field_phone', 'Phone', 'telephone', TRUE, FALSE); + $this->assertEntity('node.test_content_type.field_date', 'Date', 'datetime', FALSE, FALSE); + $this->assertEntity('node.test_content_type.field_date_with_end_time', 'Date With End Time', 'datetime', FALSE, FALSE); + $this->assertEntity('node.test_content_type.field_file', 'File', 'file', FALSE, FALSE); + $this->assertEntity('node.test_content_type.field_float', 'Float', 'float', FALSE, FALSE); + $this->assertEntity('node.test_content_type.field_images', 'Images', 'image', TRUE, FALSE); + $this->assertEntity('node.test_content_type.field_integer', 'Integer', 'integer', TRUE, FALSE); + $this->assertEntity('node.test_content_type.field_link', 'Link', 'link', FALSE, FALSE); + $this->assertEntity('node.test_content_type.field_text_list', 'Text List', 'list_string', FALSE, FALSE); + $this->assertEntity('node.test_content_type.field_integer_list', 'Integer List', 'list_integer', FALSE, FALSE); + $this->assertEntity('node.test_content_type.field_long_text', 'Long text', 'text_with_summary', FALSE, FALSE); + $this->assertEntity('node.test_content_type.field_term_reference', 'Term Reference', 'entity_reference', FALSE, FALSE); + $this->assertEntity('node.test_content_type.field_text', 'Text', 'text', FALSE, FALSE); + $this->assertEntity('comment.comment_node_test_content_type.field_integer', 'Integer', 'integer', FALSE, FALSE); + $this->assertEntity('user.user.field_file', 'File', 'file', FALSE, FALSE); $this->assertLinkFields('node.test_content_type.field_link', DRUPAL_OPTIONAL); $this->assertLinkFields('node.article.field_link', DRUPAL_DISABLED); only in patch2: unchanged: --- a/core/modules/field/tests/src/Kernel/Migrate/d7/MigrateFieldTest.php +++ b/core/modules/field/tests/src/Kernel/Migrate/d7/MigrateFieldTest.php @@ -60,8 +60,6 @@ protected function assertEntity($id, $expected_type, $expected_translatable, $ex $this->assertTrue($field instanceof FieldStorageConfigInterface); $this->assertIdentical($expected_name, $field->getName()); $this->assertIdentical($expected_type, $field->getType()); - // FieldStorageConfig::$translatable is TRUE by default, so it is useful - // to test for FALSE here. $this->assertEqual($expected_translatable, $field->isTranslatable()); $this->assertIdentical($expected_entity_type, $field->getTargetEntityTypeId()); @@ -78,28 +76,28 @@ protected function assertEntity($id, $expected_type, $expected_translatable, $ex * Tests migrating D7 fields to field_storage_config entities. */ public function testFields() { - $this->assertEntity('node.body', 'text_with_summary', FALSE, 1); - $this->assertEntity('node.field_long_text', 'text_with_summary', FALSE, 1); - $this->assertEntity('comment.comment_body', 'text_long', FALSE, 1); - $this->assertEntity('node.field_file', 'file', FALSE, 1); - $this->assertEntity('user.field_file', 'file', FALSE, 1); - $this->assertEntity('node.field_float', 'float', FALSE, 1); - $this->assertEntity('node.field_image', 'image', FALSE, 1); - $this->assertEntity('node.field_images', 'image', FALSE, 1); - $this->assertEntity('node.field_integer', 'integer', FALSE, 1); - $this->assertEntity('comment.field_integer', 'integer', FALSE, 1); - $this->assertEntity('node.field_integer_list', 'list_integer', FALSE, 1); - $this->assertEntity('node.field_link', 'link', FALSE, 1); - $this->assertEntity('node.field_tags', 'entity_reference', FALSE, -1); - $this->assertEntity('node.field_term_reference', 'entity_reference', FALSE, 1); - $this->assertEntity('node.taxonomy_forums', 'entity_reference', FALSE, 1); - $this->assertEntity('node.field_text', 'text', FALSE, 1); - $this->assertEntity('node.field_text_list', 'list_string', FALSE, 3); - $this->assertEntity('node.field_boolean', 'boolean', FALSE, 1); - $this->assertEntity('node.field_email', 'email', FALSE, -1); - $this->assertEntity('node.field_phone', 'telephone', FALSE, 1); - $this->assertEntity('node.field_date', 'datetime', FALSE, 1); - $this->assertEntity('node.field_date_with_end_time', 'datetime', FALSE, 1); + $this->assertEntity('node.body', 'text_with_summary', TRUE, 1); + $this->assertEntity('node.field_long_text', 'text_with_summary', TRUE, 1); + $this->assertEntity('comment.comment_body', 'text_long', TRUE, 1); + $this->assertEntity('node.field_file', 'file', TRUE, 1); + $this->assertEntity('user.field_file', 'file', TRUE, 1); + $this->assertEntity('node.field_float', 'float', TRUE, 1); + $this->assertEntity('node.field_image', 'image', TRUE, 1); + $this->assertEntity('node.field_images', 'image', TRUE, 1); + $this->assertEntity('node.field_integer', 'integer', TRUE, 1); + $this->assertEntity('comment.field_integer', 'integer', TRUE, 1); + $this->assertEntity('node.field_integer_list', 'list_integer', TRUE, 1); + $this->assertEntity('node.field_link', 'link', TRUE, 1); + $this->assertEntity('node.field_tags', 'entity_reference', TRUE, -1); + $this->assertEntity('node.field_term_reference', 'entity_reference', TRUE, 1); + $this->assertEntity('node.taxonomy_forums', 'entity_reference', TRUE, 1); + $this->assertEntity('node.field_text', 'text', TRUE, 1); + $this->assertEntity('node.field_text_list', 'list_string', TRUE, 3); + $this->assertEntity('node.field_boolean', 'boolean', TRUE, 1); + $this->assertEntity('node.field_email', 'email', TRUE, -1); + $this->assertEntity('node.field_phone', 'telephone', TRUE, 1); + $this->assertEntity('node.field_date', 'datetime', TRUE, 1); + $this->assertEntity('node.field_date_with_end_time', 'datetime', TRUE, 1); // Assert that the taxonomy term reference fields are referencing the // correct entity type. only in patch2: unchanged: --- a/core/modules/field/tests/src/Kernel/Plugin/migrate/source/d7/FieldInstanceTest.php +++ b/core/modules/field/tests/src/Kernel/Plugin/migrate/source/d7/FieldInstanceTest.php @@ -94,6 +94,7 @@ public function providerSource() { ], 'description' => '', 'required' => FALSE, + 'data_fc' => 'a:6:{s:12:"entity_types";a:1:{i:0;s:4:"node";}s:12:"translatable";b:0;s:8:"settings";a:0:{}s:7:"storage";a:4:{s:4:"type";s:17:"field_sql_storage";s:8:"settings";a:0:{}s:6:"module";s:17:"field_sql_storage";s:6:"active";i:1;}s:12:"foreign keys";a:1:{s:6:"format";a:2:{s:5:"table";s:13:"filter_format";s:7:"columns";a:1:{s:6:"format";s:6:"format";}}}s:7:"indexes";a:1:{s:6:"format";a:1:{i:0;s:6:"format";}}}', ], ];