Commit 50327552 authored by alexpott's avatar alexpott

Issue #2248407 by ultimike, hussainweb, benjy, jp.stacey: D6 Block Mapping.

parent 5ffb1d3c
......@@ -3,6 +3,11 @@ label: Drupal 6 blocks
source:
plugin: d6_block
process:
# Drupal 8 does not have a status but it doesn't matter; this is here to
# skip disabled blocks.
status:
plugin: skip_row_on_empty
source: status
id:
# We need something unique, so aggregator, aggregator_1 etc will do.
plugin: dedupe_entity
......@@ -43,8 +48,26 @@ process:
3: views_block:who_s_online-who_s_online_block
-
plugin: d6_block_plugin_id
region: region
theme: theme
theme:
plugin: d6_block_theme
source:
- theme
- default_theme
- admin_theme
region:
plugin: d6_block_region
source:
- region
- theme
- @theme
region_map:
left: sidebar_first
right: sidebar_second
sidebar_first: sidebar_first
sidebar_second: sidebar_second
help: help
header: header
footer: footer
label: title
weight: weight
settings:
......@@ -59,7 +82,6 @@ process:
destination:
plugin: entity:block
migration_dependencies:
required:
- d6_custom_block
optional:
- d6_menu
- d6_custom_block
id: d6_system_theme
label: Drupal 6 theme configuration
source:
plugin: variable
variables:
- admin_theme
- theme_default
process:
admin: admin_theme
default: theme_default
destination:
plugin: config
config_name: system.theme
<?php
/**
* @file
* Contains \Drupal\migrate_drupal\Plugin\migrate\Process\d6\BlockRegion.
*/
namespace Drupal\migrate_drupal\Plugin\migrate\Process\d6;
use Drupal\Component\Utility\NestedArray;
use Drupal\migrate\MigrateExecutable;
use Drupal\migrate\ProcessPluginBase;
use Drupal\migrate\Row;
/**
* @MigrateProcessPlugin(
* id = "d6_block_region"
* )
*/
class BlockRegion extends ProcessPluginBase {
/**
* {@inheritdoc}
*
* Set the destination block region, based on the source region and theme as
* well as the current destination default theme.
*/
public function transform($value, MigrateExecutable $migrate_executable, Row $row, $destination_property) {
list($region, $source_theme, $destination_theme) = $value;
// Theme is the same on both source and destination, we will assume they
// have the same regions.
if (strtolower($source_theme) == strtolower($destination_theme)) {
return $region;
}
// If the source and destination theme are different, try to use the
// mappings defined in the configuration.
$region_map = $this->configuration['region_map'];
if (isset($region_map[$region])) {
return $region_map[$region];
}
// Oh well, we tried. Put the block in the main content region.
return 'content';
}
}
<?php
/**
* @file
* Contains \Drupal\migrate_drupal\Plugin\migrate\Process\d6\BlockTheme.
*/
namespace Drupal\migrate_drupal\Plugin\migrate\Process\d6;
use Drupal\migrate\Entity\MigrationInterface;
use Drupal\migrate\MigrateExecutable;
use Drupal\migrate\ProcessPluginBase;
use Drupal\migrate\Row;
use Drupal\Core\Config\Config;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* @MigrateProcessPlugin(
* id = "d6_block_theme"
* )
*/
class BlockTheme extends ProcessPluginBase implements ContainerFactoryPluginInterface {
/**
* Contains the configuration object factory.
*
* @var \Drupal\Core\Config\ConfigFactoryInterface
*/
protected $configFactory;
/**
* Contains the system.theme configuration object.
*
* @var \Drupal\Core\Config\Config
*/
protected $themeConfig;
/**
* Constructs a BlockTheme object.
*
* @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 \Drupal\migrate\Entity\MigrationInterface $migration
* The migration entity.
* @param \Drupal\Core\Config\Config $theme_config
* The system.theme configuration factory object.
* @param array $themes
* The list of themes available on the destination.
*/
public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, Config $theme_config, array $themes) {
parent::__construct($configuration, $plugin_id, $plugin_definition, $migration);
$this->themeConfig = $theme_config;
$this->themes = $themes;
}
/**
* {@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')->get('system.theme'),
$container->get('theme_handler')->listInfo()
);
}
/**
* {@inheritdoc}
*
* Set the block theme, based on the current default theme.
*/
public function transform($value, MigrateExecutable $migrate_executable, Row $row, $destination_property) {
list($theme, $d6_default_theme, $d6_admin_theme) = $value;
// If the source theme exists on the destination, we're good.
if (isset($this->themes[$theme])) {
return $theme;
}
// If the source block is assigned to a region in the source default theme,
// then assign it to the destination default theme.
if (strtolower($theme) == strtolower($d6_default_theme)) {
return $this->themeConfig->get('default');
}
// If the source block is assigned to a region in the source admin theme,
// then assign it to the destination admin theme.
if (strtolower($theme) == strtolower($d6_admin_theme)) {
return $this->themeConfig->get('admin');
}
// We couldn't map it to a D8 theme so just return the incoming theme.
return $theme;
}
}
......@@ -18,6 +18,19 @@
* )
*/
class Block extends DrupalSqlBase {
/**
* The default theme name.
*
* @var string
*/
protected $defaultTheme;
/**
* The admin theme name.
*
* @var string
*/
protected $adminTheme;
/**
* {@inheritdoc}
......@@ -29,6 +42,15 @@ public function query() {
return $query;
}
/**
* {@inheritdoc}
*/
protected function runQuery() {
$this->defaultTheme = $this->variableGet('theme_default', 'Garland');
$this->adminTheme = $this->variableGet('admin_theme', null);
return parent::runQuery();
}
/**
* {@inheritdoc}
*/
......@@ -53,6 +75,8 @@ public function fields() {
* {@inheritdoc}
*/
public function prepareRow(Row $row) {
$row->setSourceProperty('default_theme', $this->defaultTheme);
$row->setSourceProperty('admin_theme', $this->adminTheme);
$module = $row->getSourceProperty('module');
$delta = $row->getSourceProperty('delta');
$roles = $this->select('blocks_roles', 'br')
......@@ -63,8 +87,8 @@ public function prepareRow(Row $row) {
->fetchCol();
$row->setSourceProperty('permissions', $roles);
$settings = array();
// Contrib can use hook_migration_d6_block_prepare_row() to add similar variables
// via $migration->getSource()->variableGet().
// Contrib can use hook_migration_d6_block_prepare_row() to add similar
// variables via $migration->getSource()->variableGet().
switch ($module) {
case 'aggregator':
list($type, $id) = explode('-', $delta);
......
......@@ -170,7 +170,7 @@ public function load() {
'pages' => '',
'title' => '',
'cache' => '-1'
))
))
->values(array(
'bid' => '2',
'module' => 'user',
......@@ -321,6 +321,36 @@ public function load() {
'title' => 'Another Static Block',
'cache' => '-1'
))
->values(array(
'bid' => '12',
'module' => 'block',
'delta' => '1',
'theme' => 'test_theme',
'status' => '1',
'weight' => '-7',
'region' => 'right',
'custom' => '0',
'throttle' => '0',
'visibility' => '0',
'pages' => '',
'title' => '',
'cache' => '-1'
))
->values(array(
'bid' => '13',
'module' => 'block',
'delta' => '2',
'theme' => 'test_theme',
'status' => '1',
'weight' => '-2',
'region' => 'left',
'custom' => '0',
'throttle' => '0',
'visibility' => '0',
'pages' => '',
'title' => '',
'cache' => '-1'
))
->execute();
}
}
<?php
/**
* @file
* Contains \Drupal\migrate_drupal\Tests\Dump\Drupal6SystemTheme.
*/
namespace Drupal\migrate_drupal\Tests\Dump;
/**
* Database dump for testing system.theme.yml migration.
*/
class Drupal6SystemTheme extends Drupal6DumpBase {
/**
* {@inheritdoc}
*/
public function load() {
$this->createTable('variable');
$this->database->insert('variable')->fields(array(
'name',
'value',
))
->values(array(
'name' => 'admin_theme',
'value' => 'i:0;',
))
->values(array(
'name' => 'theme_default',
'value' => 's:7:"garland";',
))
->execute();
}
}
......@@ -50,8 +50,20 @@ public function setUp() {
'd6_custom_block' => array(
array(array(10), array(1)),
array(array(11), array(2)),
array(array(12), array(1)),
array(array(13), array(2)),
)
));
// Set Bartik and Seven as the default public and admin theme.
$config = \Drupal::config('system.theme');
$config->set('default', 'bartik');
$config->set('admin', 'seven');
$config->save();
// Enable one of D8's test themes.
\Drupal::service('theme_handler')->enable(array('test_theme'));
/** @var \Drupal\migrate\entity\Migration $migration */
$migration = entity_load('migration', 'd6_block');
$dumps = array(
......@@ -68,13 +80,13 @@ public function setUp() {
public function testBlockMigration() {
/** @var $blocks \Drupal\block\BlockInterface[] */
$blocks = entity_load_multiple('block');
$this->assertEqual(count($blocks), 11);
$this->assertEqual(count($blocks), 8);
// User blocks
$test_block_user = $blocks['user'];
$this->assertNotNull($test_block_user);
$this->assertEqual('left', $test_block_user->get('region'));
$this->assertEqual('garland', $test_block_user->get('theme'));
$this->assertEqual('sidebar_first', $test_block_user->get('region'));
$this->assertEqual('bartik', $test_block_user->get('theme'));
$visibility = $test_block_user->getVisibility();
$this->assertEqual(TRUE, $visibility['request_path']['negate']);
$this->assertEqual('', $visibility['request_path']['pages']);
......@@ -82,85 +94,38 @@ public function testBlockMigration() {
$test_block_user_1 = $blocks['user_1'];
$this->assertNotNull($test_block_user_1);
$this->assertEqual('left', $test_block_user_1->get('region'));
$this->assertEqual('garland', $test_block_user_1->get('theme'));
$this->assertEqual('sidebar_first', $test_block_user_1->get('region'));
$this->assertEqual('bartik', $test_block_user_1->get('theme'));
$visibility = $test_block_user_1->getVisibility();
$this->assertEqual(TRUE, $visibility['request_path']['negate']);
$this->assertEqual('', $visibility['request_path']['pages']);
$this->assertEqual(0, $test_block_user_1->weight);
$test_block_user_2 = $blocks['user_2'];
$this->assertNotNull($test_block_user_2);
$this->assertEqual('', $test_block_user_2->get('region'));
$this->assertEqual('garland', $test_block_user_2->get('theme'));
$visibility = $test_block_user_2->getVisibility();
$this->assertEqual(TRUE, $visibility['request_path']['negate']);
$this->assertEqual('', $visibility['request_path']['pages']);
$this->assertEqual(-3, $test_block_user_2->weight);
$test_block_user_3 = $blocks['user_3'];
$this->assertNotNull($test_block_user_3);
$this->assertEqual('', $test_block_user_3->get('region'));
$this->assertEqual('garland', $test_block_user_3->get('theme'));
$visibility = $test_block_user_3->getVisibility();
$this->assertEqual(TRUE, $visibility['request_path']['negate']);
$this->assertEqual('', $visibility['request_path']['pages']);
$this->assertEqual(-1, $test_block_user_3->weight);
// Check system block
$test_block_system = $blocks['system'];
$this->assertNotNull($test_block_system);
$this->assertEqual('footer', $test_block_system->get('region'));
$this->assertEqual('garland', $test_block_system->get('theme'));
$this->assertEqual('bartik', $test_block_system->get('theme'));
$visibility = $test_block_system->getVisibility();
$this->assertEqual(TRUE, $visibility['request_path']['negate']);
$this->assertEqual('', $visibility['request_path']['pages']);
$this->assertEqual(-5, $test_block_system->weight);
// Check comment block
$test_block_comment = $blocks['comment'];
$this->assertNotNull($test_block_comment);
$this->assertEqual('', $test_block_comment->get('region'));
$this->assertEqual('garland', $test_block_comment->get('theme'));
$visibility = $test_block_comment->getVisibility();
$this->assertEqual(TRUE, $visibility['request_path']['negate']);
$this->assertEqual('', $visibility['request_path']['pages']);
$this->assertEqual(-6, $test_block_comment->weight);
// Check menu blocks
$test_block_menu = $blocks['menu'];
$this->assertNotNull($test_block_menu);
$this->assertEqual('header', $test_block_menu->get('region'));
$this->assertEqual('garland', $test_block_menu->get('theme'));
$this->assertEqual('bartik', $test_block_menu->get('theme'));
$visibility = $test_block_menu->getVisibility();
$this->assertEqual(TRUE, $visibility['request_path']['negate']);
$this->assertEqual('', $visibility['request_path']['pages']);
$this->assertEqual(-5, $test_block_menu->weight);
$test_block_menu_1 = $blocks['menu_1'];
$this->assertNotNull($test_block_menu_1);
$this->assertEqual('', $test_block_menu_1->get('region'));
$this->assertEqual('garland', $test_block_menu_1->get('theme'));
$visibility = $test_block_menu_1->getVisibility();
$this->assertEqual(TRUE, $visibility['request_path']['negate']);
$this->assertEqual('', $visibility['request_path']['pages']);
$this->assertEqual(-5, $test_block_menu_1->weight);
// Check node block
$test_block_node = $blocks['node'];
$this->assertNotNull($test_block_node);
$this->assertEqual('', $test_block_node->get('region'));
$this->assertEqual('garland', $test_block_node->get('theme'));
$visibility = $test_block_node->getVisibility();
$this->assertEqual(TRUE, $visibility['request_path']['negate']);
$this->assertEqual('', $visibility['request_path']['pages']);
$this->assertEqual(-4, $test_block_node->weight);
// Check custom blocks
$test_block_block = $blocks['block'];
$this->assertNotNull($test_block_block);
$this->assertEqual('content', $test_block_block->get('region'));
$this->assertEqual('garland', $test_block_block->get('theme'));
$this->assertEqual('bartik', $test_block_block->get('theme'));
$visibility = $test_block_block->getVisibility();
$this->assertEqual(FALSE, $visibility['request_path']['negate']);
$this->assertEqual('<front>', $visibility['request_path']['pages']);
......@@ -174,5 +139,23 @@ public function testBlockMigration() {
$this->assertEqual(FALSE, $visibility['request_path']['negate']);
$this->assertEqual('node', $visibility['request_path']['pages']);
$this->assertEqual(-4, $test_block_block_1->weight);
$test_block_block_2 = $blocks['block_2'];
$this->assertNotNull($test_block_block_2);
$this->assertEqual('right', $test_block_block_2->get('region'));
$this->assertEqual('test_theme', $test_block_block_2->get('theme'));
$visibility = $test_block_block_2->getVisibility();
$this->assertEqual(TRUE, $visibility['request_path']['negate']);
$this->assertEqual('', $visibility['request_path']['pages']);
$this->assertEqual(-7, $test_block_block_2->weight);
$test_block_block_3 = $blocks['block_3'];
$this->assertNotNull($test_block_block_3);
$this->assertEqual('left', $test_block_block_3->get('region'));
$this->assertEqual('test_theme', $test_block_block_3->get('theme'));
$visibility = $test_block_block_3->getVisibility();
$this->assertEqual(TRUE, $visibility['request_path']['negate']);
$this->assertEqual('', $visibility['request_path']['pages']);
$this->assertEqual(-2, $test_block_block_3->weight);
}
}
......@@ -105,7 +105,6 @@ class MigrateDrupal6Test extends MigrateFullDrupalTestBase {
'd6_system_performance',
'd6_system_rss',
'd6_system_site',
'd6_system_theme',
'd6_taxonomy_settings',
'd6_taxonomy_term',
'd6_taxonomy_vocabulary',
......@@ -138,6 +137,17 @@ class MigrateDrupal6Test extends MigrateFullDrupalTestBase {
'd6_vocabulary_field',
);
/**
* {@inheritdoc}
*/
public function setUp() {
parent::setUp();
$config = \Drupal::config('system.theme');
$config->set('default', 'bartik');
$config->set('admin', 'seven');
$config->save();
}
/**
* {@inheritdoc}
*/
......@@ -186,7 +196,6 @@ protected function getDumps() {
$tests_path . '/Drupal6SystemPerformance.php',
$tests_path . '/Drupal6SystemRss.php',
$tests_path . '/Drupal6SystemSite.php',
$tests_path . '/Drupal6SystemTheme.php',
$tests_path . '/Drupal6TaxonomySettings.php',
$tests_path . '/Drupal6TaxonomyTerm.php',
$tests_path . '/Drupal6TaxonomyVocabulary.php',
......@@ -260,7 +269,6 @@ protected function getTestClassesList() {
__NAMESPACE__ . '\MigrateSystemPerformanceTest',
__NAMESPACE__ . '\MigrateSystemRssTest',
__NAMESPACE__ . '\MigrateSystemSiteTest',
__NAMESPACE__ . '\MigrateSystemThemeTest',
__NAMESPACE__ . '\MigrateTaxonomyConfigsTest',
__NAMESPACE__ . '\MigrateTaxonomyTermTest',
__NAMESPACE__ . '\MigrateTaxonomyVocabularyTest',
......
<?php
/**
* @file
* Contains \Drupal\migrate_drupal\Tests\d6\MigrateSystemThemeTest.
*/
namespace Drupal\migrate_drupal\Tests\d6;
use Drupal\migrate\MigrateMessage;
use Drupal\migrate\MigrateExecutable;
use Drupal\migrate_drupal\Tests\MigrateDrupalTestBase;
/**
* Upgrade theme variables to system.*.yml.
*
* @group migrate_drupal
*/
class MigrateSystemThemeTest extends MigrateDrupalTestBase {
/**
* {@inheritdoc}
*/
protected function setUp() {
parent::setUp();
$migration = entity_load('migration', 'd6_system_theme');
$dumps = array(
$this->getDumpDirectory() . '/Drupal6SystemTheme.php',
);
$this->prepare($migration, $dumps);
$executable = new MigrateExecutable($migration, new MigrateMessage());
$executable->import();
}
/**
* Tests migration of system (theme) variables to system.theme.yml.
*/
public function testSystemTheme() {
$config = \Drupal::config('system.theme');
$this->assertIdentical($config->get('admin'), '0');
$this->assertIdentical($config->get('default'), 'garland');
}
}
......@@ -17,3 +17,7 @@ stylesheets-remove:
- system.module.css
settings:
theme_test_setting: 'default value'
regions:
content: Content
left: Left
right: Right
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment