diff --git a/core/modules/migrate_drupal/tests/fixtures/drupal7.php b/core/modules/migrate_drupal/tests/fixtures/drupal7.php index ea4ecdac1d2..537376f7677 100644 --- a/core/modules/migrate_drupal/tests/fixtures/drupal7.php +++ b/core/modules/migrate_drupal/tests/fixtures/drupal7.php @@ -44169,7 +44169,7 @@ $connection->insert('variable') )) ->values(array( 'name' => 'search_active_modules', - 'value' => 'a:2:{s:4:"node";s:4:"node";s:4:"user";s:4:"user";}', + 'value' => 'a:2:{s:4:"node";s:4:"node";s:4:"user";i:0;}', )) ->values(array( 'name' => 'search_and_or_limit', diff --git a/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php b/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php index 212a044c2dd..5ca90989fb5 100644 --- a/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php +++ b/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php @@ -394,7 +394,7 @@ class MigrateUpgradeForm extends ConfirmFormBase { 'source_module' => 'path', 'destination_module' => 'path', ], - 'search_page' => [ + 'd6_search_page' => [ 'source_module' => 'search', 'destination_module' => 'search', ], @@ -402,6 +402,10 @@ class MigrateUpgradeForm extends ConfirmFormBase { 'source_module' => 'search', 'destination_module' => 'search', ], + 'd7_search_page' => [ + 'source_module' => 'search', + 'destination_module' => 'search', + ], 'd7_search_settings' => [ 'source_module' => 'search', 'destination_module' => 'search', diff --git a/core/modules/search/migration_templates/search_page.yml b/core/modules/search/migration_templates/d6_search_page.yml similarity index 89% rename from core/modules/search/migration_templates/search_page.yml rename to core/modules/search/migration_templates/d6_search_page.yml index 8ddc02acfbc..27267a46f0e 100644 --- a/core/modules/search/migration_templates/search_page.yml +++ b/core/modules/search/migration_templates/d6_search_page.yml @@ -1,10 +1,9 @@ -id: search_page +id: d6_search_page label: Search page configuration migration_tags: - Drupal 6 - - Drupal 7 source: - plugin: variable + plugin: d6_search_page variables: - node_rank_comments - node_rank_promote @@ -17,6 +16,7 @@ source: path: node plugin: node_search process: + module: module id: 'constants/id' path: 'constants/path' plugin: 'constants/plugin' diff --git a/core/modules/search/migration_templates/d7_search_page.yml b/core/modules/search/migration_templates/d7_search_page.yml new file mode 100644 index 00000000000..197fabf013f --- /dev/null +++ b/core/modules/search/migration_templates/d7_search_page.yml @@ -0,0 +1,46 @@ +id: d7_search_page +label: Search page configuration +migration_tags: + - Drupal 7 +source: + plugin: d7_search_page + variables: + - node_rank_comments + - node_rank_promote + - node_rank_relevance + - node_rank_sticky + - node_rank_views + constants: + suffix: _search +process: + module: module + module_exists: + - + plugin: skip_on_empty + method: row + source: module_exists + status: + - + plugin: static_map + source: status + map: + node: true + user: true + 0: false + id: + - + plugin: concat + source: + - module + - 'constants/suffix' + plugin: + - + plugin: concat + source: + - module + - 'constants/suffix' + path: module + 'configuration/rankings': + plugin: search_configuration_rankings +destination: + plugin: entity:search_page diff --git a/core/modules/search/src/Plugin/migrate/destination/EntitySearchPage.php b/core/modules/search/src/Plugin/migrate/destination/EntitySearchPage.php index ddd8da79567..a3e3d8ea073 100644 --- a/core/modules/search/src/Plugin/migrate/destination/EntitySearchPage.php +++ b/core/modules/search/src/Plugin/migrate/destination/EntitySearchPage.php @@ -3,8 +3,12 @@ namespace Drupal\search\Plugin\migrate\destination; use Drupal\Core\Entity\EntityInterface; +use Drupal\Core\Entity\EntityStorageInterface; +use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\migrate\Plugin\migrate\destination\EntityConfigBase; +use Drupal\migrate\Plugin\MigrationInterface; use Drupal\migrate\Row; +use Symfony\Component\DependencyInjection\ContainerInterface; /** * @MigrateDestination( @@ -13,6 +17,72 @@ use Drupal\migrate\Row; */ class EntitySearchPage extends EntityConfigBase { + /** + * The module handler. + * + * @var \Drupal\Core\Extension\ModuleHandlerInterface + */ + protected $moduleHandler; + + /** + * Constructs a new EntitySearchPage. + * + * @param array $configuration + * A configuration array containing information about the plugin instance. + * @param string $plugin_id + * The plugin_id for the plugin instance. + * @param mixed $plugin_definition + * The plugin implementation definition. + * @param MigrationInterface $migration + * The migration. + * @param EntityStorageInterface $storage + * The storage for this entity type. + * @param array $bundles + * The list of bundles this entity type has. + * @param ModuleHandlerInterface $module_handler + * The module handler. + */ + public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, EntityStorageInterface $storage, array $bundles, ModuleHandlerInterface $module_handler) { + parent::__construct($configuration, $plugin_id, $plugin_definition, $migration, $storage, $bundles); + $this->moduleHandler = $module_handler; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration = NULL) { + $entity_type_id = static::getEntityTypeId($plugin_id); + return new static( + $configuration, + $plugin_id, + $plugin_definition, + $migration, + $container->get('entity.manager')->getStorage($entity_type_id), + array_keys($container->get('entity.manager')->getBundleInfo($entity_type_id)), + $container->get('module_handler') + ); + } + + /** + * {@inheritdoc} + */ + public function import(Row $row, array $old_destination_id_values = array()) { + if ($this->moduleHandler->moduleExists($row->getDestinationProperty('module'))) { + parent::import($row, $old_destination_id_values); + $id = $row->getDestinationProperty('id'); + /** @var \Drupal\search\Entity\SearchPage $search_page */ + $search_page = $this->storage->load($id); + if ($row->getDestinationProperty('status')) { + $search_page->enable()->save(); + } + else { + $search_page->disable()->save(); + } + return [$id]; + } + return []; + } + /** * Updates the entity with the contents of a row. * @@ -23,7 +93,10 @@ class EntitySearchPage extends EntityConfigBase { */ protected function updateEntity(EntityInterface $entity, Row $row) { $entity->setPlugin($row->getDestinationProperty('plugin')); - $entity->getPlugin()->setConfiguration($row->getDestinationProperty('configuration')); + // The user_search plugin does not have a setConfiguration() method. + if (method_exists($entity->getPlugin(), 'setConfiguration')) { + $entity->getPlugin()->setConfiguration($row->getDestinationProperty('configuration')); + } } } diff --git a/core/modules/search/src/Plugin/migrate/process/SearchConfigurationRankings.php b/core/modules/search/src/Plugin/migrate/process/SearchConfigurationRankings.php index f021df68be1..153161f9a91 100644 --- a/core/modules/search/src/Plugin/migrate/process/SearchConfigurationRankings.php +++ b/core/modules/search/src/Plugin/migrate/process/SearchConfigurationRankings.php @@ -21,7 +21,7 @@ class SearchConfigurationRankings extends ProcessPluginBase { * Generate the configuration rankings. */ public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) { - $return = array(); + $return = NULL; foreach ($row->getSource() as $name => $rank) { if (substr($name, 0, 10) == 'node_rank_' && is_numeric($rank)) { $return[substr($name, 10)] = $rank; diff --git a/core/modules/search/src/Plugin/migrate/process/d6/SearchConfigurationRankings.php b/core/modules/search/src/Plugin/migrate/process/d6/SearchConfigurationRankings.php deleted file mode 100644 index 6c1d16b0409..00000000000 --- a/core/modules/search/src/Plugin/migrate/process/d6/SearchConfigurationRankings.php +++ /dev/null @@ -1,33 +0,0 @@ -getSource() as $name => $rank) { - if (substr($name, 0, 10) == 'node_rank_' && $rank) { - $return[substr($name, 10)] = $rank; - } - } - return $return; - } - -} diff --git a/core/modules/search/src/Plugin/migrate/source/d6/SearchPage.php b/core/modules/search/src/Plugin/migrate/source/d6/SearchPage.php new file mode 100644 index 00000000000..a496af989a8 --- /dev/null +++ b/core/modules/search/src/Plugin/migrate/source/d6/SearchPage.php @@ -0,0 +1,45 @@ + 'node'], parent::values()); + } + + /** + * {@inheritdoc} + */ + public function fields() { + return [ + 'module' => $this->t('The search module.'), + ]; + } + + /** + * {@inheritdoc} + */ + public function getIds() { + $ids['module']['type'] = 'string'; + return $ids; + } + +} diff --git a/core/modules/search/src/Plugin/migrate/source/d7/SearchPage.php b/core/modules/search/src/Plugin/migrate/source/d7/SearchPage.php new file mode 100644 index 00000000000..ebfb74433a7 --- /dev/null +++ b/core/modules/search/src/Plugin/migrate/source/d7/SearchPage.php @@ -0,0 +1,89 @@ +values()); + } + + /** + * Return the values of the variables specified in the plugin configuration. + * + * @return array + * An associative array where the keys are the variables specified in the + * plugin configuration and the values are the values found in the source. + * And includes the search module and search status. + * Only those values are returned that are actually in the database. + */ + protected function values() { + $search_active_modules = $this->variableGet('search_active_modules', ''); + $values = []; + foreach (['node', 'user'] as $module) { + if (isset($search_active_modules[$module])) { + // Create an ID field so we can record migration in the map table. + $tmp = [ + 'module' => $module, + 'status' => $search_active_modules[$module], + ]; + // Add the node_rank_* variables (only relevant to the node module). + if ($module === 'node') { + $tmp = array_merge($tmp, parent::values()); + } + $values[] = $tmp; + } + } + return $values; + } + + /** + * {@inheritdoc} + */ + public function fields() { + return [ + 'module' => $this->t('The search module.'), + 'status' => $this->t('Whether or not this module is enabled for search.'), + ]; + } + + /** + * {@inheritdoc} + */ + public function getIds() { + $ids['module']['type'] = 'string'; + $ids['status']['type'] = 'string'; + return $ids; + } + + /** + * {@inheritdoc} + */ + public function count() { + return $this->initializeIterator()->count(); + } + + /** + * {@inheritdoc} + */ + public function prepareRow(Row $row) { + $exists = $this->moduleExists($row->getSourceProperty('module')); + $row->setSourceProperty('module_exists', $exists); + return parent::prepareRow($row); + } + +} diff --git a/core/modules/search/tests/src/Kernel/Migrate/d6/MigrateSearchPageTest.php b/core/modules/search/tests/src/Kernel/Migrate/d6/MigrateSearchPageTest.php index bcbc40e0dc7..ddf41ef6e7b 100644 --- a/core/modules/search/tests/src/Kernel/Migrate/d6/MigrateSearchPageTest.php +++ b/core/modules/search/tests/src/Kernel/Migrate/d6/MigrateSearchPageTest.php @@ -7,7 +7,7 @@ use Drupal\Tests\migrate_drupal\Kernel\d6\MigrateDrupal6TestBase; use Drupal\search\Entity\SearchPage; /** - * Upgrade search rank settings to search.page.*.yml. + * Upgrade search page variables. * * @group migrate_drupal_6 */ @@ -23,7 +23,7 @@ class MigrateSearchPageTest extends MigrateDrupal6TestBase { */ protected function setUp() { parent::setUp(); - $this->executeMigration('search_page'); + $this->executeMigration('d6_search_page'); } /** @@ -53,7 +53,7 @@ class MigrateSearchPageTest extends MigrateDrupal6TestBase { ->execute(); /** @var \Drupal\migrate\Plugin\MigrationInterface $migration */ - $migration = $this->getMigration('search_page'); + $migration = $this->getMigration('d6_search_page'); // Indicate we're rerunning a migration that's already run. $migration->getIdMap()->prepareUpdate(); $this->executeMigration($migration); diff --git a/core/modules/search/tests/src/Kernel/Migrate/d7/MigrateSearchPageTest.php b/core/modules/search/tests/src/Kernel/Migrate/d7/MigrateSearchPageTest.php index d7dae3e8542..5356a2de1de 100644 --- a/core/modules/search/tests/src/Kernel/Migrate/d7/MigrateSearchPageTest.php +++ b/core/modules/search/tests/src/Kernel/Migrate/d7/MigrateSearchPageTest.php @@ -7,7 +7,7 @@ use Drupal\Tests\migrate_drupal\Kernel\d7\MigrateDrupal7TestBase; use Drupal\search\Entity\SearchPage; /** - * Upgrade search rank settings to search.page.*.yml. + * Tests migration of search page status and settings. * * @group migrate_drupal_7 */ @@ -18,34 +18,59 @@ class MigrateSearchPageTest extends MigrateDrupal7TestBase { * * {@inheritdoc} */ - public static $modules = array('node', 'search'); + public static $modules = ['search']; /** * {@inheritdoc} */ protected function setUp() { parent::setUp(); - $this->executeMigration('search_page'); } /** - * Tests Drupal 7 search ranking to Drupal 8 search page entity migration. + * Asserts various aspects of an SearchPage entity. + * + * @param string $id + * The expected search page ID. + * @param string $path + * The expected path of the search page. + * @param bool $status + * The expected status of the search page. + * @param array $expected_config + * An array of expected configuration for the search page. */ - public function testSearchPage() { - $id = 'node_search'; + protected function assertEntity($id, $path, $status = FALSE, array $expected_config = NULL) { /** @var \Drupal\search\Entity\SearchPage $search_page */ $search_page = SearchPage::load($id); - $this->assertIdentical($id, $search_page->id()); - $configuration = $search_page->getPlugin()->getConfiguration(); - $expected_rankings = array( - 'comments' => 0, - 'promote' => 0, - 'relevance' => 2, - 'sticky' => 0, - 'views' => 0, - ); - $this->assertIdentical($expected_rankings, $configuration['rankings']); - $this->assertIdentical('node', $search_page->getPath()); + $this->assertSame($id, $search_page->id()); + $this->assertSame($path, $search_page->getPath()); + $this->assertSame($search_page->status(), $status); + if (isset($expected_config)) { + $configuration = $search_page->getPlugin()->getConfiguration(); + $this->assertSame($expected_config, $configuration); + } + } + + /** + * Tests Drupal 7 search status and settings to Drupal 8 search page entity + * migration. + */ + public function testSearchPage() { + $this->enableModules(['node']); + $this->installConfig(['search']); + $this->executeMigration('d7_search_page'); + + $configuration = [ + 'rankings' => [ + 'comments' => 0, + 'promote' => 0, + 'relevance' => 2, + 'sticky' => 0, + 'views' => 0, + ] + ]; + $this->assertEntity('node_search', 'node', TRUE, $configuration); + $this->assertEntity('user_search', 'user'); // Test that we can re-import using the EntitySearchPage destination. Database::getConnection('default', 'migrate') @@ -55,13 +80,38 @@ class MigrateSearchPageTest extends MigrateDrupal7TestBase { ->execute(); /** @var \Drupal\migrate\Plugin\MigrationInterface $migration */ - $migration = $this->getMigration('search_page'); + $migration = $this->getMigration('d7_search_page'); // Indicate we're rerunning a migration that's already run. $migration->getIdMap()->prepareUpdate(); $this->executeMigration($migration); + $configuration['rankings']['comments'] = 4; + $this->assertEntity('node_search', 'node', TRUE, $configuration); + } - $configuration = SearchPage::load($id)->getPlugin()->getConfiguration(); - $this->assertIdentical(4, $configuration['rankings']['comments']); + /** + * Tests that search page is only migrated for modules enabled on + * destination site. + */ + public function testModuleExists() { + $this->installConfig(['search']); + $this->executeMigration('d7_search_page'); + + $this->assertNull(SearchPage::load('node_search')); + $this->assertEntity('user_search', 'user'); + } + + /** + * Tests that a search page will be created if it does not exist. + */ + public function testUserSearchCreate() { + $this->enableModules(['node']); + $this->installConfig(['search']); + /** @var \Drupal\search\Entity\SearchPage $search_page */ + $search_page = SearchPage::load('user_search'); + $search_page->delete(); + $this->executeMigration('d7_search_page'); + + $this->assertEntity('user_search', 'user'); } } diff --git a/core/modules/search/tests/src/Unit/Plugin/migrate/source/d6/SearchPageTest.php b/core/modules/search/tests/src/Unit/Plugin/migrate/source/d6/SearchPageTest.php new file mode 100644 index 00000000000..eace016a87e --- /dev/null +++ b/core/modules/search/tests/src/Unit/Plugin/migrate/source/d6/SearchPageTest.php @@ -0,0 +1,61 @@ + [ + [ + 'name' => 'node_rank_comments', + 'value' => 's:1:"5";', + ], + [ + 'name' => 'node_rank_promote', + 'value' => 's:1:"1";', + ], + ], + 'system' => [ + [ + 'name' => 'node', + 'type' => 'module', + 'status' => '1', + ] + ] + ]; + + $tests[0]['expected_data'] = [ + [ + 'module' => 'node', + 'node_rank_comments' => '5', + 'node_rank_promote' => '1', + ], + ]; + + $tests[0]['expected_count'] = NULL; + + $tests[0]['configuration'] = [ + 'variables' => ['node_rank_comments', 'node_rank_promote'], + ]; + + return $tests; + } + +} diff --git a/core/modules/search/tests/src/Unit/Plugin/migrate/source/d7/SearchPageTest.php b/core/modules/search/tests/src/Unit/Plugin/migrate/source/d7/SearchPageTest.php new file mode 100644 index 00000000000..112892934c6 --- /dev/null +++ b/core/modules/search/tests/src/Unit/Plugin/migrate/source/d7/SearchPageTest.php @@ -0,0 +1,77 @@ + [ + [ + 'name' => 'search_active_modules', + 'value' => 'a:2:{s:4:"node";s:4:"node";s:4:"user";i:0;}', + ], + [ + 'name' => 'node_rank_comments', + 'value' => 's:1:"5";', + ], + [ + 'name' => 'node_rank_promote', + 'value' => 's:1:"1";', + ], + ], + 'system' => [ + [ + 'name' => 'node', + 'type' => 'module', + 'status' => '0', + ], + [ + 'name' => 'user', + 'type' => 'module', + 'status' => '1', + ], + ], + ]; + + $tests[0]['expected_data'] = [ + [ + 'module' => 'node', + 'status' => 'node', + 'module_exists' => FALSE, + 'node_rank_comments' => '5', + 'node_rank_promote' => '1', + ], + [ + 'module' => 'user', + 'status' => 0, + 'module_exists' => TRUE, + ], + ]; + + $tests[0]['expected_count'] = NULL; + + $tests[0]['configuration'] = [ + 'variables' => ['node_rank_comments', 'node_rank_promote'], + ]; + + return $tests; + } + +}