diff options
author | Gábor Hojtsy <gabor@hojtsy.hu> | 2018-10-25 22:48:13 +0200 |
---|---|---|
committer | Gábor Hojtsy <gabor@hojtsy.hu> | 2018-10-25 22:48:13 +0200 |
commit | a007373c93ea61b766ef5e4c23fbf4525fe3cf8f (patch) | |
tree | 4119b8cc1d4ce8177ccf60740f75c1c698dab06d /core | |
parent | 4f89e9a91d3d6221b01f1d33f1022bc32642e122 (diff) | |
download | drupal-a007373c93ea61b766ef5e4c23fbf4525fe3cf8f.tar.gz drupal-a007373c93ea61b766ef5e4c23fbf4525fe3cf8f.zip |
Issue #2961114 by quietone, heddn, Gábor Hojtsy, maxocub, masipila: Migrate D6 i18n CCK field option translations
Diffstat (limited to 'core')
14 files changed, 1250 insertions, 5 deletions
diff --git a/core/modules/config_translation/migrations/d6_field_instance_option_translation.yml b/core/modules/config_translation/migrations/d6_field_instance_option_translation.yml new file mode 100644 index 000000000000..7c59018d7bef --- /dev/null +++ b/core/modules/config_translation/migrations/d6_field_instance_option_translation.yml @@ -0,0 +1,178 @@ +id: d6_field_instance_option_translation +label: Field instance option configuration translation +migration_tags: + - Drupal 6 + - Configuration + - Multilingual +source: + plugin: d6_field_instance_option_translation + skip_count: true + constants: + entity_type: node + property: settings +process: + # We skip field types that don't exist because they weren't migrated by the + # field migration. + field_type_exists: + - + plugin: migration_lookup + migration: d6_field + source: + - objectid + - + plugin: extract + index: + - 1 + - + plugin: skip_on_empty + method: row + # Use the process from d6_field to determine the field type. + type: + plugin: field_type + source: + - type + - widget_type + map: + userreference: + userreference_select: entity_reference + userreference_buttons: entity_reference + userreference_autocomplete: entity_reference + nodereference: + nodereference_select: entity_reference + number_integer: + number: integer + optionwidgets_select: list_integer + optionwidgets_buttons: list_integer + optionwidgets_onoff: boolean + number_decimal: + number: decimal + optionwidgets_select: list_float + optionwidgets_buttons: list_float + optionwidgets_onoff: boolean + number_float: + number: float + optionwidgets_select: list_float + optionwidgets_buttons: list_float + optionwidgets_onoff: boolean + email: + email_textfield: email + filefield: + imagefield_widget: image + filefield_widget: file + fr_phone: + phone_textfield: telephone + be_phone: + phone_textfield: telephone + it_phone: + phone_textfield: telephone + el_phone: + phone_textfield: telephone + ch_phone: + phone_textfield: telephone + ca_phone: + phone_textfield: telephone + cr_phone: + phone_textfield: telephone + pa_phone: + phone_textfield: telephone + gb_phone: + phone_textfield: telephone + ru_phone: + phone_textfield: telephone + ua_phone: + phone_textfield: telephone + es_phone: + phone_textfield: telephone + au_phone: + phone_textfield: telephone + cs_phone: + phone_textfield: telephone + hu_phone: + phone_textfield: telephone + pl_phone: + phone_textfield: telephone + nl_phone: + phone_textfield: telephone + se_phone: + phone_textfield: telephone + za_phone: + phone_textfield: telephone + il_phone: + phone_textfield: telephone + nz_phone: + phone_textfield: telephone + br_phone: + phone_textfield: telephone + cl_phone: + phone_textfield: telephone + cn_phone: + phone_textfield: telephone + hk_phone: + phone_textfield: telephone + mo_phone: + phone_textfield: telephone + ph_phone: + phone_textfield: telephone + sg_phone: + phone_textfield: telephone + jo_phone: + phone_textfield: telephone + eg_phone: + phone_textfield: telephone + pk_phone: + phone_textfield: telephone + int_phone: + phone_textfield: telephone + boolean_type: + - + plugin: static_map + source: '@type' + map: + boolean: boolean + default_value: false + - + plugin: skip_on_empty + method: row + bundle: + - + plugin: migration_lookup + migration: d6_node_type + source: type_name + - + plugin: skip_on_empty + method: row + langcode: + plugin: skip_on_empty + source: language + method: row + field_name: objectid + entity_type: 'constants/entity_type' + results: + plugin: d6_field_instance_option_translation + source: + - '@type' + - global_settings + translation: + - + plugin: extract + source: '@results' + index: [1] + - + plugin: skip_on_empty + method: row + property: + - + plugin: extract + source: '@results' + index: [0] + - + plugin: skip_on_empty + method: row +destination: + plugin: entity:field_config + translations: true +migration_dependencies: + required: + - d6_node_type + - d6_field_instance + - d6_field_option_translation diff --git a/core/modules/config_translation/migrations/d6_field_option_translation.yml b/core/modules/config_translation/migrations/d6_field_option_translation.yml new file mode 100644 index 000000000000..bea24a2562dd --- /dev/null +++ b/core/modules/config_translation/migrations/d6_field_option_translation.yml @@ -0,0 +1,144 @@ +id: d6_field_option_translation +label: Field option configuration translation +migration_tags: + - Drupal 6 + - Configuration + - Multilingual +source: + plugin: d6_field_option_translation + skip_count: true + constants: + entity_type: node + allowed_values: settings +process: + entity_type: 'constants/entity_type' + status: active + langcode: + plugin: skip_on_empty + source: language + method: row + field_name: objectid + # Use the process from d6_field to determine the field type. + type: + plugin: field_type + source: + - type + - widget_type + map: + userreference: + userreference_select: entity_reference + userreference_buttons: entity_reference + userreference_autocomplete: entity_reference + nodereference: + nodereference_select: entity_reference + number_integer: + number: integer + optionwidgets_select: list_integer + optionwidgets_buttons: list_integer + optionwidgets_onoff: boolean + number_decimal: + number: decimal + optionwidgets_select: list_float + optionwidgets_buttons: list_float + optionwidgets_onoff: boolean + number_float: + number: float + optionwidgets_select: list_float + optionwidgets_buttons: list_float + optionwidgets_onoff: boolean + email: + email_textfield: email + filefield: + imagefield_widget: image + filefield_widget: file + fr_phone: + phone_textfield: telephone + be_phone: + phone_textfield: telephone + it_phone: + phone_textfield: telephone + el_phone: + phone_textfield: telephone + ch_phone: + phone_textfield: telephone + ca_phone: + phone_textfield: telephone + cr_phone: + phone_textfield: telephone + pa_phone: + phone_textfield: telephone + gb_phone: + phone_textfield: telephone + ru_phone: + phone_textfield: telephone + ua_phone: + phone_textfield: telephone + es_phone: + phone_textfield: telephone + au_phone: + phone_textfield: telephone + cs_phone: + phone_textfield: telephone + hu_phone: + phone_textfield: telephone + pl_phone: + phone_textfield: telephone + nl_phone: + phone_textfield: telephone + se_phone: + phone_textfield: telephone + za_phone: + phone_textfield: telephone + il_phone: + phone_textfield: telephone + nz_phone: + phone_textfield: telephone + br_phone: + phone_textfield: telephone + cl_phone: + phone_textfield: telephone + cn_phone: + phone_textfield: telephone + hk_phone: + phone_textfield: telephone + mo_phone: + phone_textfield: telephone + ph_phone: + phone_textfield: telephone + sg_phone: + phone_textfield: telephone + jo_phone: + phone_textfield: telephone + eg_phone: + phone_textfield: telephone + pk_phone: + phone_textfield: telephone + int_phone: + phone_textfield: telephone + results: + plugin: d6_field_option_translation + source: + - '@type' + - global_settings + translation: + - + plugin: extract + source: '@results' + index: [1] + - + plugin: skip_on_empty + method: row + property: + - + plugin: extract + source: '@results' + index: [0] + - + plugin: skip_on_empty + method: row +destination: + plugin: entity:field_storage_config + translations: true +migration_dependencies: + required: + - d6_field diff --git a/core/modules/field/src/Plugin/migrate/process/d6/FieldInstanceOptionTranslation.php b/core/modules/field/src/Plugin/migrate/process/d6/FieldInstanceOptionTranslation.php new file mode 100644 index 000000000000..72e954bf0cb4 --- /dev/null +++ b/core/modules/field/src/Plugin/migrate/process/d6/FieldInstanceOptionTranslation.php @@ -0,0 +1,53 @@ +<?php + +namespace Drupal\field\Plugin\migrate\process\d6; + +use Drupal\migrate\MigrateExecutableInterface; +use Drupal\migrate\ProcessPluginBase; +use Drupal\migrate\Row; + +/** + * Determines the settings property and translation for boolean fields. + * + * @MigrateProcessPlugin( + * id = "d6_field_instance_option_translation", + * handle_multiples = TRUE + * ) + */ +class FieldInstanceOptionTranslation extends ProcessPluginBase { + + /** + * {@inheritdoc} + */ + public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) { + list($field_type, $global_settings) = $value; + + $option_key = 0; + $translation = ''; + if (isset($global_settings['allowed_values'])) { + $list = explode("\n", $global_settings['allowed_values']); + $list = array_map('trim', $list); + $list = array_filter($list, 'strlen'); + switch ($field_type) { + case 'boolean'; + $option = preg_replace('/^option_/', '', $row->getSourceProperty('property')); + for ($i = 0; $i < 2; $i++) { + $value = $list[$i]; + $tmp = explode("|", $value); + $original_option_key = isset($tmp[0]) ? $tmp[0] : NULL; + $option_key = ($i === 0) ? 'off_label' : 'on_label'; + // Find property with name matching the original option. + if ($option == $original_option_key) { + $translation = $row->getSourceProperty('translation'); + break; + } + } + break; + + default: + } + } + return ['settings.' . $option_key, $translation]; + } + +} diff --git a/core/modules/field/src/Plugin/migrate/process/d6/FieldOptionTranslation.php b/core/modules/field/src/Plugin/migrate/process/d6/FieldOptionTranslation.php new file mode 100644 index 000000000000..05bb2ad0d626 --- /dev/null +++ b/core/modules/field/src/Plugin/migrate/process/d6/FieldOptionTranslation.php @@ -0,0 +1,59 @@ +<?php + +namespace Drupal\field\Plugin\migrate\process\d6; + +use Drupal\migrate\MigrateExecutableInterface; +use Drupal\migrate\ProcessPluginBase; +use Drupal\migrate\Row; + +/** + * Determines the allowed values translation for select lists. + * + * @MigrateProcessPlugin( + * id = "d6_field_option_translation", + * handle_multiples = TRUE + * ) + */ +class FieldOptionTranslation extends ProcessPluginBase { + + /** + * {@inheritdoc} + * + * Get the field default/mapped settings. + */ + public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) { + list($field_type, $global_settings) = $value; + + $allowed_values = ''; + $i = 0; + if (isset($global_settings['allowed_values'])) { + $list = explode("\n", $global_settings['allowed_values']); + $list = array_map('trim', $list); + $list = array_filter($list, 'strlen'); + switch ($field_type) { + case 'list_string': + case 'list_integer': + case 'list_float': + // Remove the prefix used in the i18n_strings table for field options + // to get the option value. + $option = preg_replace('/^option_/', '', $row->getSourceProperty('property')); + $i = 0; + foreach ($list as $allowed_value) { + // Get the key for this allowed value which may be a key|label pair + // or or just key. + $value = explode("|", $allowed_value); + if (isset($value[0]) && ($value[0] == $option)) { + $allowed_values = ['label' => $row->getSourceProperty('translation')]; + break; + } + $i++; + } + break; + + default: + } + } + return ["settings.allowed_values.$i", $allowed_values]; + } + +} diff --git a/core/modules/field/src/Plugin/migrate/source/d6/FieldInstanceOptionTranslation.php b/core/modules/field/src/Plugin/migrate/source/d6/FieldInstanceOptionTranslation.php new file mode 100644 index 000000000000..15ec9b9415a7 --- /dev/null +++ b/core/modules/field/src/Plugin/migrate/source/d6/FieldInstanceOptionTranslation.php @@ -0,0 +1,35 @@ +<?php + +namespace Drupal\field\Plugin\migrate\source\d6; + +/** + * Gets field instance option label translations. + * + * @MigrateSource( + * id = "d6_field_instance_option_translation", + * source_module = "i18ncck" + * ) + */ +class FieldInstanceOptionTranslation extends FieldOptionTranslation { + + /** + * {@inheritdoc} + */ + public function query() { + $query = parent::query(); + $query->join('content_node_field_instance', 'cnfi', 'cnf.field_name = cnfi.field_name'); + $query->addField('cnfi', 'type_name'); + return $query; + } + + /** + * {@inheritdoc} + */ + public function fields() { + $fields = [ + 'type_name' => $this->t('Type (article, page, ....)'), + ]; + return parent::fields() + $fields; + } + +} diff --git a/core/modules/field/src/Plugin/migrate/source/d6/FieldOptionTranslation.php b/core/modules/field/src/Plugin/migrate/source/d6/FieldOptionTranslation.php new file mode 100644 index 000000000000..bc2671a9c4a5 --- /dev/null +++ b/core/modules/field/src/Plugin/migrate/source/d6/FieldOptionTranslation.php @@ -0,0 +1,78 @@ +<?php + +namespace Drupal\field\Plugin\migrate\source\d6; + +/** + * Gets field option label translations. + * + * @MigrateSource( + * id = "d6_field_option_translation", + * source_module = "i18ncck" + * ) + */ +class FieldOptionTranslation extends Field { + + /** + * {@inheritdoc} + */ + public function query() { + // Get the fields that have field options translations. + $query = $this->select('i18n_strings', 'i18n') + ->fields('i18n') + ->fields('lt', [ + 'translation', + 'language', + 'plid', + 'plural', + 'i18n_status', + ]) + ->condition('i18n.type', 'field') + ->condition('property', 'option\_%', 'LIKE') + ->isNotNull('translation'); + $query->leftJoin('locales_target', 'lt', 'lt.lid = i18n.lid'); + $query->leftjoin('content_node_field', 'cnf', 'cnf.field_name = i18n.objectid'); + $query->addField('cnf', 'field_name'); + $query->addField('cnf', 'global_settings'); + // Minimise changes to the d6_field_option_translation.yml, which is copied + // from d6_field.yml, by ensuring the 'type' property is from + // content_node_field table. + $query->addField('cnf', 'type'); + $query->addField('i18n', 'type', 'i18n_type'); + + return $query; + } + + /** + * {@inheritdoc} + */ + public function fields() { + $fields = [ + 'property' => $this->t('Option ID.'), + 'objectid' => $this->t('Object ID'), + 'objectindex' => $this->t('Integer value of Object ID'), + 'format' => $this->t('The input format used by this string'), + 'lid' => $this->t('Source string ID'), + 'language' => $this->t('Language code'), + 'translation' => $this->t('Translation of the option'), + 'plid' => $this->t('Parent lid'), + 'plural' => $this->t('Plural index number in case of plural strings'), + ]; + return parent::fields() + $fields; + } + + /** + * {@inheritdoc} + */ + + /** + * {@inheritdoc} + */ + public function getIds() { + return parent::getIds() + + [ + 'language' => ['type' => 'string'], + 'property' => ['type' => 'string'], + ]; + } + +} diff --git a/core/modules/field/tests/src/Kernel/Migrate/d6/MigrateFieldInstanceOptionTranslationTest.php b/core/modules/field/tests/src/Kernel/Migrate/d6/MigrateFieldInstanceOptionTranslationTest.php new file mode 100644 index 000000000000..c413e3fa0103 --- /dev/null +++ b/core/modules/field/tests/src/Kernel/Migrate/d6/MigrateFieldInstanceOptionTranslationTest.php @@ -0,0 +1,75 @@ +<?php + +namespace Drupal\Tests\field\Kernel\Migrate\d6; + +use Drupal\Tests\migrate_drupal\Kernel\d6\MigrateDrupal6TestBase; + +/** + * Migrate field instance option translations. + * + * @group migrate_drupal_6 + */ +class MigrateFieldInstanceOptionTranslationTest extends MigrateDrupal6TestBase { + + /** + * {@inheritdoc} + */ + public static $modules = + [ + 'config_translation', + 'language', + 'locale', + 'menu_ui', + ]; + + /** + * {@inheritdoc} + */ + protected function setUp() { + parent::setUp(); + $this->installConfig(['node']); + $this->executeMigrations([ + 'language', + 'd6_node_type', + 'd6_field', + 'd6_field_instance', + 'd6_field_option_translation', + 'd6_field_instance_option_translation', + ]); + } + + /** + * Tests migration of file variables to file.settings.yml. + */ + public function testFieldInstanceOptionTranslation() { + $language_manager = $this->container->get('language_manager'); + + /** @var \Drupal\language\Config\LanguageConfigOverride $config_translation */ + $config_translation = $language_manager->getLanguageConfigOverride('fr', 'field.field.node.story.field_test_float_single_checkbox'); + $option_translation = ['on_label' => 'fr - 1.234']; + $this->assertSame($option_translation, $config_translation->get('settings')); + + $config_translation = $language_manager->getLanguageConfigOverride('zu', 'field.field.node.story.field_test_float_single_checkbox'); + $option_translation = ['on_label' => 'zu - 1.234']; + $this->assertSame($option_translation, $config_translation->get('settings')); + + $config_translation = $language_manager->getLanguageConfigOverride('fr', 'field.field.node.story.field_test_text_single_checkbox'); + $option_translation = [ + 'off_label' => 'fr - Hello', + 'on_label' => 'fr - Goodbye', + ]; + $this->assertSame($option_translation, $config_translation->get('settings')); + + $config_translation = $language_manager->getLanguageConfigOverride('fr', 'field.field.node.story.field_test_text_single_checkbox2'); + $option_translation = [ + 'off_label' => 'fr - Off', + 'on_label' => 'fr - Hello', + ]; + $this->assertSame($option_translation, $config_translation->get('settings')); + + $config_translation = $language_manager->getLanguageConfigOverride('zu', 'field.field.node.story.field_test_text_single_checkbox2'); + $option_translation = ['on_label' => 'zu - Hello']; + $this->assertSame($option_translation, $config_translation->get('settings')); + } + +} diff --git a/core/modules/field/tests/src/Kernel/Migrate/d6/MigrateFieldOptionTranslationTest.php b/core/modules/field/tests/src/Kernel/Migrate/d6/MigrateFieldOptionTranslationTest.php new file mode 100644 index 000000000000..af0e57e1b5f4 --- /dev/null +++ b/core/modules/field/tests/src/Kernel/Migrate/d6/MigrateFieldOptionTranslationTest.php @@ -0,0 +1,84 @@ +<?php + +namespace Drupal\Tests\field\Kernel\Migrate\d6; + +use Drupal\Tests\migrate_drupal\Kernel\d6\MigrateDrupal6TestBase; + +/** + * Migrate field option translations. + * + * @group migrate_drupal_6 + */ +class MigrateFieldOptionTranslationTest extends MigrateDrupal6TestBase { + + /** + * {@inheritdoc} + */ + public static $modules = [ + 'config_translation', + 'language', + 'locale', + 'menu_ui', + ]; + + /** + * {@inheritdoc} + */ + protected function setUp() { + parent::setUp(); + $this->executeMigrations([ + 'language', + 'd6_field', + 'd6_field_option_translation', + ]); + } + + /** + * Tests the Drupal 6 field to Drupal 8 migration. + */ + public function testFieldOptionTranslation() { + $language_manager = $this->container->get('language_manager'); + + // Test a select list with allowed values of key only. + /** @var \Drupal\language\Config\LanguageConfigOverride $config_translation */ + $config_translation = $language_manager->getLanguageConfigOverride('fr', 'field.storage.node.field_test_integer_selectlist'); + $allowed_values = [ + 1 => [ + 'label' => 'fr - 2341', + ], + 3 => [ + 'label' => 'fr - 4123', + ], + ]; + $this->assertSame($allowed_values, $config_translation->get('settings.allowed_values')); + + $config_translation = $language_manager->getLanguageConfigOverride('zu', 'field.storage.node.field_test_integer_selectlist'); + $allowed_values = [ + 1 => [ + 'label' => 'zu - 2341', + ], + ]; + $this->assertSame($allowed_values, $config_translation->get('settings.allowed_values')); + + // Test a select list with allowed values of key|label. + $config_translation = $language_manager->getLanguageConfigOverride('fr', 'field.storage.node.field_test_string_selectlist'); + $allowed_values = [ + 0 => [ + 'label' => 'Noir', + ], + ]; + $this->assertSame($allowed_values, $config_translation->get('settings.allowed_values')); + + $config_translation = $language_manager->getLanguageConfigOverride('zu', 'field.storage.node.field_test_string_selectlist'); + $allowed_values = [ + 0 => [ + 'label' => 'Okumnyama', + ], + 1 => [ + 'label' => 'Mhlophe', + ], + ]; + $this->assertSame($allowed_values, $config_translation->get('settings.allowed_values')); + } + +} diff --git a/core/modules/field/tests/src/Kernel/Plugin/migrate/source/d6/FieldInstanceOptionTranslationTest.php b/core/modules/field/tests/src/Kernel/Plugin/migrate/source/d6/FieldInstanceOptionTranslationTest.php new file mode 100644 index 000000000000..ee6548853ec7 --- /dev/null +++ b/core/modules/field/tests/src/Kernel/Plugin/migrate/source/d6/FieldInstanceOptionTranslationTest.php @@ -0,0 +1,34 @@ +<?php + +namespace Drupal\Tests\field\Kernel\Plugin\migrate\source\d6; + +/** + * Tests the field instance option translation source plugin. + * + * @covers \Drupal\field\Plugin\migrate\source\d6\FieldInstanceOptionTranslation + * @group migrate_drupal + */ +class FieldInstanceOptionTranslationTest extends FieldOptionTranslationTest { + + /** + * {@inheritdoc} + */ + public static $modules = ['field', 'migrate_drupal']; + + /** + * {@inheritdoc} + */ + public function providerSource() { + $test = parent::providerSource(); + + // FieldInstanceOptionTranslation extends FieldOptionTranslation so the + // same test can be used with the addition of the 'type' field to the + // output. + $test[0]['expected_results'][0]['type'] = 'text'; + $test[0]['expected_results'][1]['type'] = 'text'; + $test[0]['expected_results'][2]['type'] = 'number_integer'; + $test[0]['expected_results'][3]['type'] = 'number_integer'; + return $test; + } + +} diff --git a/core/modules/field/tests/src/Kernel/Plugin/migrate/source/d6/FieldOptionTranslationTest.php b/core/modules/field/tests/src/Kernel/Plugin/migrate/source/d6/FieldOptionTranslationTest.php new file mode 100644 index 000000000000..8503a3f581fa --- /dev/null +++ b/core/modules/field/tests/src/Kernel/Plugin/migrate/source/d6/FieldOptionTranslationTest.php @@ -0,0 +1,242 @@ +<?php + +namespace Drupal\Tests\field\Kernel\Plugin\migrate\source\d6; + +use Drupal\Tests\migrate\Kernel\MigrateSqlSourceTestBase; + +/** + * Tests the field option translation source plugin. + * + * @covers \Drupal\field\Plugin\migrate\source\d6\FieldOptionTranslation + * @group migrate_drupal + */ +class FieldOptionTranslationTest extends MigrateSqlSourceTestBase { + + /** + * {@inheritdoc} + */ + public static $modules = ['field', 'migrate_drupal']; + + /** + * {@inheritdoc} + */ + public function providerSource() { + $test = []; + + // The source data. + $test[0]['source_data']['content_node_field'] = [ + [ + 'field_name' => 'field_test_text_single_checkbox', + 'type' => 'text', + 'global_settings' => 'a:4:{s:15:"text_processing";s:1:"0";s:10:"max_length";s:0:"";s:14:"allowed_values";s:10:"Off\\nHello";s:18:"allowed_values_php";s:0:"";}', + 'required' => 0, + 'multiple' => 0, + 'db_storage' => 1, + 'module' => 'text', + ], + [ + 'field_name' => 'field_test_integer_selectlist', + 'type' => 'number_integer', + 'global_settings' => 'a:6:{s:6:"prefix";s:0:"";s:6:"suffix";s:0:"";s:3:"min";s:0:"";s:3:"max";s:0:"";s:14:"allowed_values";s:22:"1234\\n2341\\n3412\\n4123";s:18:"allowed_values_php";s:0:"";}', + 'required' => 0, + 'multiple' => 0, + 'db_storage' => 1, + 'module' => 'text', + ], + ]; + $test[0]['source_data']['content_node_field_instance'] = [ + [ + 'field_name' => 'field_test_text_single_checkbox', + 'type_name' => 'story', + 'weight' => 1, + 'label' => 'Text Single Checkbox Field', + 'widget_type' => 'optionwidgets_onoff', + 'description' => 'An example text field using a single on/off checkbox.', + 'widget_module' => 'optionwidgets', + 'widget_active' => 1, + 'required' => 1, + 'active' => 1, + 'global_settings' => 'a:0;', + 'widget_settings' => 'a:0;', + 'display_settings' => 'a:0;', + ], + [ + 'field_name' => 'field_test_integer_selectlist', + 'type_name' => 'story', + 'weight' => 1, + 'label' => 'Integer Select List Field', + 'widget_type' => 'optionwidgets_select', + 'description' => 'An example integer field using a select list.', + 'widget_module' => 'optionwidgets', + 'widget_active' => 1, + 'required' => 1, + 'active' => 1, + 'global_settings' => 'a:0;', + 'widget_settings' => 'a:0;', + 'display_settings' => 'a:0;', + ], + ]; + + $test[0]['source_data']['i18n_strings'] = [ + [ + 'lid' => 10, + 'objectid' => 'field_test_text_single_checkbox', + 'type' => 'field', + 'property' => 'option_0', + 'objectindex' => 0, + 'format' => 0, + ], + [ + 'lid' => 11, + 'objectid' => 'field_test_text_single_checkbox', + 'type' => 'field', + 'property' => 'option_1', + 'objectindex' => 0, + 'format' => 0, + ], + [ + 'lid' => 20, + 'objectid' => 'field_test_integer_selectlist', + 'type' => 'field', + 'property' => 'option_1234', + 'objectindex' => 0, + 'format' => 0, + ], + [ + 'lid' => 21, + 'objectid' => 'field_test_integer_selectlist', + 'type' => 'field', + 'property' => 'option_4123', + 'objectindex' => 0, + 'format' => 0, + ], + ]; + $test[0]['source_data']['locales_target'] = [ + [ + 'lid' => 10, + 'translation' => "fr - Hello", + 'language' => 'fr', + 'plid' => 0, + 'plural' => 0, + 'i18n_status' => 0, + ], + [ + 'lid' => 11, + 'translation' => 'fr - Goodbye', + 'language' => 'fr', + 'plid' => 0, + 'plural' => 0, + 'i18n_status' => 0, + ], + [ + 'lid' => 20, + 'translation' => "fr - 4444", + 'language' => 'fr', + 'plid' => 0, + 'plural' => 0, + 'i18n_status' => 0, + ], + [ + 'lid' => 21, + 'translation' => 'fr - 5555', + 'language' => 'fr', + 'plid' => 0, + 'plural' => 0, + 'i18n_status' => 0, + ], + ]; + + $test[0]['expected_results'] = [ + [ + 'field_name' => 'field_test_text_single_checkbox', + 'type' => 'text', + 'widget_type' => 'optionwidgets_onoff', + 'global_settings' => [ + 'allowed_values' => 'Off\nHello', + 'allowed_values_php' => '', + 'max_length' => '', + 'text_processing' => '0', + ], + 'db_columns' => '', + 'property' => 'option_0', + 'objectid' => 'field_test_text_single_checkbox', + 'language' => 'fr', + 'translation' => 'fr - Hello', + 'objectindex' => 0, + 'format' => 0, + 'plid' => 0, + 'plural' => 0, + 'i18n_status' => 0, + ], + [ + 'field_name' => 'field_test_text_single_checkbox', + 'type' => 'text', + 'widget_type' => 'optionwidgets_onoff', + 'global_settings' => [ + 'allowed_values' => 'Off\nHello', + 'allowed_values_php' => '', + 'max_length' => '', + 'text_processing' => '0', + ], + 'db_columns' => '', + 'property' => 'option_1', + 'objectid' => 'field_test_text_single_checkbox', + 'language' => 'fr', + 'translation' => 'fr - Goodbye', + 'objectindex' => 0, + 'format' => 0, + 'plid' => 0, + 'plural' => 0, + 'i18n_status' => 0, + ], + [ + 'field_name' => 'field_test_integer_selectlist', + 'type' => 'number_integer', + 'widget_type' => 'optionwidgets_select', + 'global_settings' => [ + 'allowed_values' => '1234\n2341\n3412\n4123', + 'max' => '', + 'min' => '', + 'prefix' => '', + 'suffix' => '', + 'allowed_values_php' => '', + ], + 'db_columns' => '', + 'property' => 'option_1234', + 'objectid' => 'field_test_integer_selectlist', + 'language' => 'fr', + 'translation' => 'fr - 4444', + 'objectindex' => 0, + 'format' => 0, + 'plid' => 0, + 'plural' => 0, + 'i18n_status' => 0, + ], + [ + 'field_name' => 'field_test_integer_selectlist', + 'type' => 'number_integer', + 'widget_type' => 'optionwidgets_select', + 'global_settings' => [ + 'allowed_values' => '1234\n2341\n3412\n4123', + 'max' => '', + 'min' => '', + 'prefix' => '', + 'suffix' => '', + 'allowed_values_php' => '', + ], + 'db_columns' => '', + 'property' => 'option_4123', + 'objectid' => 'field_test_integer_selectlist', + 'language' => 'fr', + 'translation' => 'fr - 5555', + 'objectindex' => 0, + 'format' => 0, + 'plid' => 0, + 'plural' => 0, + 'i18n_status' => 0, + ], + ]; + return $test; + } + +} diff --git a/core/modules/migrate/src/Plugin/migrate/destination/EntityConfigBase.php b/core/modules/migrate/src/Plugin/migrate/destination/EntityConfigBase.php index af9f35c37fe2..b934a70635c1 100644 --- a/core/modules/migrate/src/Plugin/migrate/destination/EntityConfigBase.php +++ b/core/modules/migrate/src/Plugin/migrate/destination/EntityConfigBase.php @@ -268,7 +268,7 @@ class EntityConfigBase extends Entity { // The entity id does not include the langcode. $id_values = []; foreach ($destination_identifier as $key => $value) { - if ($this->isTranslationDestination() && $key == 'langcode') { + if ($this->isTranslationDestination() && $key === 'langcode') { continue; } $id_values[] = $value; diff --git a/core/modules/migrate/src/Plugin/migrate/destination/EntityFieldStorageConfig.php b/core/modules/migrate/src/Plugin/migrate/destination/EntityFieldStorageConfig.php index 80ea9f628b8b..0b9714a79b11 100644 --- a/core/modules/migrate/src/Plugin/migrate/destination/EntityFieldStorageConfig.php +++ b/core/modules/migrate/src/Plugin/migrate/destination/EntityFieldStorageConfig.php @@ -58,6 +58,10 @@ class EntityFieldStorageConfig extends EntityConfigBase { public function getIds() { $ids['entity_type']['type'] = 'string'; $ids['field_name']['type'] = 'string'; + // @todo: Remove conditional. https://www.drupal.org/node/3004574 + if ($this->isTranslationDestination()) { + $ids['langcode']['type'] = 'string'; + } return $ids; } @@ -65,8 +69,18 @@ class EntityFieldStorageConfig extends EntityConfigBase { * {@inheritdoc} */ public function rollback(array $destination_identifier) { - $destination_identifier = implode('.', $destination_identifier); - parent::rollback([$destination_identifier]); + if ($this->isTranslationDestination()) { + $language = $destination_identifier['langcode']; + unset($destination_identifier['langcode']); + $destination_identifier = [ + implode('.', $destination_identifier), + 'langcode' => $language, + ]; + } + else { + $destination_identifier = [implode('.', $destination_identifier)]; + } + parent::rollback($destination_identifier); } } diff --git a/core/modules/migrate_drupal/tests/fixtures/drupal6.php b/core/modules/migrate_drupal/tests/fixtures/drupal6.php index 6fbd16bdc047..185a7b6a78d9 100644 --- a/core/modules/migrate_drupal/tests/fixtures/drupal6.php +++ b/core/modules/migrate_drupal/tests/fixtures/drupal6.php @@ -3013,6 +3013,18 @@ $connection->insert('content_node_field') 'locked' => '0', )) ->values(array( + 'field_name' => 'field_test_string_selectlist', + 'type' => 'text', + 'global_settings' => "a:4:{s:15:\"text_processing\";s:1:\"0\";s:10:\"max_length\";s:0:\"\";s:14:\"allowed_values\";s:18:\"A|Black\r\nB|White\r\n\";s:18:\"allowed_values_php\";s:0:\"\";}", + 'required' => '0', + 'multiple' => '0', + 'db_storage' => '1', + 'module' => 'text', + 'db_columns' => 'a:1:{s:5:"value";a:5:{s:4:"type";s:4:"text";s:4:"size";s:3:"big";s:8:"not null";b:0;s:8:"sortable";b:1;s:5:"views";b:1;}}', + 'active' => '1', + 'locked' => '0', +)) +->values(array( 'field_name' => 'field_test_text_single_checkbox', 'type' => 'text', 'global_settings' => "a:4:{s:15:\"text_processing\";s:1:\"0\";s:10:\"max_length\";s:0:\"\";s:14:\"allowed_values\";s:18:\"0|Hello\r\n1|Goodbye\";s:18:\"allowed_values_php\";s:0:\"\";}", @@ -3431,6 +3443,18 @@ $connection->insert('content_node_field_instance') 'widget_active' => '1', )) ->values(array( + 'field_name' => 'field_test_string_selectlist', + 'type_name' => 'story', + 'weight' => '31', + 'label' => 'String Select List Field', + 'widget_type' => 'optionwidgets_select', + 'widget_settings' => 'a:2:{s:13:"default_value";a:1:{i:0;a:1:{s:5:"value";s:0:"";}}s:17:"default_value_php";N;}', + 'display_settings' => 'a:5:{s:5:"label";a:2:{s:6:"format";s:5:"above";s:7:"exclude";i:0;}i:5;a:2:{s:6:"format";s:7:"default";s:7:"exclude";i:0;}s:6:"teaser";a:2:{s:6:"format";s:7:"default";s:7:"exclude";i:0;}s:4:"full";a:2:{s:6:"format";s:7:"default";s:7:"exclude";i:0;}i:4;a:2:{s:6:"format";s:7:"default";s:7:"exclude";i:0;}}', + 'description' => '', + 'widget_module' => 'optionwidgets', + 'widget_active' => '1', +)) +->values(array( 'field_name' => 'field_test_text_single_checkbox', 'type_name' => 'story', 'weight' => '17', @@ -3822,6 +3846,11 @@ $connection->schema()->createTable('content_type_story', array( 'not null' => FALSE, 'length' => '100', ), + 'field_test_string_selectlist_value' => array( + 'type' => 'text', + 'not null' => FALSE, + 'size' => 'big', + ), ), 'primary key' => array( 'vid', @@ -3865,6 +3894,7 @@ $connection->insert('content_type_story') 'field_test_text_single_checkbox2_value', 'field_test_datestamp_value2', 'field_test_datetime_value2', + 'field_test_string_selectlist_value', )) ->values(array( 'nid' => '1', @@ -3896,6 +3926,7 @@ $connection->insert('content_type_story') 'field_test_text_single_checkbox2_value' => 'Hello', 'field_test_datestamp_value2' => NULL, 'field_test_datetime_value2' => NULL, + 'field_test_string_selectlist_value' => NULL, )) ->values(array( 'nid' => '1', @@ -3927,6 +3958,7 @@ $connection->insert('content_type_story') 'field_test_text_single_checkbox2_value' => NULL, 'field_test_datestamp_value2' => NULL, 'field_test_datetime_value2' => NULL, + 'field_test_string_selectlist_value' => NULL, )) ->values(array( 'nid' => '2', @@ -3958,6 +3990,7 @@ $connection->insert('content_type_story') 'field_test_text_single_checkbox2_value' => NULL, 'field_test_datestamp_value2' => NULL, 'field_test_datetime_value2' => NULL, + 'field_test_string_selectlist_value' => NULL, )) ->values(array( 'nid' => '2', @@ -3989,6 +4022,7 @@ $connection->insert('content_type_story') 'field_test_text_single_checkbox2_value' => NULL, 'field_test_datestamp_value2' => NULL, 'field_test_datetime_value2' => NULL, + 'field_test_string_selectlist_value' => NULL, )) ->values(array( 'nid' => '9', @@ -4020,6 +4054,7 @@ $connection->insert('content_type_story') 'field_test_text_single_checkbox2_value' => 'Off', 'field_test_datestamp_value2' => '1391357160', 'field_test_datetime_value2' => '2015-03-04 06:07:00', + 'field_test_string_selectlist_value' => NULL, )) ->execute(); @@ -9956,6 +9991,86 @@ $connection->insert('i18n_strings') 'objectindex' => '0', 'format' => '0', )) +->values(array( + 'lid' => '1680', + 'objectid' => 'employee-field_company', + 'type' => 'field', + 'property' => 'widget_label', + 'objectindex' => '0', + 'format' => '0', +)) +->values(array( + 'lid' => '1681', + 'objectid' => 'employee-field_commander', + 'type' => 'field', + 'property' => 'widget_label', + 'objectindex' => '0', + 'format' => '0', +)) +->values(array( + 'lid' => '1682', + 'objectid' => 'employee-field_company_2', + 'type' => 'field', + 'property' => 'widget_label', + 'objectindex' => '0', + 'format' => '0', +)) +->values(array( + 'lid' => '1683', + 'objectid' => 'employee-field_company_3', + 'type' => 'field', + 'property' => 'widget_label', + 'objectindex' => '0', + 'format' => '0', +)) +->values(array( + 'lid' => '1684', + 'objectid' => 'page-field_reference', + 'type' => 'field', + 'property' => 'widget_label', + 'objectindex' => '0', + 'format' => '0', +)) +->values(array( + 'lid' => '1685', + 'objectid' => 'page-field_reference_2', + 'type' => 'field', + 'property' => 'widget_label', + 'objectindex' => '0', + 'format' => '0', +)) +->values(array( + 'lid' => '1686', + 'objectid' => 'story-field_test_string_selectlist', + 'type' => 'field', + 'property' => 'widget_label', + 'objectindex' => '0', + 'format' => '0', +)) +->values(array( + 'lid' => '1689', + 'objectid' => 'test_planet-field_test_text_single_checkbox', + 'type' => 'field', + 'property' => 'widget_label', + 'objectindex' => '0', + 'format' => '0', +)) +->values(array( + 'lid' => '1690', + 'objectid' => 'field_test_string_selectlist', + 'type' => 'field', + 'property' => 'option_A', + 'objectindex' => '0', + 'format' => '0', +)) +->values(array( + 'lid' => '1691', + 'objectid' => 'field_test_string_selectlist', + 'type' => 'field', + 'property' => 'option_B', + 'objectindex' => '0', + 'format' => '0', +)) ->execute(); $connection->schema()->createTable('i18n_variable', array( @@ -22457,6 +22572,76 @@ $connection->insert('locales_source') 'source' => 'Translation test', 'version' => '1', )) +->values(array( + 'lid' => '1680', + 'location' => 'field:employee-field_company:widget_label', + 'textgroup' => 'cck', + 'source' => 'Company', + 'version' => '1', +)) +->values(array( + 'lid' => '1681', + 'location' => 'field:employee-field_commander:widget_label', + 'textgroup' => 'cck', + 'source' => 'Commanding Officer', + 'version' => '1', +)) +->values(array( + 'lid' => '1682', + 'location' => 'field:employee-field_company_2:widget_label', + 'textgroup' => 'cck', + 'source' => 'Company 2', + 'version' => '1', +)) +->values(array( + 'lid' => '1683', + 'location' => 'field:employee-field_company_3:widget_label', + 'textgroup' => 'cck', + 'source' => 'Company 3', + 'version' => '1', +)) +->values(array( + 'lid' => '1684', + 'location' => 'field:page-field_reference:widget_label', + 'textgroup' => 'cck', + 'source' => 'Reference', + 'version' => '1', +)) +->values(array( + 'lid' => '1685', + 'location' => 'field:page-field_reference_2:widget_label', + 'textgroup' => 'cck', + 'source' => 'Reference', + 'version' => '1', +)) +->values(array( + 'lid' => '1686', + 'location' => 'field:story-field_test_string_selectlist:widget_label', + 'textgroup' => 'cck', + 'source' => 'String Select List Field', + 'version' => '1', +)) +->values(array( + 'lid' => '1689', + 'location' => 'field:test_planet-field_test_text_single_checkbox:widget_label', + 'textgroup' => 'cck', + 'source' => 'Text Single Checkbox Field', + 'version' => '1', +)) +->values(array( + 'lid' => '1690', + 'location' => 'field:field_test_string_selectlist:option_A', + 'textgroup' => 'cck', + 'source' => 'Black', + 'version' => '1', +)) +->values(array( + 'lid' => '1691', + 'location' => 'field:field_test_string_selectlist:option_B', + 'textgroup' => 'cck', + 'source' => 'White', + 'version' => '1', +)) ->execute(); $connection->schema()->createTable('locales_target', array( @@ -27294,6 +27479,14 @@ $connection->insert('locales_target') 'i18n_status' => '0', )) ->values(array( + 'lid' => '607', + 'translation' => 'fr - 1.234', + 'language' => 'fr', + 'plid' => '0', + 'plural' => '0', + 'i18n_status' => '0', +)) +->values(array( 'lid' => '608', 'translation' => 'fr - Integer Select List Field', 'language' => 'fr', @@ -27310,6 +27503,22 @@ $connection->insert('locales_target') 'i18n_status' => '0', )) ->values(array( + 'lid' => '611', + 'translation' => 'fr - 2341', + 'language' => 'fr', + 'plid' => '0', + 'plural' => '0', + 'i18n_status' => '0', +)) +->values(array( + 'lid' => '613', + 'translation' => 'fr - 4123', + 'language' => 'fr', + 'plid' => '0', + 'plural' => '0', + 'i18n_status' => '0', +)) +->values(array( 'lid' => '614', 'translation' => 'fr - Text Single Checkbox Field', 'language' => 'fr', @@ -27502,6 +27711,14 @@ $connection->insert('locales_target') 'i18n_status' => '0', )) ->values(array( + 'lid' => '1690', + 'translation' => 'Noir', + 'language' => 'fr', + 'plid' => '0', + 'plural' => '0', + 'i18n_status' => '0', +)) +->values(array( 'lid' => '66', 'translation' => 'zu - CCK - Aucune Intégration aux Vues', 'language' => 'zu', @@ -27582,6 +27799,22 @@ $connection->insert('locales_target') 'i18n_status' => '0', )) ->values(array( + 'lid' => '607', + 'translation' => 'zu - 1.234', + 'language' => 'zu', + 'plid' => '0', + 'plural' => '0', + 'i18n_status' => '0', +)) +->values(array( + 'lid' => '611', + 'translation' => 'zu - 2341', + 'language' => 'zu', + 'plid' => '0', + 'plural' => '0', + 'i18n_status' => '0', +)) +->values(array( 'lid' => '621', 'translation' => 'zu - Hello', 'language' => 'zu', @@ -27597,6 +27830,22 @@ $connection->insert('locales_target') 'plural' => '0', 'i18n_status' => '0', )) +->values(array( + 'lid' => '1690', + 'translation' => 'Okumnyama', + 'language' => 'zu', + 'plid' => '0', + 'plural' => '0', + 'i18n_status' => '0', +)) +->values(array( + 'lid' => '1691', + 'translation' => 'Mhlophe', + 'language' => 'zu', + 'plid' => '0', + 'plural' => '0', + 'i18n_status' => '0', +)) ->execute(); $connection->schema()->createTable('menu_custom', array( diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6Test.php b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6Test.php index 26117ba61af6..29219d8ff76e 100644 --- a/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6Test.php +++ b/core/modules/migrate_drupal_ui/tests/src/Functional/d6/MigrateUpgrade6Test.php @@ -67,8 +67,8 @@ class MigrateUpgrade6Test extends MigrateUpgradeExecuteTestBase { 'contact_form' => 5, 'configurable_language' => 5, 'editor' => 2, - 'field_config' => 89, - 'field_storage_config' => 63, + 'field_config' => 90, + 'field_storage_config' => 64, 'file' => 7, 'filter_format' => 7, 'image_style' => 5, |