diff -u b/core/modules/field/migration_templates/d7_field_instance_widget_settings.yml b/core/modules/field/migration_templates/d7_field_instance_widget_settings.yml --- b/core/modules/field/migration_templates/d7_field_instance_widget_settings.yml +++ b/core/modules/field/migration_templates/d7_field_instance_widget_settings.yml @@ -28,31 +28,27 @@ form_mode: 'constants/form_mode' field_name: field_name entity_type: entity_type + 'options/weight': 'widget/weight' 'options/type': type: plugin: static_map bypass: true - source: widget_type + source: 'widget/type' map: - text_textfield: text_textfield - number: number link_field: link_default email_textfield: email_default date_select: datetime_default date_text: datetime_default date_popup: datetime_default media_generic: file_generic - image_image: image_image phone_textfield: telephone_default options_onoff: boolean_checkbox - options_buttons: options_buttons - options_select: options_select entityreference_autocomplete: entity_reference_autocomplete 'options/settings': - plugin: field_instance_widget_settings source: - - widget_type + - 'widget/type' - widget_settings 'options/third_party_settings': 'constants/third_party_settings' destination: diff -u b/core/modules/field/src/Plugin/migrate/source/d7/FieldInstancePerFormDisplay.php b/core/modules/field/src/Plugin/migrate/source/d7/FieldInstancePerFormDisplay.php --- b/core/modules/field/src/Plugin/migrate/source/d7/FieldInstancePerFormDisplay.php +++ b/core/modules/field/src/Plugin/migrate/source/d7/FieldInstancePerFormDisplay.php @@ -7,6 +7,7 @@ namespace Drupal\field\Plugin\migrate\source\d7; +use Drupal\migrate\Row; use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase; /** @@ -21,35 +22,6 @@ /** * {@inheritdoc} */ - protected function runQuery() { - $rows = array(); - $result = $this->prepareQuery()->execute(); - while ($field_row = $result->fetchAssoc()) { - $data = unserialize($field_row['data']); - $field_row['display_settings'] = $data['display']; - $field_row['widget_settings'] = $data['widget']['settings']; - $bundle = $field_row['bundle']; - $field_name = $field_row['field_name']; - $widget_type = $data['widget']['type']; - $widget_settings = $data['widget']['settings']; - - $index = "$bundle.$field_name"; - $rows[$index]['bundle'] = $bundle; - $rows[$index]['entity_type'] = $field_row['entity_type']; - $rows[$index]['widget_active'] = (bool) $data['widget']['active']; - $rows[$index]['field_name'] = $field_name; - $rows[$index]['type'] = $field_row['type']; - $rows[$index]['module'] = $field_row['module']; - $rows[$index]['weight'] = $data['widget']['weight']; - $rows[$index]['widget_type'] = $widget_type; - $rows[$index]['widget_settings'] = $widget_settings; - } - return new \ArrayIterator($rows); - } - - /** - * {@inheritdoc} - */ public function query() { $query = $this->select('field_config_instance', 'fci') ->fields('fci', array( @@ -70,6 +42,16 @@ /** * {@inheritdoc} */ + public function prepareRow(Row $row) { + $data = unserialize($row->getSourceProperty('data')); + $row->setSourceProperty('widget', $data['widget']); + $row->setSourceProperty('widget_settings', $data['widget']['settings']); + return parent::prepareRow($row); + } + + /** + * {@inheritdoc} + */ public function fields() { return array( 'field_name' => $this->t('The machine name of field.'), diff -u b/core/modules/field/src/Tests/Migrate/d7/MigrateFieldInstanceWidgetSettingsTest.php b/core/modules/field/src/Tests/Migrate/d7/MigrateFieldInstanceWidgetSettingsTest.php --- b/core/modules/field/src/Tests/Migrate/d7/MigrateFieldInstanceWidgetSettingsTest.php +++ b/core/modules/field/src/Tests/Migrate/d7/MigrateFieldInstanceWidgetSettingsTest.php @@ -103,22 +103,64 @@ * * @param string $id * The entity ID. + * @param string $expected_entity_type + * The expected entity type to which the display settings are attached. + * @param string $expected_bundle + * The expected bundle to which the display settings are attached. */ - protected function assertEntity($id) { + protected function assertEntity($id, $expected_entity_type, $expected_bundle) { + /** @var \Drupal\Core\Entity\Display\EntityFormDisplayInterface $entity */ $entity = EntityFormDisplay::load($id); $this->assertTrue($entity instanceof EntityFormDisplayInterface); + $this->assertIdentical($expected_entity_type, $entity->getTargetEntityTypeId()); + $this->assertIdentical($expected_bundle, $entity->getTargetBundle()); + } + + protected function assertComponent($display_id, $component_id, $widget_type, $weight) { + $component = EntityFormDisplay::load($display_id)->getComponent($component_id); + $this->assertTrue(is_array($component)); + $this->assertIdentical($widget_type, $component['type']); + $this->assertIdentical($weight, $component['weight']); } /** * Test that migrated view modes can be loaded using D8 APIs. */ public function testWidgetSettings() { - $this->assertEntity('node.page.default'); - $this->assertEntity('node.article.default'); - $this->assertEntity('node.blog.default'); - $this->assertEntity('node.book.default'); - $this->assertEntity('node.forum.default'); - $this->assertEntity('node.test_content_type.default'); + $this->assertEntity('node.page.default', 'node', 'page'); + $this->assertComponent('node.page.default', 'body', 'text_textarea_with_summary', -4); + + $this->assertEntity('node.article.default', 'node', 'article'); + $this->assertComponent('node.article.default', 'body', 'text_textarea_with_summary', -4); + $this->assertComponent('node.article.default', 'field_tags', 'taxonomy_autocomplete', -4); + $this->assertComponent('node.article.default', 'field_image', 'image_image', -1); + + $this->assertEntity('node.blog.default', 'node', 'blog'); + $this->assertComponent('node.blog.default', 'body', 'text_textarea_with_summary', -4); + + $this->assertEntity('node.book.default', 'node', 'book'); + $this->assertComponent('node.book.default', 'body', 'text_textarea_with_summary', -4); + + $this->assertEntity('node.forum.default', 'node', 'forum'); + $this->assertComponent('node.forum.default', 'body', 'text_textarea_with_summary', 1); + $this->assertComponent('node.forum.default', 'taxonomy_forums', 'options_select', 0); + + $this->assertEntity('node.test_content_type.default', 'node', 'test_content_type'); + $this->assertComponent('node.test_content_type.default', 'field_boolean', 'boolean_checkbox', 1); + $this->assertComponent('node.test_content_type.default', 'field_date', 'datetime_default', 2); + $this->assertComponent('node.test_content_type.default', 'field_date_with_end_time', 'datetime_default', 3); + $this->assertComponent('node.test_content_type.default', 'field_email', 'email_default', 4); + $this->assertComponent('node.test_content_type.default', 'field_file', 'file_generic', 5); + $this->assertComponent('node.test_content_type.default', 'field_float', 'number', 7); + $this->assertComponent('node.test_content_type.default', 'field_images', 'image_image', 8); + $this->assertComponent('node.test_content_type.default', 'field_integer', 'number', 9); + $this->assertComponent('node.test_content_type.default', 'field_link', 'link_default', 10); + $this->assertComponent('node.test_content_type.default', 'field_integer_list', 'options_buttons', 12); + $this->assertComponent('node.test_content_type.default', 'field_long_text', 'text_textarea_with_summary', 13); + $this->assertComponent('node.test_content_type.default', 'field_phone', 'telephone_default', 6); + $this->assertComponent('node.test_content_type.default', 'field_term_reference', 'taxonomy_autocomplete', 14); + $this->assertComponent('node.test_content_type.default', 'field_text', 'text_textfield', 15); + $this->assertComponent('node.test_content_type.default', 'field_text_list', 'options_select', 11); } }