reverted: --- b/core/modules/migrate/config/schema/migrate.destination.schema.yml +++ a/core/modules/migrate/config/schema/migrate.destination.schema.yml @@ -16,11 +16,3 @@ config_name: type: string label: 'Configuration name' - -migrate.destination.i18n_config: - type: migrate_destination - label: 'Config' - mapping: - config_name: - type: string - label: 'Configuration name' reverted: --- b/core/modules/migrate/src/Plugin/migrate/destination/i18nConfig.php +++ /dev/null @@ -1,132 +0,0 @@ -config_translation = $config_factory->getEditable($configuration['config_name']); - $this->language_manager = $language_manager; - } - - /** - * {@inheritdoc} - */ - public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration = NULL) { - return new static( - $configuration, - $plugin_id, - $plugin_definition, - $migration, - $container->get('config.factory'), - $container->get('language_manager') - ); - } - - /** - * {@inheritdoc} - */ - public function import(Row $row, array $old_destination_id_values = array()) { - // Sort by language - foreach ($row->getRawDestination() as $property => $lang_array) { - foreach ($lang_array as $langcode => $value) { - $sorted[$langcode][$property] = $value; - } - } - // Update config by language - foreach ($sorted as $langcode => $property) { - if (isset($property) || !empty($this->configuration['store null'])) { - $this->config_translation = $this->language_manager->getLanguageConfigOverride($langcode, $this->configuration['config_name']); - foreach ($property as $key => $value) { - $this->config_translation->set(str_replace(Row::PROPERTY_SEPARATOR, '.', $key), $value); - } - $this->config_translation->save(); - } - } - - return [$this->config_translation->getName()]; - } - - /** - * {@inheritdoc} - */ - public function fields(MigrationInterface $migration = NULL) { - // @todo Dynamically fetch fields using Config Schema API. - } - - /** - * {@inheritdoc} - */ - public function getIds() { - $ids['config_name']['type'] = 'string'; - return $ids; - } - - /** - * {@inheritdoc} - */ - public function calculateDependencies() { - $provider = explode('.', $this->config_translation->getName(), 2)[0]; - $this->addDependency('module', $provider); - return $this->dependencies; - } - -} diff -u b/core/modules/migrate_drupal/src/Plugin/migrate/source/d6/i18nVariable.php b/core/modules/migrate_drupal/src/Plugin/migrate/source/d6/i18nVariable.php --- b/core/modules/migrate_drupal/src/Plugin/migrate/source/d6/i18nVariable.php +++ b/core/modules/migrate_drupal/src/Plugin/migrate/source/d6/i18nVariable.php @@ -13,10 +13,7 @@ use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase; /** - * Drupal variable source from database. - * - * This source class always returns a single row and as such is not a good - * example for any normal source class returning multiple rows. + * Drupal i18n_variable source from database. * * @MigrateSource( * id = "i18n_variable" @@ -42,9 +39,8 @@ /** * {@inheritdoc} */ - protected function initializeIterator() { - return new \ArrayIterator(array($this->values())); + return new \ArrayIterator($this->values()); } /** @@ -52,27 +48,33 @@ * * @return array * An associative array where the keys are the variables specified in the - * plugin configuration and the values are an assiociative array of - * langauge and the values found in the source. + * plugin configuration and the values are the values found in the source. + * A key/value pair is added for the language code. Only those values are + * returned that are actually in the database. */ - protected function values() { - // Create an ID field so we can record migration in the map table. - // Arbitrarily, use the first variable name. - $values['id'] = reset($this->variables); - $results = $this->prepareQuery()->execute(); - $x = []; - foreach ($results->fetchAll() as $result) { - $x[$result->name][$result->language] = unserialize($result->value); + $values = []; + $result = $this->prepareQuery()->execute()->FetchAllAssoc('language'); + foreach ($result as $i18nvariable) { + $values[]['language'] = $i18nvariable->language; + } + $result = $this->prepareQuery()->execute()->FetchAll(); + foreach ($result as $i18nvariable) { + foreach ($values as $key => $value) { + if ($values[$key]['language'] === $i18nvariable->language ) { + $values[$key][$i18nvariable->name] = unserialize($i18nvariable->value); + break; + } + } } - return $values + $x; + return $values; } /** * {@inheritdoc} */ public function count() { - return intval($this->query()->countQuery()->execute()->fetchField() > 0); + return $this->initializeIterator()->count(); } /** @@ -89,14 +91,14 @@ return $this->getDatabase() ->select('i18n_variable', 'v') ->fields('v') - ->condition('name', $this->variables, 'IN'); + ->condition('name', (array) $this->configuration['variables'], 'IN'); } /** * {@inheritdoc} */ public function getIds() { - $ids['id']['type'] = 'string'; + $ids['language']['type'] = 'string'; return $ids; } diff -u b/core/modules/migrate_drupal/tests/src/Unit/source/d6/i18nVariableTest.php b/core/modules/migrate_drupal/tests/src/Unit/source/d6/i18nVariableTest.php --- b/core/modules/migrate_drupal/tests/src/Unit/source/d6/i18nVariableTest.php +++ b/core/modules/migrate_drupal/tests/src/Unit/source/d6/i18nVariableTest.php @@ -40,15 +40,14 @@ */ protected $expectedResults = [ [ - 'id' => 'site_slogan', - 'site_slogan' => [ - 'fr' => 'Migrate est génial', - 'mi' => 'Ko whakamataku heke', - ], - 'site_name' => [ - 'fr' => 'nom de site', - 'mi' => 'ingoa_pae', - ], + 'language' => 'fr', + 'site_slogan' => 'Migrate est génial', + 'site_name' => 'nom de site', + ], + [ + 'language' => 'mi', + 'site_slogan' => 'Ko whakamataku heke', + 'site_name' => 'ingoa_pae', ] ]; @@ -57,10 +56,10 @@ */ protected $databaseContents = [ 'i18n_variable' => [ - array('name' => 'site_slogan', 'language' => 'mi', 'value' => 's:19:"Ko whakamataku heke";'), - array('name' => 'site_name', 'language' => 'mi', 'value' => 's:9:"ingoa_pae";'), array('name' => 'site_slogan', 'language' => 'fr', 'value' => 's:19:"Migrate est génial";'), array('name' => 'site_name', 'language' => 'fr', 'value' => 's:11:"nom de site";'), + array('name' => 'site_slogan', 'language' => 'mi', 'value' => 's:19:"Ko whakamataku heke";'), + array('name' => 'site_name', 'language' => 'mi', 'value' => 's:9:"ingoa_pae";'), ], ]; only in patch2: unchanged: --- a/core/modules/migrate/src/Plugin/migrate/destination/Config.php +++ b/core/modules/migrate/src/Plugin/migrate/destination/Config.php @@ -10,6 +10,7 @@ use Drupal\Component\Plugin\DependentPluginInterface; use Drupal\Core\Config\ConfigFactoryInterface; use Drupal\Core\Entity\DependencyTrait; +use Drupal\Core\Language\LanguageManagerInterface; use Drupal\Core\Plugin\ContainerFactoryPluginInterface; use Drupal\migrate\Entity\MigrationInterface; use Drupal\migrate\Row; @@ -39,6 +40,13 @@ class Config extends DestinationBase implements ContainerFactoryPluginInterface, protected $config; /** + * The language manager. + * + * @var \Drupal\Core\Language\LanguageManagerInterface + */ + protected $language_manager; + + /** * Constructs a Config destination object. * * @param array $configuration @@ -51,10 +59,13 @@ class Config extends DestinationBase implements ContainerFactoryPluginInterface, * The migration entity. * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory * The configuration factory. + * @param \Drupal\Core\Language\ConfigurableLanguageManagerInterface $language_manager + * The language manager. */ - public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, ConfigFactoryInterface $config_factory) { + public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, ConfigFactoryInterface $config_factory, LanguageManagerInterface $language_manager) { parent::__construct($configuration, $plugin_id, $plugin_definition, $migration); $this->config = $config_factory->getEditable($configuration['config_name']); + $this->language_manager = $language_manager; } /** @@ -66,7 +77,8 @@ public static function create(ContainerInterface $container, array $configuratio $plugin_id, $plugin_definition, $migration, - $container->get('config.factory') + $container->get('config.factory'), + $container->get('language_manager') ); } @@ -74,6 +86,10 @@ public static function create(ContainerInterface $container, array $configuratio * {@inheritdoc} */ public function import(Row $row, array $old_destination_id_values = array()) { + if ($row->hasDestinationProperty('langcode')) { + $this->config = $this->language_manager->getLanguageConfigOverride($row->getDestinationProperty('langcode'), $this->config->getName()); + } + foreach ($row->getRawDestination() as $key => $value) { if (isset($value) || !empty($this->configuration['store null'])) { $this->config->set(str_replace(Row::PROPERTY_SEPARATOR, '.', $key), $value); only in patch2: unchanged: --- a/core/modules/migrate/tests/src/Unit/destination/ConfigTest.php +++ b/core/modules/migrate/tests/src/Unit/destination/ConfigTest.php @@ -49,9 +49,72 @@ public function testImport() { ->disableOriginalConstructor() ->getMock(); $row->expects($this->once()) + ->method('hasDestinationProperty') + ->will($this->returnValue(FALSE)); + $row->expects($this->any()) ->method('getRawDestination') ->will($this->returnValue($source)); - $destination = new Config(array('config_name' => 'd8_config'), 'd8_config', array('pluginId' => 'd8_config'), $migration, $config_factory); + $language_manager = $this->getMockBuilder('Drupal\language\ConfigurableLanguageManagerInterface') + ->disableOriginalConstructor() + ->getMock(); + $language_manager->expects($this->never()) + ->method('getLanguageConfigOverride') + ->with('fr', 'd8_config') + ->will($this->returnValue($config)); + $destination = new Config(array('config_name' => 'd8_config'), 'd8_config', array('pluginId' => 'd8_config'), $migration, $config_factory, $language_manager); + $destination_id = $destination->import($row); + $this->assertEquals($destination_id, ['d8_config']); + } + + /** + * Test the import method. + */ + public function testLanguageImport() { + $source = array( + 'langcode' => 'mi', + ); + $migration = $this->getMockBuilder('Drupal\migrate\Entity\Migration') + ->disableOriginalConstructor() + ->getMock(); + $config = $this->getMockBuilder('Drupal\Core\Config\Config') + ->disableOriginalConstructor() + ->getMock(); + foreach ($source as $key => $val) { + $config->expects($this->once()) + ->method('set') + ->with($this->equalTo($key), $this->equalTo($val)) + ->will($this->returnValue($config)); + } + $config->expects($this->once()) + ->method('save'); + $config->expects($this->any()) + ->method('getName') + ->willReturn('d8_config'); + $config_factory = $this->getMock('Drupal\Core\Config\ConfigFactoryInterface'); + $config_factory->expects($this->once()) + ->method('getEditable') + ->with('d8_config') + ->will($this->returnValue($config)); + $row = $this->getMockBuilder('Drupal\migrate\Row') + ->disableOriginalConstructor() + ->getMock(); + $row->expects($this->once()) + ->method('hasDestinationProperty') + ->will($this->returnValue($source)); + $row->expects($this->any()) + ->method('getRawDestination') + ->will($this->returnValue($source)); + $row->expects($this->any()) + ->method('getDestinationProperty') + ->will($this->returnValue($source['langcode'])); + $language_manager = $this->getMockBuilder('Drupal\language\ConfigurableLanguageManagerInterface') + ->disableOriginalConstructor() + ->getMock(); + $language_manager->expects($this->any()) + ->method('getLanguageConfigOverride') + ->with('mi', 'd8_config') + ->will($this->returnValue($config)); + $destination = new Config(array('config_name' => 'd8_config'), 'd8_config', array('pluginId' => 'd8_config'), $migration, $config_factory, $language_manager); $destination_id = $destination->import($row); $this->assertEquals($destination_id, ['d8_config']); }