diff --git a/core/modules/field/migration_templates/d7_field_instance.yml b/core/modules/field/migration_templates/d7_field_instance.yml index 4261946..03e77cd 100644 --- a/core/modules/field/migration_templates/d7_field_instance.yml +++ b/core/modules/field/migration_templates/d7_field_instance.yml @@ -21,7 +21,7 @@ process: source: - settings - widget - - field_settings + - field_definition default_value_function: '' default_value: plugin: d7_field_instance_defaults diff --git a/core/modules/field/src/Plugin/migrate/process/d7/FieldInstanceSettings.php b/core/modules/field/src/Plugin/migrate/process/d7/FieldInstanceSettings.php index 70a9498..991ce09c 100644 --- a/core/modules/field/src/Plugin/migrate/process/d7/FieldInstanceSettings.php +++ b/core/modules/field/src/Plugin/migrate/process/d7/FieldInstanceSettings.php @@ -17,9 +17,12 @@ class FieldInstanceSettings extends ProcessPluginBase { * {@inheritdoc} */ public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) { - list($instance_settings, $widget_settings, $field_settings) = $value; + list($instance_settings, $widget_settings, $field_definition) = $value; $widget_type = $widget_settings['type']; + $field_data = unserialize($field_definition['data']); + $field_settings = $field_data['settings']; + // Get entityreference handler settings from source field configuration. if ($row->getSourceProperty('type') == "entityreference") { $instance_settings['handler'] = 'default:' . $field_settings['target_type']; diff --git a/core/modules/field/src/Plugin/migrate/source/d7/FieldInstance.php b/core/modules/field/src/Plugin/migrate/source/d7/FieldInstance.php index 61f19b3..a5fb4d4 100644 --- a/core/modules/field/src/Plugin/migrate/source/d7/FieldInstance.php +++ b/core/modules/field/src/Plugin/migrate/source/d7/FieldInstance.php @@ -2,8 +2,8 @@ namespace Drupal\field\Plugin\migrate\source\d7; -use Drupal\field\Plugin\migrate\source\d7\Field; use Drupal\migrate\Row; +use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase; /** * Drupal 7 field instances source from database. @@ -13,38 +13,63 @@ * source_provider = "field" * ) */ -class FieldInstance extends Field { +class FieldInstance extends DrupalSqlBase { /** * {@inheritdoc} */ - protected function initializeIterator() { - $rows = []; - - foreach ($this->prepareQuery()->execute() as $result) { - $instance_key = $result['instance_entity_type'] . ':' . $result['instance_bundle'] . ':' . $result['instance_field_name']; - - foreach (array_keys($this->getFieldInstanceFields()) as $instance_property) { - $rows[$instance_key][$instance_property] = $result['instance_' . $instance_property]; - } - - foreach (array_keys($this->getFieldFields()) as $field_property) { - $rows[$instance_key]['field_definition'][$field_property] = $result[$field_property]; + public function query() { + $query = $this->select('field_config_instance', 'fci') + ->fields('fci') + ->fields('fc', ['type']) + ->condition('fc.active', 1) + ->condition('fc.storage_active', 1) + ->condition('fc.deleted', 0) + ->condition('fci.deleted', 0); + $query->join('field_config', 'fc', 'fci.field_id = fc.id'); + + // Optionally filter by entity type and bundle. + if (isset($this->configuration['entity_type'])) { + $query->condition('fci.entity_type', $this->configuration['entity_type']); + + if (isset($this->configuration['bundle'])) { + $query->condition('fci.bundle', $this->configuration['bundle']); } } - return new \ArrayIterator($rows); + return $query; + } + + /** + * {@inheritdoc} + */ + public function fields() { + return [ + 'id' => $this->t('The field instance ID.'), + 'field_id' => $this->t('The field ID.'), + 'field_name' => $this->t('The field name.'), + 'entity_type' => $this->t('The entity type.'), + 'bundle' => $this->t('The entity bundle.'), + 'data' => $this->t('The field instance data.'), + 'deleted' => $this->t('Deleted'), + 'field_definition' => $this->t('The field definition.'), + ]; } /** * {@inheritdoc} */ public function prepareRow(Row $row) { - $field_definition = $row->getSourceProperty('field_definition'); - $row->setSourceProperty('type', $field_definition['type']); + foreach (unserialize($row->getSourceProperty('data')) as $key => $value) { + $row->setSourceProperty($key, $value); + } - $field_data = unserialize($field_definition['data']); - $row->setSourceProperty('field_settings', $field_data['settings']); + $field_definition = $this->select('field_config', 'fc') + ->fields('fc') + ->condition('id', $row->getSourceProperty('field_id')) + ->execute() + ->fetch(); + $row->setSourceProperty('field_definition', $field_definition); $translatable = FALSE; if ($row->getSourceProperty('entity_type') == 'node') { @@ -58,33 +83,19 @@ public function prepareRow(Row $row) { } } else { + // This is not a node entity. Get the translatable value from the source + // field_config table. + $field_data = unserialize($field_definition['data']); $translatable = $field_data['translatable']; } $row->setSourceProperty('translatable', $translatable); - // This is for backward compatibility and parity with the d6_field_instance - // plugin. - $data = unserialize($row->getSourceProperty('data')); - $row->setSourceProperty('instance_settings', $data['settings']); - $row->setSourceProperty('widget_settings', $data['widget']); - $row->setSourceProperty('display_settings', $data['display']); - $row->setSourceProperty('widget_type', $data['widget']['type']); - return parent::prepareRow($row); } /** * {@inheritdoc} */ - public function fields() { - $fields = $this->getFieldInstanceFields(); - $fields['field_definition'] = $this->t('Field definition'); - return $fields; - } - - /** - * {@inheritdoc} - */ public function getIds() { return [ 'entity_type' => [ diff --git 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 index 3b243c0..e08f0b0 100644 --- 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 @@ -61,18 +61,27 @@ public function providerSource() { // The expected results. $tests[0]['expected_data'] = [ [ + 'id' => '2', + 'field_id' => '2', 'field_name' => 'body', 'entity_type' => 'node', 'bundle' => 'page', + 'data' => 'a:6:{s:5:"label";s:4:"Body";s:6:"widget";a:4:{s:4:"type";s:26:"text_textarea_with_summary";s:8:"settings";a:2:{s:4:"rows";i:20;s:12:"summary_rows";i:5;}s:6:"weight";i:-4;s:6:"module";s:4:"text";}s:8:"settings";a:3:{s:15:"display_summary";b:1;s:15:"text_processing";i:1;s:18:"user_register_form";b:0;}s:7:"display";a:2:{s:7:"default";a:5:{s:5:"label";s:6:"hidden";s:4:"type";s:12:"text_default";s:8:"settings";a:0:{}s:6:"module";s:4:"text";s:6:"weight";i:0;}s:6:"teaser";a:5:{s:5:"label";s:6:"hidden";s:4:"type";s:23:"text_summary_or_trimmed";s:8:"settings";a:1:{s:11:"trim_length";i:600;}s:6:"module";s:4:"text";s:6:"weight";i:0;}}s:8:"required";b:0;s:11:"description";s:0:"";}', + 'deleted' => '0', 'label' => 'Body', 'widget' => [ - 'module' => 'text', + 'type' => 'text_textarea_with_summary', 'settings' => [ 'rows' => 20, 'summary_rows' => 5, ], - 'type' => 'text_textarea_with_summary', 'weight' => -4, + 'module' => 'text', + ], + 'settings' => [ + 'display_summary' => TRUE, + 'text_processing' => '1', + 'user_register_form' => FALSE, ], 'display' => [ 'default' => [ @@ -92,17 +101,22 @@ public function providerSource() { 'weight' => 0, ], ], - 'description' => '', 'required' => FALSE, + 'description' => '', 'field_definition' => [ + 'id' => '2', 'field_name' => 'body', 'type' => 'text_with_summary', - 'locked' => '0', 'module' => 'text', + 'active' => '1', + 'storage_type' => 'field_sql_storage', + 'storage_module' => 'field_sql_storage', + 'storage_active' => '1', + 'locked' => '0', 'data' => '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";}}}', 'cardinality' => '1', 'translatable' => '0', - 'entity_type' => 'node', + 'deleted' => '0', ], ], ]; diff --git a/core/modules/text/src/Plugin/migrate/cckfield/TextField.php b/core/modules/text/src/Plugin/migrate/cckfield/TextField.php index 1d18b30..99619bb 100644 --- a/core/modules/text/src/Plugin/migrate/cckfield/TextField.php +++ b/core/modules/text/src/Plugin/migrate/cckfield/TextField.php @@ -43,7 +43,9 @@ public function getFieldFormatterMap() { * {@inheritdoc} */ public function processCckFieldValues(MigrationInterface $migration, $field_name, $field_info) { - if ($field_info['widget_type'] == 'optionwidgets_onoff') { + $widget_type = isset($field_info['widget_type']) ? $field_info['widget_type'] : $field_info['widget']['type']; + + if ($widget_type == 'optionwidgets_onoff') { $process = [ 'value' => [ 'plugin' => 'static_map',