Update Composer, update everything
This commit is contained in:
parent
ea3e94409f
commit
dda5c284b6
19527 changed files with 1135420 additions and 351004 deletions
|
@ -0,0 +1,10 @@
|
|||
# Migrations with any of these tags will raise an exception if their source
|
||||
# plugin is missing the source_module property in their annotation.
|
||||
enforce_source_module_tags:
|
||||
- Drupal 6
|
||||
- Drupal 7
|
||||
# Migrations with any of these tags will not be derived and executed with the
|
||||
# other migrations. They will be derived and executed after the migrations on
|
||||
# which they depend have been successfully executed.
|
||||
follow_up_migration_tags:
|
||||
- Follow-up migration
|
|
@ -0,0 +1,16 @@
|
|||
migrate_drupal.settings:
|
||||
type: config_object
|
||||
label: 'Migrate Drupal settings'
|
||||
mapping:
|
||||
enforce_source_module_tags:
|
||||
type: sequence
|
||||
label: 'source_module enforcement tags'
|
||||
sequence:
|
||||
type: string
|
||||
label: 'Tag'
|
||||
follow_up_migration_tags:
|
||||
type: sequence
|
||||
label: 'Follow-up migration tags'
|
||||
sequence:
|
||||
type: string
|
||||
label: 'Tag'
|
|
@ -1,8 +1,8 @@
|
|||
name: Migrate Drupal
|
||||
type: module
|
||||
description: 'Contains migrations from older Drupal versions.'
|
||||
package: Core (Experimental)
|
||||
package: Migration
|
||||
version: VERSION
|
||||
core: 8.x
|
||||
dependencies:
|
||||
- migrate
|
||||
- drupal:migrate
|
||||
|
|
33
web/core/modules/migrate_drupal/migrate_drupal.install
Normal file
33
web/core/modules/migrate_drupal/migrate_drupal.install
Normal file
|
@ -0,0 +1,33 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains install and update functions for Migrate Drupal
|
||||
*/
|
||||
|
||||
/**
|
||||
* Creates migrate_drupal.settings config object.
|
||||
*/
|
||||
function migrate_drupal_update_8501() {
|
||||
\Drupal::configFactory()
|
||||
->getEditable('migrate_drupal.settings')
|
||||
->set('enforce_source_module_tags', ['Drupal 6', 'Drupal 7'])
|
||||
->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the follow-up migration tags.
|
||||
*/
|
||||
function migrate_drupal_update_8502() {
|
||||
\Drupal::configFactory()
|
||||
->getEditable('migrate_drupal.settings')
|
||||
->set('follow_up_migration_tags', ['Follow-up migration'])
|
||||
->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* Install migrate_drupal_multilingual since migrate_drupal is installed.
|
||||
*/
|
||||
function migrate_drupal_update_8601() {
|
||||
\Drupal::service('module_installer')->install(['migrate_drupal_multilingual']);
|
||||
}
|
|
@ -9,7 +9,6 @@ use Drupal\Core\Database\DatabaseExceptionWrapper;
|
|||
use Drupal\Core\Routing\RouteMatchInterface;
|
||||
use Drupal\migrate\Exception\RequirementsException;
|
||||
use Drupal\migrate\MigrateExecutable;
|
||||
use Drupal\migrate\MigrateMessage;
|
||||
use Drupal\migrate\Plugin\RequirementsInterface;
|
||||
|
||||
/**
|
||||
|
@ -41,6 +40,9 @@ function migrate_drupal_migration_plugins_alter(&$definitions) {
|
|||
'destination' => [
|
||||
'plugin' => 'null',
|
||||
],
|
||||
'idMap' => [
|
||||
'plugin' => 'null',
|
||||
],
|
||||
];
|
||||
$vocabulary_migration = \Drupal::service('plugin.manager.migration')->createStubMigration($vocabulary_migration_definition);
|
||||
|
||||
|
@ -49,16 +51,24 @@ function migrate_drupal_migration_plugins_alter(&$definitions) {
|
|||
if ($source_plugin instanceof RequirementsInterface) {
|
||||
$source_plugin->checkRequirements();
|
||||
}
|
||||
$executable = new MigrateExecutable($vocabulary_migration, new MigrateMessage());
|
||||
$executable = new MigrateExecutable($vocabulary_migration);
|
||||
$process = ['vid' => $definitions['d6_taxonomy_vocabulary']['process']['vid']];
|
||||
foreach ($source_plugin as $row) {
|
||||
$executable->processRow($row, $process);
|
||||
$source_vid = $row->getSourceProperty('vid');
|
||||
$plugin_ids = ['d6_term_node:' . $source_vid, 'd6_term_node_revision:' . $source_vid];
|
||||
foreach ($plugin_ids as $plugin_id) {
|
||||
if (isset($definitions[$plugin_id])) {
|
||||
$definitions[$plugin_id]['process'][$row->getDestinationProperty('vid')] = 'tid';
|
||||
}
|
||||
// Match the field name derivation in d6_vocabulary_field.yml.
|
||||
$field_name = substr('field_' . $row->getDestinationProperty('vid'), 0, 32);
|
||||
|
||||
// The Forum module is expecting 'taxonomy_forums' as the field name
|
||||
// for the forum nodes. The 'forum_vocabulary' source property is
|
||||
// evaluated in Drupal\taxonomy\Plugin\migrate\source\d6\Vocabulary
|
||||
// and is set to true if the vocabulary vid being migrated is the
|
||||
// same as the one in the 'forum_nav_vocabulary' variable on the
|
||||
// source site.
|
||||
$destination_vid = $row->getSourceProperty('forum_vocabulary') ? 'taxonomy_forums' : $field_name;
|
||||
$definitions[$plugin_id]['process'][$destination_vid] = 'tid';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,9 +2,7 @@
|
|||
|
||||
namespace Drupal\migrate_drupal\Annotation;
|
||||
|
||||
@trigger_error('MigrateCckField is deprecated in Drupal 8.3.x and will be
|
||||
removed before Drupal 9.0.x. Use \Drupal\migrate_drupal\Annotation\MigrateField
|
||||
instead.', E_USER_DEPRECATED);
|
||||
@trigger_error('MigrateCckField is deprecated in Drupal 8.3.x and will be removed before Drupal 9.0.x. Use \Drupal\migrate_drupal\Annotation\MigrateField instead.', E_USER_DEPRECATED);
|
||||
|
||||
/**
|
||||
* Deprecated: Defines a cckfield plugin annotation object.
|
||||
|
@ -14,6 +12,8 @@ instead.', E_USER_DEPRECATED);
|
|||
*
|
||||
* Plugin Namespace: Plugin\migrate\cckfield
|
||||
*
|
||||
* @see https://www.drupal.org/node/2751897
|
||||
*
|
||||
* @Annotation
|
||||
*/
|
||||
class MigrateCckField extends MigrateField {
|
||||
|
|
|
@ -49,6 +49,26 @@ class MigrateField extends Plugin {
|
|||
*
|
||||
* @var int[]
|
||||
*/
|
||||
public $core = [];
|
||||
public $core;
|
||||
|
||||
/**
|
||||
* Identifies the system providing the data the field plugin will read.
|
||||
*
|
||||
* The source_module is expected to be the name of a Drupal module that must
|
||||
* be installed in the source database.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $source_module;
|
||||
|
||||
/**
|
||||
* Identifies the system handling the data the destination plugin will write.
|
||||
*
|
||||
* The destination_module is expected to be the name of a Drupal module on the
|
||||
* destination site that must be installed.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $destination_module;
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\migrate_drupal;
|
||||
|
||||
use Drupal\Core\DependencyInjection\ContainerBuilder;
|
||||
use Drupal\Core\DependencyInjection\ServiceProviderBase;
|
||||
use Symfony\Component\DependencyInjection\Reference;
|
||||
|
||||
/**
|
||||
* Alters container services.
|
||||
*/
|
||||
class MigrateDrupalServiceProvider extends ServiceProviderBase {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function alter(ContainerBuilder $container) {
|
||||
parent::alter($container);
|
||||
|
||||
$container->getDefinition('plugin.manager.migration')
|
||||
->setClass(MigrationPluginManager::class)
|
||||
->addArgument(new Reference('plugin.manager.migrate.source'))
|
||||
->addArgument(new Reference('config.factory'));
|
||||
}
|
||||
|
||||
}
|
|
@ -12,6 +12,13 @@ use Drupal\migrate\Plugin\RequirementsInterface;
|
|||
*/
|
||||
trait MigrationConfigurationTrait {
|
||||
|
||||
/**
|
||||
* The follow-up migration tags.
|
||||
*
|
||||
* @var string[]
|
||||
*/
|
||||
protected $followUpMigrationTags;
|
||||
|
||||
/**
|
||||
* Gets the database connection for the source Drupal database.
|
||||
*
|
||||
|
@ -96,6 +103,19 @@ trait MigrationConfigurationTrait {
|
|||
$all_migrations = $plugin_manager->createInstancesByTag($version_tag);
|
||||
$migrations = [];
|
||||
foreach ($all_migrations as $migration) {
|
||||
// Skip migrations tagged with any of the follow-up migration tags. They
|
||||
// will be derived and executed after the migrations on which they depend
|
||||
// have been successfully executed.
|
||||
// @see Drupal\migrate_drupal\Plugin\MigrationWithFollowUpInterface
|
||||
if (!empty(array_intersect($migration->getMigrationTags(), $this->getFollowUpMigrationTags()))) {
|
||||
continue;
|
||||
}
|
||||
// Multilingual migrations require migrate_drupal_multilingual.
|
||||
$tags = $migration->getMigrationTags() ?: [];
|
||||
if (in_array('Multilingual', $tags, TRUE) && (!\Drupal::service('module_handler')->moduleExists('migrate_drupal_multilingual'))) {
|
||||
throw new RequirementsException(sprintf("Install migrate_drupal_multilingual to run migration '%s'.", $migration->getPluginId()));
|
||||
}
|
||||
|
||||
try {
|
||||
// @todo https://drupal.org/node/2681867 We should be able to validate
|
||||
// the entire migration at this point.
|
||||
|
@ -119,14 +139,28 @@ trait MigrationConfigurationTrait {
|
|||
return $migrations;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the follow-up migration tags.
|
||||
*
|
||||
* @return string[]
|
||||
*/
|
||||
protected function getFollowUpMigrationTags() {
|
||||
if ($this->followUpMigrationTags === NULL) {
|
||||
$this->followUpMigrationTags = \Drupal::configFactory()
|
||||
->get('migrate_drupal.settings')
|
||||
->get('follow_up_migration_tags') ?: [];
|
||||
}
|
||||
return $this->followUpMigrationTags;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines what version of Drupal the source database contains.
|
||||
*
|
||||
* @param \Drupal\Core\Database\Connection $connection
|
||||
* The database connection object.
|
||||
*
|
||||
* @return int|false
|
||||
* An integer representing the major branch of Drupal core (e.g. '6' for
|
||||
* @return string|false
|
||||
* A string representing the major branch of Drupal core (e.g. '6' for
|
||||
* Drupal 6.x), or FALSE if no valid version is matched.
|
||||
*/
|
||||
protected function getLegacyDrupalVersion(Connection $connection) {
|
||||
|
|
|
@ -2,10 +2,11 @@
|
|||
|
||||
namespace Drupal\migrate_drupal;
|
||||
|
||||
|
||||
/**
|
||||
* @deprecated in Drupal 8.1.x, will be removed before Drupal 9.0.0. Use
|
||||
* \Drupal\migrate_drupal\MigrationConfigurationTrait instead.
|
||||
*
|
||||
* @see https://www.drupal.org/node/2873794
|
||||
*/
|
||||
trait MigrationCreationTrait {
|
||||
use MigrationConfigurationTrait;
|
||||
|
|
109
web/core/modules/migrate_drupal/src/MigrationPluginManager.php
Normal file
109
web/core/modules/migrate_drupal/src/MigrationPluginManager.php
Normal file
|
@ -0,0 +1,109 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\migrate_drupal;
|
||||
|
||||
use Drupal\Core\Cache\CacheBackendInterface;
|
||||
use Drupal\Core\Config\ConfigFactoryInterface;
|
||||
use Drupal\Core\Extension\ModuleHandlerInterface;
|
||||
use Drupal\Core\Language\LanguageManagerInterface;
|
||||
use Drupal\migrate\Plugin\Exception\BadPluginDefinitionException;
|
||||
use Drupal\migrate\Plugin\MigrateSourcePluginManager;
|
||||
use Drupal\migrate\Plugin\MigrationPluginManager as BaseMigrationPluginManager;
|
||||
|
||||
/**
|
||||
* Manages migration plugins.
|
||||
*
|
||||
* Analyzes migration definitions to ensure that the source plugin of any
|
||||
* migration tagged with particular tags ('Drupal 6' or 'Drupal 7' by default)
|
||||
* defines a source_module property in its plugin annotation. This is done in
|
||||
* order to support the Migrate Drupal UI, which needs to know which modules
|
||||
* "own" the data being migrated into Drupal 8, on both the source and
|
||||
* destination sides.
|
||||
*
|
||||
* @todo Enforce the destination_module property too, in
|
||||
* https://www.drupal.org/project/drupal/issues/2923810.
|
||||
*/
|
||||
class MigrationPluginManager extends BaseMigrationPluginManager {
|
||||
|
||||
/**
|
||||
* The Migrate source plugin manager service.
|
||||
*
|
||||
* @var \Drupal\migrate\Plugin\MigrateSourcePluginManager
|
||||
*/
|
||||
protected $sourceManager;
|
||||
|
||||
/**
|
||||
* The config factory service.
|
||||
*
|
||||
* @var \Drupal\Core\Config\ConfigFactoryInterface
|
||||
*/
|
||||
protected $configFactory;
|
||||
|
||||
/**
|
||||
* The migration tags which will trigger source_module enforcement.
|
||||
*
|
||||
* @var string[]
|
||||
*/
|
||||
protected $enforcedSourceModuleTags;
|
||||
|
||||
/**
|
||||
* MigrationPluginManager constructor.
|
||||
*
|
||||
* @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
|
||||
* The module handler service.
|
||||
* @param \Drupal\Core\Cache\CacheBackendInterface $cache_backend
|
||||
* The cache backend.
|
||||
* @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
|
||||
* The language manager service.
|
||||
* @param \Drupal\migrate\Plugin\MigrateSourcePluginManager $source_manager
|
||||
* The Migrate source plugin manager service.
|
||||
* @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
|
||||
* The config factory service.
|
||||
*/
|
||||
public function __construct(ModuleHandlerInterface $module_handler, CacheBackendInterface $cache_backend, LanguageManagerInterface $language_manager, MigrateSourcePluginManager $source_manager, ConfigFactoryInterface $config_factory) {
|
||||
parent::__construct($module_handler, $cache_backend, $language_manager);
|
||||
$this->sourceManager = $source_manager;
|
||||
$this->configFactory = $config_factory;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the migration tags that trigger source_module enforcement.
|
||||
*
|
||||
* @return string[]
|
||||
*/
|
||||
protected function getEnforcedSourceModuleTags() {
|
||||
if ($this->enforcedSourceModuleTags === NULL) {
|
||||
$this->enforcedSourceModuleTags = $this->configFactory
|
||||
->get('migrate_drupal.settings')
|
||||
->get('enforce_source_module_tags') ?: [];
|
||||
}
|
||||
return $this->enforcedSourceModuleTags;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function processDefinition(&$definition, $plugin_id) {
|
||||
parent::processDefinition($definition, $plugin_id);
|
||||
|
||||
// If the migration has no tags, we don't need to enforce the source_module
|
||||
// annotation property.
|
||||
if (empty($definition['migration_tags'])) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if the migration has any of the tags that trigger source_module
|
||||
// enforcement.
|
||||
$applied_tags = array_intersect($this->getEnforcedSourceModuleTags(), $definition['migration_tags']);
|
||||
if ($applied_tags) {
|
||||
// Throw an exception if the source plugin definition does not define a
|
||||
// source_module.
|
||||
$source_id = $definition['source']['plugin'];
|
||||
$source_definition = $this->sourceManager->getDefinition($source_id);
|
||||
if (empty($source_definition['source_module'])) {
|
||||
throw new BadPluginDefinitionException($source_id, 'source_module');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -2,9 +2,7 @@
|
|||
|
||||
namespace Drupal\migrate_drupal\Plugin;
|
||||
|
||||
@trigger_error('MigrateCckFieldInterface is deprecated in Drupal 8.3.x and will
|
||||
be removed before Drupal 9.0.x. Use \Drupal\migrate_drupal\Annotation\MigrateField
|
||||
instead.', E_USER_DEPRECATED);
|
||||
@trigger_error('MigrateCckFieldInterface is deprecated in Drupal 8.3.x and will be removed before Drupal 9.0.x. Use \Drupal\migrate_drupal\Annotation\MigrateField instead.', E_USER_DEPRECATED);
|
||||
|
||||
use Drupal\migrate\Plugin\MigrationInterface;
|
||||
|
||||
|
@ -13,6 +11,8 @@ use Drupal\migrate\Plugin\MigrationInterface;
|
|||
*
|
||||
* @deprecated in Drupal 8.3.x, to be removed before Drupal 9.0.x. Use
|
||||
* \Drupal\migrate_drupal\Annotation\MigrateField instead.
|
||||
*
|
||||
* @see https://www.drupal.org/node/2751897
|
||||
*/
|
||||
interface MigrateCckFieldInterface extends MigrateFieldInterface {
|
||||
|
||||
|
|
|
@ -2,9 +2,7 @@
|
|||
|
||||
namespace Drupal\migrate_drupal\Plugin;
|
||||
|
||||
@trigger_error('MigrateCckFieldPluginManager is deprecated in Drupal 8.3.x and will
|
||||
be removed before Drupal 9.0.x. Use \Drupal\migrate_drupal\Annotation\MigrateFieldPluginManager
|
||||
instead.', E_USER_DEPRECATED);
|
||||
@trigger_error('MigrateCckFieldPluginManager is deprecated in Drupal 8.3.x and will be removed before Drupal 9.0.x. Use \Drupal\migrate_drupal\Annotation\MigrateFieldPluginManager instead.', E_USER_DEPRECATED);
|
||||
|
||||
/**
|
||||
* Deprecated: Plugin manager for migrate field plugins.
|
||||
|
@ -12,6 +10,8 @@ instead.', E_USER_DEPRECATED);
|
|||
* @deprecated in Drupal 8.3.x, to be removed before Drupal 9.0.x. Use
|
||||
* \Drupal\migrate_drupal\Plugin\MigrateFieldPluginManager instead.
|
||||
*
|
||||
* @see https://www.drupal.org/node/2751897
|
||||
*
|
||||
* @ingroup migration
|
||||
*/
|
||||
class MigrateCckFieldPluginManager extends MigrateFieldPluginManager implements MigrateCckFieldPluginManagerInterface { }
|
||||
class MigrateCckFieldPluginManager extends MigrateFieldPluginManager implements MigrateCckFieldPluginManagerInterface {}
|
||||
|
|
|
@ -2,14 +2,14 @@
|
|||
|
||||
namespace Drupal\migrate_drupal\Plugin;
|
||||
|
||||
@trigger_error('MigrateCckFieldPluginManagerInterface is deprecated in Drupal 8.3.x
|
||||
and will be removed before Drupal 9.0.x. Use \Drupal\migrate_drupal\Annotation\MigrateFieldPluginManagerInterface
|
||||
instead.', E_USER_DEPRECATED);
|
||||
@trigger_error('MigrateCckFieldPluginManagerInterface is deprecated in Drupal 8.3.x and will be removed before Drupal 9.0.x. Use \Drupal\migrate_drupal\Annotation\MigrateFieldPluginManagerInterface instead.', E_USER_DEPRECATED);
|
||||
|
||||
/**
|
||||
* Provides an interface for cck field plugin manager.
|
||||
*
|
||||
* @deprecated in Drupal 8.3.x, to be removed before Drupal 9.0.x. Use
|
||||
* \Drupal\migrate_drupal\Plugin\MigrateFieldPluginManagerInterface instead.
|
||||
*
|
||||
* @see https://www.drupal.org/node/2751897
|
||||
*/
|
||||
interface MigrateCckFieldPluginManagerInterface extends MigrateFieldPluginManagerInterface { }
|
||||
interface MigrateCckFieldPluginManagerInterface extends MigrateFieldPluginManagerInterface {}
|
||||
|
|
|
@ -17,7 +17,7 @@ interface MigrateFieldInterface extends PluginInspectionInterface {
|
|||
* @param \Drupal\migrate\Plugin\MigrationInterface $migration
|
||||
* The migration entity.
|
||||
*/
|
||||
public function processField(MigrationInterface $migration);
|
||||
public function alterFieldMigration(MigrationInterface $migration);
|
||||
|
||||
/**
|
||||
* Apply any custom processing to the field instance migration.
|
||||
|
@ -25,7 +25,7 @@ interface MigrateFieldInterface extends PluginInspectionInterface {
|
|||
* @param \Drupal\migrate\Plugin\MigrationInterface $migration
|
||||
* The migration entity.
|
||||
*/
|
||||
public function processFieldInstance(MigrationInterface $migration);
|
||||
public function alterFieldInstanceMigration(MigrationInterface $migration);
|
||||
|
||||
/**
|
||||
* Apply any custom processing to the field widget migration.
|
||||
|
@ -33,7 +33,7 @@ interface MigrateFieldInterface extends PluginInspectionInterface {
|
|||
* @param \Drupal\migrate\Plugin\MigrationInterface $migration
|
||||
* The migration entity.
|
||||
*/
|
||||
public function processFieldWidget(MigrationInterface $migration);
|
||||
public function alterFieldWidgetMigration(MigrationInterface $migration);
|
||||
|
||||
/**
|
||||
* Apply any custom processing to the field formatter migration.
|
||||
|
@ -41,18 +41,40 @@ interface MigrateFieldInterface extends PluginInspectionInterface {
|
|||
* @param \Drupal\migrate\Plugin\MigrationInterface $migration
|
||||
* The migration entity.
|
||||
*/
|
||||
public function processFieldFormatter(MigrationInterface $migration);
|
||||
public function alterFieldFormatterMigration(MigrationInterface $migration);
|
||||
|
||||
/**
|
||||
* Get the field formatter type from the source.
|
||||
*
|
||||
* @param \Drupal\migrate\Row $row
|
||||
* The field being migrated.
|
||||
*
|
||||
* @return string
|
||||
* The field formatter type.
|
||||
*/
|
||||
public function getFieldFormatterType(Row $row);
|
||||
|
||||
/**
|
||||
* Get a map between D6 formatters and D8 formatters for this field type.
|
||||
*
|
||||
* This is used by static::processFieldFormatter() in the base class.
|
||||
* This is used by static::alterFieldFormatterMigration() in the base class.
|
||||
*
|
||||
* @return array
|
||||
* The keys are D6 formatters and the values are D8 formatters.
|
||||
*/
|
||||
public function getFieldFormatterMap();
|
||||
|
||||
/**
|
||||
* Get the field widget type from the source.
|
||||
*
|
||||
* @param \Drupal\migrate\Row $row
|
||||
* The field being migrated.
|
||||
*
|
||||
* @return string
|
||||
* The field widget type.
|
||||
*/
|
||||
public function getFieldWidgetType(Row $row);
|
||||
|
||||
/**
|
||||
* Get a map between D6 and D8 widgets for this field type.
|
||||
*
|
||||
|
@ -71,7 +93,7 @@ interface MigrateFieldInterface extends PluginInspectionInterface {
|
|||
* @param array $data
|
||||
* The array of field data from FieldValues::fieldData().
|
||||
*/
|
||||
public function processFieldValues(MigrationInterface $migration, $field_name, $data);
|
||||
public function defineValueProcessPipeline(MigrationInterface $migration, $field_name, $data);
|
||||
|
||||
/**
|
||||
* Computes the destination type of a migrated field.
|
||||
|
|
|
@ -3,11 +3,12 @@
|
|||
namespace Drupal\migrate_drupal\Plugin;
|
||||
|
||||
use Drupal\Component\Plugin\Exception\PluginNotFoundException;
|
||||
use Drupal\migrate\Plugin\Exception\BadPluginDefinitionException;
|
||||
use Drupal\migrate\Plugin\MigratePluginManager;
|
||||
use Drupal\migrate\Plugin\MigrationInterface;
|
||||
|
||||
/**
|
||||
* Plugin manager for migrate cckfield plugins.
|
||||
* Plugin manager for migrate field plugins.
|
||||
*
|
||||
* @see \Drupal\migrate_drupal\Plugin\MigrateFieldInterface
|
||||
* @see \Drupal\migrate\Annotation\MigrateField
|
||||
|
@ -53,4 +54,17 @@ class MigrateFieldPluginManager extends MigratePluginManager implements MigrateF
|
|||
throw new PluginNotFoundException($field_type);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function processDefinition(&$definition, $plugin_id) {
|
||||
parent::processDefinition($definition, $plugin_id);
|
||||
|
||||
foreach (['core', 'source_module', 'destination_module'] as $required_property) {
|
||||
if (empty($definition[$required_property])) {
|
||||
throw new BadPluginDefinitionException($plugin_id, $required_property);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\migrate_drupal\Plugin;
|
||||
|
||||
/**
|
||||
* Interface for migrations with follow-up migrations.
|
||||
*
|
||||
* Some migrations need to be derived and executed after other migrations have
|
||||
* been successfully executed. For example, a migration might need to be derived
|
||||
* based on previously migrated data. For such a case, the migration dependency
|
||||
* system is not enough since all migrations would still be derived before any
|
||||
* one of them has been executed.
|
||||
*
|
||||
* Those "follow-up" migrations need to be tagged with the "Follow-up migration"
|
||||
* tag (or any tag in the "follow_up_migration_tags" configuration) and thus
|
||||
* they won't be derived with the other migrations.
|
||||
*
|
||||
* To get those follow-up migrations derived at the right time, the migrations
|
||||
* on which they depend must implement this interface and generate them in the
|
||||
* generateFollowUpMigrations() method.
|
||||
*
|
||||
* When the migrations implementing this interface have been successfully
|
||||
* executed, the follow-up migrations will then be derived having access to the
|
||||
* now migrated data.
|
||||
*/
|
||||
interface MigrationWithFollowUpInterface {
|
||||
|
||||
/**
|
||||
* Generates follow-up migrations.
|
||||
*
|
||||
* When the migration implementing this interface has been successfully
|
||||
* executed, this method will be used to generate the follow-up migrations
|
||||
* which depends on the now migrated data.
|
||||
*
|
||||
* @return \Drupal\migrate\Plugin\MigrationInterface[]
|
||||
* The follow-up migrations.
|
||||
*/
|
||||
public function generateFollowUpMigrations();
|
||||
|
||||
}
|
|
@ -2,15 +2,15 @@
|
|||
|
||||
namespace Drupal\migrate_drupal\Plugin\migrate;
|
||||
|
||||
@trigger_error('CckMigration is deprecated in Drupal 8.3.x and will be removed
|
||||
before Drupal 9.0.x. Use \Drupal\migrate_drupal\Plugin\migrate\FieldMigration
|
||||
instead.', E_USER_DEPRECATED);
|
||||
@trigger_error('CckMigration is deprecated in Drupal 8.3.x and will be removed before Drupal 9.0.x. Use \Drupal\migrate_drupal\Plugin\migrate\FieldMigration instead.', E_USER_DEPRECATED);
|
||||
|
||||
/**
|
||||
* Migration plugin class for migrations dealing with CCK field values.
|
||||
*
|
||||
* @deprecated in Drupal 8.3.x, to be removed before Drupal 9.0.x. Use
|
||||
* \Drupal\migrate_drupal\Plugin\migrate\FieldMigration instead.
|
||||
*
|
||||
* @see https://www.drupal.org/node/2751897
|
||||
*/
|
||||
class CckMigration extends FieldMigration {
|
||||
|
||||
|
|
|
@ -0,0 +1,193 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\migrate_drupal\Plugin\migrate;
|
||||
|
||||
use Drupal\Component\Plugin\Derivative\DeriverBase;
|
||||
use Drupal\Component\Plugin\PluginBase;
|
||||
use Drupal\Core\Entity\EntityFieldManagerInterface;
|
||||
use Drupal\Core\Entity\EntityTypeManagerInterface;
|
||||
use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
|
||||
use Drupal\Core\StringTranslation\StringTranslationTrait;
|
||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
|
||||
/**
|
||||
* Deriver for entity reference field translations.
|
||||
*
|
||||
* A migration will be created for every bundle with at least one entity
|
||||
* reference field that is configured to point to one of the supported target
|
||||
* entity types. The migrations will update the entity reference fields with
|
||||
* values found in the mapping tables of the migrations associated with the
|
||||
* target types.
|
||||
*
|
||||
* Example:
|
||||
*
|
||||
* @code
|
||||
* id: d7_entity_reference_translation
|
||||
* label: Entity reference translations
|
||||
* migration_tags:
|
||||
* - Drupal 7
|
||||
* - Follow-up migration
|
||||
* deriver: Drupal\migrate_drupal\Plugin\migrate\EntityReferenceTranslationDeriver
|
||||
* target_types:
|
||||
* node:
|
||||
* - d7_node_translation
|
||||
* source:
|
||||
* plugin: empty
|
||||
* key: default
|
||||
* target: default
|
||||
* process: []
|
||||
* destination:
|
||||
* plugin: null
|
||||
* @endcode
|
||||
*
|
||||
* In this example, the only supported target type is 'node' and the associated
|
||||
* migration for the mapping table lookup is 'd7_node_translation'.
|
||||
*/
|
||||
class EntityReferenceTranslationDeriver extends DeriverBase implements ContainerDeriverInterface {
|
||||
|
||||
use StringTranslationTrait;
|
||||
|
||||
/**
|
||||
* The entity field manager.
|
||||
*
|
||||
* @var \Drupal\Core\Entity\EntityFieldManagerInterface
|
||||
*/
|
||||
protected $entityFieldManager;
|
||||
|
||||
/**
|
||||
* The entity type manager.
|
||||
*
|
||||
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
|
||||
*/
|
||||
protected $entityTypeManager;
|
||||
|
||||
/**
|
||||
* EntityReferenceTranslationDeriver constructor.
|
||||
*
|
||||
* @param string $base_plugin_id
|
||||
* The base plugin ID.
|
||||
* @param \Drupal\core\Entity\EntityFieldManagerInterface $entity_field_manager
|
||||
* The entity field manager.
|
||||
* @param \Drupal\core\Entity\EntityTypeManagerInterface $entity_type_manager
|
||||
* The entity type manager.
|
||||
*/
|
||||
public function __construct($base_plugin_id, EntityFieldManagerInterface $entity_field_manager, EntityTypeManagerInterface $entity_type_manager) {
|
||||
$this->entityFieldManager = $entity_field_manager;
|
||||
$this->entityTypeManager = $entity_type_manager;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static function create(ContainerInterface $container, $base_plugin_id) {
|
||||
return new static(
|
||||
$base_plugin_id,
|
||||
$container->get('entity_field.manager'),
|
||||
$container->get('entity_type.manager')
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getDerivativeDefinitions($base_plugin_definition) {
|
||||
// Get all entity reference fields.
|
||||
$field_map = $this->entityFieldManager->getFieldMapByFieldType('entity_reference');
|
||||
|
||||
foreach ($field_map as $entity_type => $fields) {
|
||||
foreach ($fields as $field_name => $field) {
|
||||
foreach ($field['bundles'] as $bundle) {
|
||||
$field_definitions = $this->entityFieldManager->getFieldDefinitions($entity_type, $bundle);
|
||||
$target_type = $field_definitions[$field_name]->getSetting('target_type');
|
||||
|
||||
// If the field's target type is not supported, skip it.
|
||||
if (!array_key_exists($target_type, $base_plugin_definition['target_types'])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Key derivatives by entity types and bundles.
|
||||
$derivative_key = $entity_type . '__' . $bundle;
|
||||
|
||||
$derivative = $base_plugin_definition;
|
||||
$entity_type_definition = $this->entityTypeManager->getDefinition($entity_type);
|
||||
|
||||
// Set the migration label.
|
||||
$derivative['label'] = $this->t('@label (@derivative)', [
|
||||
'@label' => $base_plugin_definition['label'],
|
||||
'@derivative' => $derivative_key,
|
||||
]);
|
||||
|
||||
// Set the source plugin.
|
||||
$derivative['source']['plugin'] = 'content_entity' . PluginBase::DERIVATIVE_SEPARATOR . $entity_type;
|
||||
if ($entity_type_definition->hasKey('bundle')) {
|
||||
$derivative['source']['bundle'] = $bundle;
|
||||
}
|
||||
|
||||
// Set the process pipeline.
|
||||
$id_key = $entity_type_definition->getKey('id');
|
||||
$derivative['process'][$id_key] = $id_key;
|
||||
if ($entity_type_definition->isRevisionable()) {
|
||||
$revision_key = $entity_type_definition->getKey('revision');
|
||||
$derivative['process'][$revision_key] = $revision_key;
|
||||
}
|
||||
if ($entity_type_definition->isTranslatable()) {
|
||||
$langcode_key = $entity_type_definition->getKey('langcode');
|
||||
$derivative['process'][$langcode_key] = $langcode_key;
|
||||
}
|
||||
|
||||
// Set the destination plugin.
|
||||
$derivative['destination']['plugin'] = 'entity' . PluginBase::DERIVATIVE_SEPARATOR . $entity_type;
|
||||
if ($entity_type_definition->hasKey('bundle')) {
|
||||
$derivative['destination']['default_bundle'] = $bundle;
|
||||
}
|
||||
if ($entity_type_definition->isTranslatable()) {
|
||||
$derivative['destination']['translations'] = TRUE;
|
||||
}
|
||||
|
||||
// Allow overwriting the entity reference field so we can update its
|
||||
// values with the ones found in the mapping table.
|
||||
$derivative['destination']['overwrite_properties'][$field_name] = $field_name;
|
||||
|
||||
// Add the entity reference field to the process pipeline.
|
||||
$derivative['process'][$field_name] = [
|
||||
'plugin' => 'sub_process',
|
||||
'source' => $field_name,
|
||||
'process' => [
|
||||
'target_id' => [
|
||||
[
|
||||
'plugin' => 'migration_lookup',
|
||||
'source' => 'target_id',
|
||||
'migration' => $base_plugin_definition['target_types'][$target_type],
|
||||
'no_stub' => TRUE,
|
||||
],
|
||||
[
|
||||
'plugin' => 'skip_on_empty',
|
||||
'method' => 'row',
|
||||
],
|
||||
[
|
||||
'plugin' => 'extract',
|
||||
'index' => [0],
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
|
||||
if (!isset($this->derivatives[$derivative_key])) {
|
||||
// If this is a new derivative, add it to the returned derivatives.
|
||||
$this->derivatives[$derivative_key] = $derivative;
|
||||
}
|
||||
else {
|
||||
// If this is an existing derivative, it means this bundle has more
|
||||
// than one entity reference field. In that case, we only want to add
|
||||
// the field to the process pipeline and make it overwritable.
|
||||
$this->derivatives[$derivative_key]['process'] += $derivative['process'];
|
||||
$this->derivatives[$derivative_key]['destination']['overwrite_properties'] += $derivative['destination']['overwrite_properties'];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $this->derivatives;
|
||||
}
|
||||
|
||||
}
|
|
@ -140,25 +140,25 @@ class FieldMigration extends Migration implements ContainerFactoryPluginInterfac
|
|||
$field_type = $row->getSourceProperty('type');
|
||||
|
||||
try {
|
||||
$plugin_id = $this->cckPluginManager->getPluginIdFromFieldType($field_type, [], $this);
|
||||
$Manager = $this->cckPluginManager;
|
||||
$plugin_id = $this->fieldPluginManager->getPluginIdFromFieldType($field_type, [], $this);
|
||||
$manager = $this->fieldPluginManager;
|
||||
}
|
||||
catch (PluginNotFoundException $ex) {
|
||||
try {
|
||||
$plugin_id = $this->fieldPluginManager->getPluginIdFromFieldType($field_type, [], $this);
|
||||
$Manager = $this->fieldPluginManager;
|
||||
$plugin_id = $this->cckPluginManager->getPluginIdFromFieldType($field_type, [], $this);
|
||||
$manager = $this->cckPluginManager;
|
||||
}
|
||||
catch (PluginNotFoundException $ex) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (!isset($this->processedFieldTypes[$field_type]) && $Manager->hasDefinition($plugin_id)) {
|
||||
if (!isset($this->processedFieldTypes[$field_type]) && $manager->hasDefinition($plugin_id)) {
|
||||
$this->processedFieldTypes[$field_type] = TRUE;
|
||||
// Allow the field plugin to alter the migration as necessary so that
|
||||
// it knows how to handle fields of this type.
|
||||
if (!isset($this->fieldPluginCache[$field_type])) {
|
||||
$this->fieldPluginCache[$field_type] = $Manager->createInstance($plugin_id, [], $this);
|
||||
$this->fieldPluginCache[$field_type] = $manager->createInstance($plugin_id, [], $this);
|
||||
}
|
||||
}
|
||||
$method = $this->pluginDefinition[static::PLUGIN_METHOD];
|
||||
|
|
|
@ -2,34 +2,28 @@
|
|||
|
||||
namespace Drupal\migrate_drupal\Plugin\migrate\cckfield;
|
||||
|
||||
@trigger_error('CckFieldPluginBase is deprecated in Drupal 8.3.x and will be
|
||||
be removed before Drupal 9.0.x. Use \Drupal\migrate_drupal\Plugin\migrate\field\FieldPluginBase
|
||||
instead.', E_USER_DEPRECATED);
|
||||
@trigger_error('CckFieldPluginBase is deprecated in Drupal 8.3.x and will be be removed before Drupal 9.0.x. Use \Drupal\migrate_drupal\Plugin\migrate\field\FieldPluginBase instead.', E_USER_DEPRECATED);
|
||||
|
||||
use Drupal\migrate\Plugin\MigrationInterface;
|
||||
use Drupal\migrate_drupal\Plugin\migrate\field\FieldPluginBase;
|
||||
use Drupal\migrate_drupal\Plugin\MigrateCckFieldInterface;
|
||||
|
||||
/**
|
||||
* The base class for all field plugins.
|
||||
*
|
||||
* @deprecated in Drupal 8.3.x, to be removed before Drupal 9.0.x. Use
|
||||
* @deprecated in Drupal 8.4.x, to be removed before Drupal 9.0.x. Use
|
||||
* \Drupal\migrate_drupal\Plugin\migrate\field\FieldPluginBase instead.
|
||||
*
|
||||
* @see https://www.drupal.org/node/2751897
|
||||
*
|
||||
* @ingroup migration
|
||||
*/
|
||||
abstract class CckFieldPluginBase extends FieldPluginBase {
|
||||
abstract class CckFieldPluginBase extends FieldPluginBase implements MigrateCckFieldInterface {
|
||||
|
||||
/**
|
||||
* Apply any custom processing to the field bundle migrations.
|
||||
*
|
||||
* @param \Drupal\migrate\Plugin\MigrationInterface $migration
|
||||
* The migration entity.
|
||||
* @param string $field_name
|
||||
* The field name we're processing the value for.
|
||||
* @param array $data
|
||||
* The array of field data from FieldValues::fieldData().
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function processFieldValues(MigrationInterface $migration, $field_name, $data) {
|
||||
public function defineValueProcessPipeline(MigrationInterface $migration, $field_name, $data) {
|
||||
// Provide a bridge to the old method declared on the interface and now an
|
||||
// abstract method in this class.
|
||||
return $this->processCckFieldValues($migration, $field_name, $data);
|
||||
|
|
|
@ -43,16 +43,16 @@ class EntityFieldStorageConfig extends BaseEntityFieldStorageConfig {
|
|||
* The plugin implementation definition.
|
||||
* @param \Drupal\migrate\Plugin\MigrationInterface $migration
|
||||
* The migration.
|
||||
* @param EntityStorageInterface $storage
|
||||
* @param \Drupal\Core\Entity\EntityStorageInterface $storage
|
||||
* The storage for this entity type.
|
||||
* @param array $bundles
|
||||
* The list of bundles this entity type has.
|
||||
* @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
|
||||
* The language manager.
|
||||
* @param \Drupal\Core\Field\FieldTypePluginManagerInterface $field_type_plugin_manager
|
||||
* The field type plugin manager.
|
||||
* @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
|
||||
* The configuration factory.
|
||||
* @param \Drupal\Core\Field\FieldTypePluginManagerInterface $field_type_plugin_manager
|
||||
* The field type plugin manager.
|
||||
*/
|
||||
public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, EntityStorageInterface $storage, array $bundles, LanguageManagerInterface $language_manager, ConfigFactoryInterface $config_factory, FieldTypePluginManagerInterface $field_type_plugin_manager) {
|
||||
parent::__construct($configuration, $plugin_id, $plugin_definition, $migration, $storage, $bundles, $language_manager, $config_factory, $field_type_plugin_manager);
|
||||
|
|
|
@ -20,24 +20,66 @@ use Drupal\migrate_drupal\Plugin\MigrateFieldInterface;
|
|||
abstract class FieldPluginBase extends PluginBase implements MigrateFieldInterface {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
* Alters the migration for field definitions.
|
||||
*
|
||||
* @deprecated in Drupal 8.6.0, to be removed before Drupal 9.0.0. Use
|
||||
* alterFieldMigration() instead.
|
||||
*
|
||||
* @see https://www.drupal.org/node/2944598
|
||||
* @see ::alterFieldMigration()
|
||||
*/
|
||||
public function processField(MigrationInterface $migration) {
|
||||
@trigger_error('Deprecated in Drupal 8.6.0, to be removed before Drupal 9.0.0. Use alterFieldMigration() instead. See https://www.drupal.org/node/2944598.', E_USER_DEPRECATED);
|
||||
$this->alterFieldMigration($migration);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function alterFieldMigration(MigrationInterface $migration) {
|
||||
$process[0]['map'][$this->pluginId][$this->pluginId] = $this->pluginId;
|
||||
$migration->mergeProcessOfProperty('type', $process);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
* Alert field instance migration.
|
||||
*
|
||||
* @deprecated in Drupal 8.6.0, to be removed before Drupal 9.0.0. Use
|
||||
* alterFieldInstanceMigration() instead.
|
||||
*
|
||||
* @see https://www.drupal.org/node/2944598
|
||||
* @see ::alterFieldInstanceMigration()
|
||||
*/
|
||||
public function processFieldInstance(MigrationInterface $migration) {
|
||||
// Nothing to do by default with field instances.
|
||||
@trigger_error('Deprecated in Drupal 8.6.0, to be removed before Drupal 9.0.0. Use alterFieldInstanceMigration() instead. See https://www.drupal.org/node/2944598.', E_USER_DEPRECATED);
|
||||
$this->alterFieldInstanceMigration($migration);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function alterFieldInstanceMigration(MigrationInterface $migration) {
|
||||
// Nothing to do by default with field instances.
|
||||
}
|
||||
|
||||
/**
|
||||
* Alter field widget migration.
|
||||
*
|
||||
* @deprecated in Drupal 8.6.0, to be removed before Drupal 9.0.0. Use
|
||||
* alterFieldWidgetMigration() instead.
|
||||
*
|
||||
* @see https://www.drupal.org/node/2944598
|
||||
* @see ::alterFieldWidgetMigration()
|
||||
*/
|
||||
public function processFieldWidget(MigrationInterface $migration) {
|
||||
@trigger_error('Deprecated in Drupal 8.6.0, to be removed before Drupal 9.0.0. Use alterFieldWidgetMigration() instead. See https://www.drupal.org/node/2944598.', E_USER_DEPRECATED);
|
||||
$this->alterFieldWidgetMigration($migration);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function alterFieldWidgetMigration(MigrationInterface $migration) {
|
||||
$process = [];
|
||||
foreach ($this->getFieldWidgetMap() as $source_widget => $destination_widget) {
|
||||
$process['type']['map'][$source_widget] = $destination_widget;
|
||||
|
@ -45,6 +87,27 @@ abstract class FieldPluginBase extends PluginBase implements MigrateFieldInterfa
|
|||
$migration->mergeProcessOfProperty('options/type', $process);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getFieldFormatterType(Row $row) {
|
||||
return $row->getSourceProperty('formatter/type');
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getFieldFormatterMap() {
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getFieldWidgetType(Row $row) {
|
||||
return $row->getSourceProperty('widget/type');
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
|
@ -56,16 +119,59 @@ abstract class FieldPluginBase extends PluginBase implements MigrateFieldInterfa
|
|||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
* Alter field formatter migration.
|
||||
*
|
||||
* @deprecated in Drupal 8.6.0, to be removed before Drupal 9.0.0. Use
|
||||
* alterFieldFormatterMigration() instead.
|
||||
*
|
||||
* @see https://www.drupal.org/node/2944598
|
||||
* @see ::processFieldFormatter()
|
||||
*/
|
||||
public function processFieldFormatter(MigrationInterface $migration) {
|
||||
@trigger_error('Deprecated in Drupal 8.6.0, to be removed before Drupal 9.0.0. Use alterFieldFormatterMigration() instead. See https://www.drupal.org/node/2944598.', E_USER_DEPRECATED);
|
||||
$this->alterFieldFormatterMigration($migration);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function alterFieldFormatterMigration(MigrationInterface $migration) {
|
||||
$process = [];
|
||||
// Some migrate field plugin IDs are prefixed with 'd6_' or 'd7_'. Since the
|
||||
// plugin ID is used in the static map as the module name, we have to remove
|
||||
// this prefix from the plugin ID.
|
||||
$plugin_id = preg_replace('/d[67]_/', '', $this->pluginId);
|
||||
foreach ($this->getFieldFormatterMap() as $source_format => $destination_format) {
|
||||
$process[0]['map'][$this->pluginId][$source_format] = $destination_format;
|
||||
$process[0]['map'][$plugin_id][$source_format] = $destination_format;
|
||||
}
|
||||
$migration->mergeProcessOfProperty('options/type', $process);
|
||||
}
|
||||
|
||||
/**
|
||||
* Defines the process pipeline for field values.
|
||||
*
|
||||
* @deprecated in Drupal 8.6.0, to be removed before Drupal 9.0.0. Use
|
||||
* defineValueProcessPipeline() instead.
|
||||
*
|
||||
* @see https://www.drupal.org/node/2944598
|
||||
* @see ::defineValueProcessPipeline()
|
||||
*/
|
||||
public function processFieldValues(MigrationInterface $migration, $field_name, $data) {
|
||||
@trigger_error('Deprecated in Drupal 8.6.0, to be removed before Drupal 9.0.0. Use defineValueProcessPipeline() instead. See https://www.drupal.org/node/2944598.', E_USER_DEPRECATED);
|
||||
return $this->defineValueProcessPipeline($migration, $field_name, $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function defineValueProcessPipeline(MigrationInterface $migration, $field_name, $data) {
|
||||
$process = [
|
||||
'plugin' => 'get',
|
||||
'source' => $field_name,
|
||||
];
|
||||
$migration->mergeProcessOfProperty($field_name, $process);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
|
|
|
@ -11,6 +11,8 @@ use Drupal\migrate\Plugin\MigrationInterface;
|
|||
* type_map = {
|
||||
* "nodereference" = "entity_reference",
|
||||
* },
|
||||
* source_module = "nodereference",
|
||||
* destination_module = "core",
|
||||
* )
|
||||
*/
|
||||
class NodeReference extends FieldPluginBase {
|
||||
|
@ -18,21 +20,13 @@ class NodeReference extends FieldPluginBase {
|
|||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getFieldFormatterMap() {
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function processFieldValues(MigrationInterface $migration, $field_name, $data) {
|
||||
public function defineValueProcessPipeline(MigrationInterface $migration, $field_name, $data) {
|
||||
$process = [
|
||||
'plugin' => 'iterator',
|
||||
'plugin' => 'sub_process',
|
||||
'source' => $field_name,
|
||||
'process' => [
|
||||
'target_id' => [
|
||||
'plugin' => 'migration_lookup',
|
||||
'migration' => 'd6_node',
|
||||
'plugin' => 'get',
|
||||
'source' => 'nid',
|
||||
],
|
||||
],
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\migrate_drupal\Plugin\migrate\field;
|
||||
|
||||
use Drupal\migrate\Plugin\MigrationInterface;
|
||||
|
||||
/**
|
||||
* @MigrateField(
|
||||
* id = "userreference",
|
||||
* core = {6},
|
||||
* type_map = {
|
||||
* "userreference" = "entity_reference",
|
||||
* },
|
||||
* source_module = "userreference",
|
||||
* destination_module = "core",
|
||||
* )
|
||||
*/
|
||||
class UserReference extends FieldPluginBase {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function defineValueProcessPipeline(MigrationInterface $migration, $field_name, $data) {
|
||||
$process = [
|
||||
'plugin' => 'sub_process',
|
||||
'source' => $field_name,
|
||||
'process' => [
|
||||
'target_id' => [
|
||||
'plugin' => 'migration_lookup',
|
||||
'migration' => 'd6_user',
|
||||
'source' => 'uid',
|
||||
],
|
||||
],
|
||||
];
|
||||
$migration->setProcessOfProperty($field_name, $process);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,294 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\migrate_drupal\Plugin\migrate\source;
|
||||
|
||||
use Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException;
|
||||
use Drupal\Core\Entity\ContentEntityInterface;
|
||||
use Drupal\Core\Entity\ContentEntityTypeInterface;
|
||||
use Drupal\Core\Entity\EntityFieldManagerInterface;
|
||||
use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
|
||||
use Drupal\Core\Entity\EntityTypeManagerInterface;
|
||||
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
|
||||
use Drupal\migrate\Plugin\migrate\source\SourcePluginBase;
|
||||
use Drupal\migrate\Plugin\MigrationInterface;
|
||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
|
||||
/**
|
||||
* Source plugin to get content entities from the current version of Drupal.
|
||||
*
|
||||
* This plugin uses the Entity API to export entity data. If the source entity
|
||||
* type has custom field storage fields or computed fields, this class will need
|
||||
* to be extended and the new class will need to load/calculate the values for
|
||||
* those fields.
|
||||
*
|
||||
* Available configuration keys:
|
||||
* - entity_type: The entity type ID of the entities being exported. This is
|
||||
* calculated dynamically by the deriver so it is only needed if the deriver
|
||||
* is not utilized, i.e., a custom source plugin.
|
||||
* - bundle: (optional) If the entity type is bundleable, only return entities
|
||||
* of this bundle.
|
||||
* - include_translations: (optional) Indicates if the entity translations
|
||||
* should be included, defaults to TRUE.
|
||||
*
|
||||
* Examples:
|
||||
*
|
||||
* This will return all nodes, from every bundle and every translation. It does
|
||||
* not return all revisions, just the default one.
|
||||
* @code
|
||||
* source:
|
||||
* plugin: content_entity:node
|
||||
* @endcode
|
||||
*
|
||||
* This will only return nodes of type 'article' in their default language.
|
||||
* @code
|
||||
* source:
|
||||
* plugin: content_entity:node
|
||||
* bundle: article
|
||||
* include_translations: false
|
||||
* @endcode
|
||||
*
|
||||
* @MigrateSource(
|
||||
* id = "content_entity",
|
||||
* source_module = "migrate_drupal",
|
||||
* deriver = "\Drupal\migrate_drupal\Plugin\migrate\source\ContentEntityDeriver",
|
||||
* )
|
||||
*/
|
||||
class ContentEntity extends SourcePluginBase implements ContainerFactoryPluginInterface {
|
||||
|
||||
/**
|
||||
* The entity type manager.
|
||||
*
|
||||
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
|
||||
*/
|
||||
protected $entityTypeManager;
|
||||
|
||||
/**
|
||||
* The entity field manager.
|
||||
*
|
||||
* @var \Drupal\Core\Entity\EntityFieldManagerInterface
|
||||
*/
|
||||
protected $entityFieldManager;
|
||||
|
||||
/**
|
||||
* The entity type bundle info service.
|
||||
*
|
||||
* @var \Drupal\Core\Entity\EntityTypeBundleInfoInterface
|
||||
*/
|
||||
protected $entityTypeBundleInfo;
|
||||
|
||||
/**
|
||||
* The entity type definition.
|
||||
*
|
||||
* @var \Drupal\Core\Entity\EntityTypeInterface
|
||||
*/
|
||||
protected $entityType;
|
||||
|
||||
/**
|
||||
* The plugin's default configuration.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $defaultConfiguration = [
|
||||
'bundle' => NULL,
|
||||
'include_translations' => TRUE,
|
||||
];
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, EntityTypeManagerInterface $entity_type_manager, EntityFieldManagerInterface $entity_field_manager, EntityTypeBundleInfoInterface $entity_type_bundle_info) {
|
||||
if (empty($plugin_definition['entity_type'])) {
|
||||
throw new InvalidPluginDefinitionException($plugin_id, 'Missing required "entity_type" definition.');
|
||||
}
|
||||
$this->entityTypeManager = $entity_type_manager;
|
||||
$this->entityFieldManager = $entity_field_manager;
|
||||
$this->entityTypeBundleInfo = $entity_type_bundle_info;
|
||||
$this->entityType = $this->entityTypeManager->getDefinition($plugin_definition['entity_type']);
|
||||
if (!$this->entityType instanceof ContentEntityTypeInterface) {
|
||||
throw new InvalidPluginDefinitionException($plugin_id, sprintf('The entity type (%s) is not supported. The "content_entity" source plugin only supports content entities.', $plugin_definition['entity_type']));
|
||||
}
|
||||
if (!empty($configuration['bundle'])) {
|
||||
if (!$this->entityType->hasKey('bundle')) {
|
||||
throw new \InvalidArgumentException(sprintf('A bundle was provided but the entity type (%s) is not bundleable.', $plugin_definition['entity_type']));
|
||||
}
|
||||
$bundle_info = array_keys($this->entityTypeBundleInfo->getBundleInfo($this->entityType->id()));
|
||||
if (!in_array($configuration['bundle'], $bundle_info, TRUE)) {
|
||||
throw new \InvalidArgumentException(sprintf('The provided bundle (%s) is not valid for the (%s) entity type.', $configuration['bundle'], $plugin_definition['entity_type']));
|
||||
}
|
||||
}
|
||||
parent::__construct($configuration + $this->defaultConfiguration, $plugin_id, $plugin_definition, $migration);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@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('entity_type.manager'),
|
||||
$container->get('entity_field.manager'),
|
||||
$container->get('entity_type.bundle.info')
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function __toString() {
|
||||
return (string) $this->entityType->getPluralLabel();
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes the iterator with the source data.
|
||||
*
|
||||
* @return \Generator
|
||||
* A data generator for this source.
|
||||
*/
|
||||
protected function initializeIterator() {
|
||||
$ids = $this->query()->execute();
|
||||
return $this->yieldEntities($ids);
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads and yields entities, one at a time.
|
||||
*
|
||||
* @param array $ids
|
||||
* The entity IDs.
|
||||
*
|
||||
* @return \Generator
|
||||
* An iterable of the loaded entities.
|
||||
*/
|
||||
protected function yieldEntities(array $ids) {
|
||||
$storage = $this->entityTypeManager
|
||||
->getStorage($this->entityType->id());
|
||||
foreach ($ids as $id) {
|
||||
/** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
|
||||
$entity = $storage->load($id);
|
||||
yield $this->toArray($entity);
|
||||
if ($this->configuration['include_translations']) {
|
||||
foreach ($entity->getTranslationLanguages(FALSE) as $language) {
|
||||
yield $this->toArray($entity->getTranslation($language->getId()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts an entity to an array.
|
||||
*
|
||||
* Makes all IDs into flat values. All other values are returned as per
|
||||
* $entity->toArray(), which is a nested array.
|
||||
*
|
||||
* @param \Drupal\Core\Entity\ContentEntityInterface $entity
|
||||
* The entity to convert.
|
||||
*
|
||||
* @return array
|
||||
* The entity, represented as an array.
|
||||
*/
|
||||
protected function toArray(ContentEntityInterface $entity) {
|
||||
$return = $entity->toArray();
|
||||
// This is necessary because the IDs must be flat. They cannot be nested for
|
||||
// the ID map.
|
||||
foreach (array_keys($this->getIds()) as $id) {
|
||||
/** @var \Drupal\Core\TypedData\Plugin\DataType\ItemList $value */
|
||||
$value = $entity->get($id);
|
||||
// Force the IDs on top of the previous values.
|
||||
$return[$id] = $value->first()->getString();
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Query to retrieve the entities.
|
||||
*
|
||||
* @return \Drupal\Core\Entity\Query\QueryInterface
|
||||
* The query.
|
||||
*/
|
||||
public function query() {
|
||||
$query = $this->entityTypeManager
|
||||
->getStorage($this->entityType->id())
|
||||
->getQuery()
|
||||
->accessCheck(FALSE);
|
||||
if (!empty($this->configuration['bundle'])) {
|
||||
$query->condition($this->entityType->getKey('bundle'), $this->configuration['bundle']);
|
||||
}
|
||||
return $query;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function count($refresh = FALSE) {
|
||||
// If no translations are included, then a simple query is possible.
|
||||
if (!$this->configuration['include_translations']) {
|
||||
return parent::count($refresh);
|
||||
}
|
||||
// @TODO: Determine a better way to retrieve a valid count for translations.
|
||||
// https://www.drupal.org/project/drupal/issues/2937166
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function doCount() {
|
||||
return $this->query()->count()->execute();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function fields() {
|
||||
// Retrieving fields from a non-fieldable content entity will throw a
|
||||
// LogicException. Return an empty list of fields instead.
|
||||
if (!$this->entityType->entityClassImplements('Drupal\Core\Entity\FieldableEntityInterface')) {
|
||||
return [];
|
||||
}
|
||||
$field_definitions = $this->entityFieldManager->getBaseFieldDefinitions($this->entityType->id());
|
||||
if (!empty($this->configuration['bundle'])) {
|
||||
$field_definitions += $this->entityFieldManager->getFieldDefinitions($this->entityType->id(), $this->configuration['bundle']);
|
||||
}
|
||||
$fields = array_map(function ($definition) {
|
||||
return (string) $definition->getLabel();
|
||||
}, $field_definitions);
|
||||
return $fields;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getIds() {
|
||||
$id_key = $this->entityType->getKey('id');
|
||||
$ids[$id_key] = $this->getDefinitionFromEntity($id_key);
|
||||
if ($this->entityType->isTranslatable()) {
|
||||
$langcode_key = $this->entityType->getKey('langcode');
|
||||
$ids[$langcode_key] = $this->getDefinitionFromEntity($langcode_key);
|
||||
}
|
||||
return $ids;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the field definition from a specific entity base field.
|
||||
*
|
||||
* @param string $key
|
||||
* The field ID key.
|
||||
*
|
||||
* @return array
|
||||
* An associative array with a structure that contains the field type, keyed
|
||||
* as 'type', together with field storage settings as they are returned by
|
||||
* FieldStorageDefinitionInterface::getSettings().
|
||||
*
|
||||
* @see \Drupal\migrate\Plugin\migrate\destination\EntityContentBase::getDefinitionFromEntity()
|
||||
*/
|
||||
protected function getDefinitionFromEntity($key) {
|
||||
/** @var \Drupal\Core\Field\FieldDefinitionInterface $field_definition */
|
||||
$field_definition = $this->entityFieldManager->getBaseFieldDefinitions($this->entityType->id())[$key];
|
||||
return [
|
||||
'type' => $field_definition->getType(),
|
||||
] + $field_definition->getSettings();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,60 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\migrate_drupal\Plugin\migrate\source;
|
||||
|
||||
use Drupal\Component\Plugin\Derivative\DeriverBase;
|
||||
use Drupal\Core\Entity\ContentEntityTypeInterface;
|
||||
use Drupal\Core\Entity\EntityTypeManagerInterface;
|
||||
use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
|
||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
|
||||
/**
|
||||
* Deriver for content entity source plugins.
|
||||
*/
|
||||
class ContentEntityDeriver extends DeriverBase implements ContainerDeriverInterface {
|
||||
|
||||
/**
|
||||
* The entity type manager.
|
||||
*
|
||||
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
|
||||
*/
|
||||
protected $entityTypeManager;
|
||||
|
||||
/**
|
||||
* Constructs a new ContentEntityDeriver.
|
||||
*
|
||||
* @param string $base_plugin_id
|
||||
* The base plugin ID.
|
||||
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager
|
||||
* The entity type manager.
|
||||
*/
|
||||
public function __construct($base_plugin_id, EntityTypeManagerInterface $entityTypeManager) {
|
||||
$this->entityTypeManager = $entityTypeManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static function create(ContainerInterface $container, $base_plugin_id) {
|
||||
return new static(
|
||||
$base_plugin_id,
|
||||
$container->get('entity_type.manager')
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getDerivativeDefinitions($base_plugin_definition) {
|
||||
$this->derivatives = [];
|
||||
foreach ($this->entityTypeManager->getDefinitions() as $id => $definition) {
|
||||
if ($definition instanceof ContentEntityTypeInterface) {
|
||||
$this->derivatives[$id] = $base_plugin_definition;
|
||||
// Provide entity_type so the source can be used apart from a deriver.
|
||||
$this->derivatives[$id]['entity_type'] = $id;
|
||||
}
|
||||
}
|
||||
return parent::getDerivativeDefinitions($base_plugin_definition);
|
||||
}
|
||||
|
||||
}
|
|
@ -13,10 +13,19 @@ use Drupal\migrate\Plugin\migrate\source\SqlBase;
|
|||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
|
||||
/**
|
||||
* A base source class for Drupal migrate sources.
|
||||
* A base class for source plugins using a Drupal database as a source.
|
||||
*
|
||||
* Mainly to let children retrieve information from the origin system in an
|
||||
* easier way.
|
||||
* Provides general purpose helper methods that are commonly needed
|
||||
* when writing source plugins that use a Drupal database as a source, for
|
||||
* example:
|
||||
* - Check if the given module exists in the source database.
|
||||
* - Read Drupal configuration variables from the source database.
|
||||
*
|
||||
* For a full list, refer to the methods of this class.
|
||||
*
|
||||
* For available configuration keys, refer to the parent classes:
|
||||
* @see \Drupal\migrate\Plugin\migrate\source\SqlBase
|
||||
* @see \Drupal\migrate\Plugin\migrate\source\SourcePluginBase
|
||||
*/
|
||||
abstract class DrupalSqlBase extends SqlBase implements ContainerFactoryPluginInterface, DependentPluginInterface {
|
||||
|
||||
|
@ -52,7 +61,7 @@ abstract class DrupalSqlBase extends SqlBase implements ContainerFactoryPluginIn
|
|||
}
|
||||
|
||||
/**
|
||||
* Retrieves all system data information from origin system.
|
||||
* Retrieves all system data information from the source Drupal database.
|
||||
*
|
||||
* @return array
|
||||
* List of system table information keyed by type and name.
|
||||
|
@ -94,14 +103,14 @@ abstract class DrupalSqlBase extends SqlBase implements ContainerFactoryPluginIn
|
|||
*/
|
||||
public function checkRequirements() {
|
||||
if ($this->pluginDefinition['requirements_met'] === TRUE) {
|
||||
if (isset($this->pluginDefinition['source_provider'])) {
|
||||
if ($this->moduleExists($this->pluginDefinition['source_provider'])) {
|
||||
if (isset($this->pluginDefinition['minimum_schema_version']) && !$this->getModuleSchemaVersion($this->pluginDefinition['source_provider']) < $this->pluginDefinition['minimum_schema_version']) {
|
||||
if (isset($this->pluginDefinition['source_module'])) {
|
||||
if ($this->moduleExists($this->pluginDefinition['source_module'])) {
|
||||
if (isset($this->pluginDefinition['minimum_schema_version']) && !$this->getModuleSchemaVersion($this->pluginDefinition['source_module']) < $this->pluginDefinition['minimum_schema_version']) {
|
||||
throw new RequirementsException('Required minimum schema version ' . $this->pluginDefinition['minimum_schema_version'], ['minimum_schema_version' => $this->pluginDefinition['minimum_schema_version']]);
|
||||
}
|
||||
}
|
||||
else {
|
||||
throw new RequirementsException('The module ' . $this->pluginDefinition['source_provider'] . ' is not enabled in the source site.', ['source_provider' => $this->pluginDefinition['source_provider']]);
|
||||
throw new RequirementsException('The module ' . $this->pluginDefinition['source_module'] . ' is not enabled in the source site.', ['source_module' => $this->pluginDefinition['source_module']]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -109,7 +118,7 @@ abstract class DrupalSqlBase extends SqlBase implements ContainerFactoryPluginIn
|
|||
}
|
||||
|
||||
/**
|
||||
* Get a module schema_version value in the source installation.
|
||||
* Retrieves a module schema_version from the source Drupal database.
|
||||
*
|
||||
* @param string $module
|
||||
* Name of module.
|
||||
|
@ -124,7 +133,7 @@ abstract class DrupalSqlBase extends SqlBase implements ContainerFactoryPluginIn
|
|||
}
|
||||
|
||||
/**
|
||||
* Check to see if a given module is enabled in the source installation.
|
||||
* Checks if a given module is enabled in the source Drupal database.
|
||||
*
|
||||
* @param string $module
|
||||
* Name of module to check.
|
||||
|
@ -138,7 +147,7 @@ abstract class DrupalSqlBase extends SqlBase implements ContainerFactoryPluginIn
|
|||
}
|
||||
|
||||
/**
|
||||
* Read a variable from a Drupal database.
|
||||
* Reads a variable from a source Drupal database.
|
||||
*
|
||||
* @param $name
|
||||
* Name of the variable.
|
||||
|
|
|
@ -10,12 +10,12 @@ use Drupal\migrate\Plugin\migrate\source\EmptySource as BaseEmptySource;
|
|||
use Drupal\Core\Entity\EntityManagerInterface;
|
||||
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
|
||||
|
||||
|
||||
/**
|
||||
* Source returning an empty row with Drupal specific config dependencies.
|
||||
*
|
||||
* @MigrateSource(
|
||||
* id = "md_empty"
|
||||
* id = "md_empty",
|
||||
* source_module = "system",
|
||||
* )
|
||||
*/
|
||||
class EmptySource extends BaseEmptySource implements ContainerFactoryPluginInterface, DependentPluginInterface {
|
||||
|
|
|
@ -13,7 +13,8 @@ use Drupal\migrate\Plugin\MigrationInterface;
|
|||
* example for any normal source class returning multiple rows.
|
||||
*
|
||||
* @MigrateSource(
|
||||
* id = "variable"
|
||||
* id = "variable",
|
||||
* source_module = "system",
|
||||
* )
|
||||
*/
|
||||
class Variable extends DrupalSqlBase {
|
||||
|
@ -58,7 +59,7 @@ class Variable extends DrupalSqlBase {
|
|||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function count() {
|
||||
public function count($refresh = FALSE) {
|
||||
return intval($this->query()->countQuery()->execute()->fetchField() > 0);
|
||||
}
|
||||
|
||||
|
|
|
@ -11,7 +11,8 @@ use Drupal\migrate\Row;
|
|||
* variable.
|
||||
*
|
||||
* @MigrateSource(
|
||||
* id = "variable_multirow"
|
||||
* id = "variable_multirow",
|
||||
* source_module = "system",
|
||||
* )
|
||||
*/
|
||||
class VariableMultiRow extends DrupalSqlBase {
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\migrate_drupal\Plugin\migrate\source\d6;
|
||||
|
||||
use Drupal\Core\Entity\EntityManagerInterface;
|
||||
use Drupal\Core\State\StateInterface;
|
||||
use Drupal\migrate\Plugin\MigrationInterface;
|
||||
|
||||
/**
|
||||
* Gets Drupal i18n_variable source from database.
|
||||
*
|
||||
* @deprecated in Drupal 8.7.x and will be removed in Drupal 9.0.x.
|
||||
* Use \Drupal\migrate_drupal\Plugin\migrate\source\d6\VariableTranslation.
|
||||
*
|
||||
* @see https://www.drupal.org/node/3006487
|
||||
*
|
||||
* @MigrateSource(
|
||||
* id = "variable_translation",
|
||||
* source_module = "system",
|
||||
* )
|
||||
*/
|
||||
class D6VariableTranslation extends VariableTranslation {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, StateInterface $state, EntityManagerInterface $entity_manager) {
|
||||
@trigger_error('The ' . __NAMESPACE__ . '\D6VariableTranslation is deprecated in Drupal 8.7.0 and will be removed before Drupal 9.0.0. Instead, use ' . __NAMESPACE__ . '\VariableTranslation. See https://www.drupal.org/node/3006487.', E_USER_DEPRECATED);
|
||||
parent::__construct($configuration, $plugin_id, $plugin_definition, $migration, $state, $entity_manager);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,101 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\migrate_drupal\Plugin\migrate\source\d6;
|
||||
|
||||
use Drupal\Core\Entity\EntityManagerInterface;
|
||||
use Drupal\Core\State\StateInterface;
|
||||
use Drupal\migrate\Plugin\MigrationInterface;
|
||||
use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
|
||||
|
||||
/**
|
||||
* Drupal i18n_variable source from database.
|
||||
*
|
||||
* @MigrateSource(
|
||||
* id = "d6_variable_translation",
|
||||
* source_module = "system",
|
||||
* )
|
||||
*/
|
||||
class VariableTranslation extends DrupalSqlBase {
|
||||
|
||||
/**
|
||||
* The variable names to fetch.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $variables;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, StateInterface $state, EntityManagerInterface $entity_manager) {
|
||||
parent::__construct($configuration, $plugin_id, $plugin_definition, $migration, $state, $entity_manager);
|
||||
$this->variables = $this->configuration['variables'];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function initializeIterator() {
|
||||
return new \ArrayIterator($this->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.
|
||||
* A key/value pair is added for the language code. Only those values are
|
||||
* returned that are actually in the database.
|
||||
*/
|
||||
protected function values() {
|
||||
$values = [];
|
||||
$result = $this->prepareQuery()->execute()->FetchAllAssoc('language');
|
||||
foreach ($result as $i18n_variable) {
|
||||
$values[]['language'] = $i18n_variable->language;
|
||||
}
|
||||
$result = $this->prepareQuery()->execute()->FetchAll();
|
||||
foreach ($result as $i18n_variable) {
|
||||
foreach ($values as $key => $value) {
|
||||
if ($values[$key]['language'] === $i18n_variable->language) {
|
||||
$values[$key][$i18n_variable->name] = unserialize($i18n_variable->value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $values;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function count($refresh = FALSE) {
|
||||
return $this->initializeIterator()->count();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function fields() {
|
||||
return array_combine($this->variables, $this->variables);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function query() {
|
||||
return $this->getDatabase()
|
||||
->select('i18n_variable', 'v')
|
||||
->fields('v')
|
||||
->condition('name', (array) $this->configuration['variables'], 'IN');
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getIds() {
|
||||
$ids['language']['type'] = 'string';
|
||||
return $ids;
|
||||
}
|
||||
|
||||
}
|
|
@ -2,99 +2,19 @@
|
|||
|
||||
namespace Drupal\migrate_drupal\Plugin\migrate\source\d6;
|
||||
|
||||
use Drupal\Core\Entity\EntityManagerInterface;
|
||||
use Drupal\Core\State\StateInterface;
|
||||
use Drupal\migrate\Plugin\MigrationInterface;
|
||||
use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
|
||||
@trigger_error('The ' . __NAMESPACE__ . '\i18nVariable is deprecated in Drupal 8.4.0 and will be removed before Drupal 9.0.0. Instead, use ' . __NAMESPACE__ . '\VariableTranslation', E_USER_DEPRECATED);
|
||||
|
||||
/**
|
||||
* Drupal i18n_variable source from database.
|
||||
*
|
||||
* @MigrateSource(
|
||||
* id = "i18n_variable"
|
||||
* id = "i18n_variable",
|
||||
* source_module = "system",
|
||||
* )
|
||||
*
|
||||
* @deprecated in Drupal 8.4.x and will be removed in Drupal 9.0.x. Use
|
||||
* \Drupal\migrate_drupal\Plugin\migrate\source\d6\VariableTranslation instead.
|
||||
*
|
||||
* @see https://www.drupal.org/node/2898649
|
||||
*/
|
||||
class i18nVariable extends DrupalSqlBase {
|
||||
|
||||
/**
|
||||
* The variable names to fetch.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $variables;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, StateInterface $state, EntityManagerInterface $entity_manager) {
|
||||
parent::__construct($configuration, $plugin_id, $plugin_definition, $migration, $state, $entity_manager);
|
||||
$this->variables = $this->configuration['variables'];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function initializeIterator() {
|
||||
return new \ArrayIterator($this->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.
|
||||
* A key/value pair is added for the language code. Only those values are
|
||||
* returned that are actually in the database.
|
||||
*/
|
||||
protected function values() {
|
||||
$values = [];
|
||||
$result = $this->prepareQuery()->execute()->FetchAllAssoc('language');
|
||||
foreach ($result as $i18n_variable) {
|
||||
$values[]['language'] = $i18n_variable->language;
|
||||
}
|
||||
$result = $this->prepareQuery()->execute()->FetchAll();
|
||||
foreach ($result as $i18n_variable) {
|
||||
foreach ($values as $key => $value) {
|
||||
if ($values[$key]['language'] === $i18n_variable->language) {
|
||||
$values[$key][$i18n_variable->name] = unserialize($i18n_variable->value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $values;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function count() {
|
||||
return $this->initializeIterator()->count();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function fields() {
|
||||
return array_combine($this->variables, $this->variables);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function query() {
|
||||
return $this->getDatabase()
|
||||
->select('i18n_variable', 'v')
|
||||
->fields('v')
|
||||
->condition('name', (array) $this->configuration['variables'], 'IN');
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getIds() {
|
||||
$ids['language']['type'] = 'string';
|
||||
return $ids;
|
||||
}
|
||||
|
||||
}
|
||||
class i18nVariable extends VariableTranslation {}
|
||||
|
|
|
@ -22,13 +22,18 @@ abstract class FieldableEntity extends DrupalSqlBase {
|
|||
* The field instances, keyed by field name.
|
||||
*/
|
||||
protected function getFields($entity_type, $bundle = NULL) {
|
||||
return $this->select('field_config_instance', 'fci')
|
||||
$query = $this->select('field_config_instance', 'fci')
|
||||
->fields('fci')
|
||||
->condition('entity_type', $entity_type)
|
||||
->condition('bundle', isset($bundle) ? $bundle : $entity_type)
|
||||
->condition('deleted', 0)
|
||||
->execute()
|
||||
->fetchAllAssoc('field_name');
|
||||
->condition('fci.entity_type', $entity_type)
|
||||
->condition('fci.bundle', isset($bundle) ? $bundle : $entity_type)
|
||||
->condition('fci.deleted', 0);
|
||||
|
||||
// Join the 'field_config' table and add the 'translatable' setting to the
|
||||
// query.
|
||||
$query->leftJoin('field_config', 'fc', 'fci.field_id = fc.id');
|
||||
$query->addField('fc', 'translatable');
|
||||
|
||||
return $query->execute()->fetchAllAssoc('field_name');
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -42,13 +47,13 @@ abstract class FieldableEntity extends DrupalSqlBase {
|
|||
* The entity ID.
|
||||
* @param int|null $revision_id
|
||||
* (optional) The entity revision ID.
|
||||
* @param string $language
|
||||
* (optional) The field language.
|
||||
*
|
||||
* @return array
|
||||
* The raw field values, keyed by delta.
|
||||
*
|
||||
* @todo Support multilingual field values.
|
||||
*/
|
||||
protected function getFieldValues($entity_type, $field, $entity_id, $revision_id = NULL) {
|
||||
protected function getFieldValues($entity_type, $field, $entity_id, $revision_id = NULL, $language = NULL) {
|
||||
$table = (isset($revision_id) ? 'field_revision_' : 'field_data_') . $field;
|
||||
$query = $this->select($table, 't')
|
||||
->fields('t')
|
||||
|
@ -58,6 +63,11 @@ abstract class FieldableEntity extends DrupalSqlBase {
|
|||
if (isset($revision_id)) {
|
||||
$query->condition('revision_id', $revision_id);
|
||||
}
|
||||
// Add 'language' as a query condition if it has been defined by Entity
|
||||
// Translation.
|
||||
if ($language) {
|
||||
$query->condition('language', $language);
|
||||
}
|
||||
$values = [];
|
||||
foreach ($query->execute() as $row) {
|
||||
foreach ($row as $key => $value) {
|
||||
|
@ -71,4 +81,44 @@ abstract class FieldableEntity extends DrupalSqlBase {
|
|||
return $values;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if an entity type uses Entity Translation.
|
||||
*
|
||||
* @param string $entity_type
|
||||
* The entity type.
|
||||
*
|
||||
* @return bool
|
||||
* Whether the entity type uses entity translation.
|
||||
*/
|
||||
protected function isEntityTranslatable($entity_type) {
|
||||
return in_array($entity_type, $this->variableGet('entity_translation_entity_types', []), TRUE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets an entity source language from the 'entity_translation' table.
|
||||
*
|
||||
* @param string $entity_type
|
||||
* The entity type.
|
||||
* @param int $entity_id
|
||||
* The entity ID.
|
||||
*
|
||||
* @return string|bool
|
||||
* The entity source language or FALSE if no source language was found.
|
||||
*/
|
||||
protected function getEntityTranslationSourceLanguage($entity_type, $entity_id) {
|
||||
try {
|
||||
return $this->select('entity_translation', 'et')
|
||||
->fields('et', ['language'])
|
||||
->condition('entity_type', $entity_type)
|
||||
->condition('entity_id', $entity_id)
|
||||
->condition('source', '')
|
||||
->execute()
|
||||
->fetchField();
|
||||
}
|
||||
// The table might not exist.
|
||||
catch (\Exception $e) {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,106 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\migrate_drupal\Plugin\migrate\source\d7;
|
||||
|
||||
use Drupal\Core\Entity\EntityManagerInterface;
|
||||
use Drupal\Core\State\StateInterface;
|
||||
use Drupal\migrate\Plugin\MigrationInterface;
|
||||
use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
|
||||
|
||||
/**
|
||||
* Gets Drupal variable_store source from database.
|
||||
*
|
||||
* @MigrateSource(
|
||||
* id = "d7_variable_translation",
|
||||
* source_module = "i18n_variable",
|
||||
* )
|
||||
*/
|
||||
class VariableTranslation extends DrupalSqlBase {
|
||||
/**
|
||||
* The variable names to fetch.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $variables;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, StateInterface $state, EntityManagerInterface $entity_manager) {
|
||||
parent::__construct($configuration, $plugin_id, $plugin_definition, $migration, $state, $entity_manager);
|
||||
$this->variables = $this->configuration['variables'];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function initializeIterator() {
|
||||
return new \ArrayIterator($this->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.
|
||||
* A key/value pair is added for the language code. Only those values are
|
||||
* returned that are actually in the database.
|
||||
*/
|
||||
protected function values() {
|
||||
$values = [];
|
||||
$result = $this->prepareQuery()->execute()->FetchAllAssoc('realm_key');
|
||||
foreach ($result as $variable_store) {
|
||||
$values[]['language'] = $variable_store['realm_key'];
|
||||
}
|
||||
$result = $this->prepareQuery()->execute()->FetchAll();
|
||||
foreach ($result as $variable_store) {
|
||||
foreach ($values as $key => $value) {
|
||||
if ($values[$key]['language'] === $variable_store['realm_key']) {
|
||||
if ($variable_store['serialized']) {
|
||||
$values[$key][$variable_store['name']] = unserialize($variable_store['value']);
|
||||
break;
|
||||
}
|
||||
else {
|
||||
$values[$key][$variable_store['name']] = $variable_store['value'];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return $values;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function count($refresh = FALSE) {
|
||||
return $this->initializeIterator()->count();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function fields() {
|
||||
return array_combine($this->variables, $this->variables);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getIds() {
|
||||
$ids['language']['type'] = 'string';
|
||||
return $ids;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function query() {
|
||||
return $this->select('variable_store', 'vs')
|
||||
->fields('vs')
|
||||
->condition('realm', 'language')
|
||||
->condition('name', (array) $this->configuration['variables'], 'IN');
|
||||
}
|
||||
|
||||
}
|
|
@ -9,7 +9,8 @@ use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
|
|||
* Drupal config source from database.
|
||||
*
|
||||
* @MigrateSource(
|
||||
* id = "d8_config"
|
||||
* id = "d8_config",
|
||||
* source_module = "system",
|
||||
* )
|
||||
*/
|
||||
class Config extends DrupalSqlBase {
|
||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,14 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Module for Migrate CCK Field Plugin Manager testing.
|
||||
*/
|
||||
|
||||
use Drupal\migrate_cckfield_plugin_manager_test\Plugin\migrate\cckfield\D6FileField;
|
||||
|
||||
function migrate_cckfield_plugin_manager_test_migrate_field_info_alter(array &$definitions) {
|
||||
if (isset($definitions['filefield'])) {
|
||||
$definitions['filefield']['class'] = D6FileField::class;
|
||||
}
|
||||
}
|
|
@ -11,7 +11,9 @@ use Drupal\migrate\Plugin\MigrationInterface;
|
|||
* core = {6},
|
||||
* type_map = {
|
||||
* "file" = "file"
|
||||
* }
|
||||
* },
|
||||
* source_module = "foo",
|
||||
* destination_module = "bar"
|
||||
* )
|
||||
*/
|
||||
class D6FileField extends CckFieldPluginBase {
|
||||
|
@ -19,11 +21,10 @@ class D6FileField extends CckFieldPluginBase {
|
|||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getFieldFormatterMap() {}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function processCckFieldValues(MigrationInterface $migration, $field_name, $data) {}
|
||||
public function processCckFieldValues(MigrationInterface $migration, $field_name, $data) {
|
||||
$migration->setProcessOfProperty($field_name, [
|
||||
'class' => static::class,
|
||||
]);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -7,16 +7,13 @@ use Drupal\migrate\Plugin\MigrationInterface;
|
|||
|
||||
/**
|
||||
* @MigrateCckField(
|
||||
* id = "d6_no_core_version_specified"
|
||||
* id = "d6_no_core_version_specified",
|
||||
* source_module = "foo",
|
||||
* destination_module = "bar",
|
||||
* )
|
||||
*/
|
||||
class D6NoCoreVersionSpecified extends CckFieldPluginBase {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getFieldFormatterMap() {}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
|
|
|
@ -1,14 +0,0 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Module for Migrate Field Plugin Manager testing.
|
||||
*/
|
||||
|
||||
use Drupal\migrate_field_plugin_manager_test\Plugin\migrate\cckfield\d6\FileField;
|
||||
|
||||
function migrate_field_plugin_manager_test_migrate_field_info_alter(array &$definitions) {
|
||||
if (isset($definitions['filefield'])) {
|
||||
$definitions['filefield']['class'] = FileField::class;
|
||||
}
|
||||
}
|
|
@ -1,32 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\migrate_field_plugin_manager_test\Plugin\migrate\cckfield\d6;
|
||||
|
||||
use Drupal\migrate\Plugin\MigrationInterface;
|
||||
use Drupal\migrate_drupal\Plugin\migrate\cckfield\CckFieldPluginBase;
|
||||
|
||||
/**
|
||||
* @MigrateCckField(
|
||||
* id = "filefield",
|
||||
* core = {6}
|
||||
* )
|
||||
*/
|
||||
class FileField extends CckFieldPluginBase {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getFieldFormatterMap() {
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function processCckFieldValues(MigrationInterface $migration, $field_name, $data) {
|
||||
$migration->mergeProcessOfProperty($field_name, [
|
||||
'class' => __CLASS__,
|
||||
]);
|
||||
}
|
||||
|
||||
}
|
|
@ -3,7 +3,6 @@
|
|||
namespace Drupal\migrate_field_plugin_manager_test\Plugin\migrate\field;
|
||||
|
||||
use Drupal\migrate_drupal\Plugin\migrate\field\FieldPluginBase;
|
||||
use Drupal\migrate\Plugin\MigrationInterface;
|
||||
|
||||
/**
|
||||
* @MigrateField(
|
||||
|
@ -11,21 +10,9 @@ use Drupal\migrate\Plugin\MigrationInterface;
|
|||
* core = {6},
|
||||
* type_map = {
|
||||
* "file" = "file"
|
||||
* }
|
||||
* },
|
||||
* source_module = "foo",
|
||||
* destination_module = "bar"
|
||||
* )
|
||||
*/
|
||||
class D6FileField extends FieldPluginBase {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getFieldFormatterMap() {
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function processFieldValues(MigrationInterface $migration, $field_name, $data) {}
|
||||
|
||||
}
|
||||
class D6FileField extends FieldPluginBase {}
|
||||
|
|
|
@ -3,25 +3,12 @@
|
|||
namespace Drupal\migrate_field_plugin_manager_test\Plugin\migrate\field;
|
||||
|
||||
use Drupal\migrate_drupal\Plugin\migrate\field\FieldPluginBase;
|
||||
use Drupal\migrate\Plugin\MigrationInterface;
|
||||
|
||||
/**
|
||||
* @MigrateField(
|
||||
* id = "d6_no_core_version_specified"
|
||||
* id = "d6_no_core_version_specified",
|
||||
* source_module = "foo",
|
||||
* destination_module = "bar",
|
||||
* )
|
||||
*/
|
||||
class D6NoCoreVersionSpecified extends FieldPluginBase {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getFieldFormatterMap() {
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function processFieldValues(MigrationInterface $migration, $field_name, $data) {}
|
||||
|
||||
}
|
||||
class D6NoCoreVersionSpecified extends FieldPluginBase {}
|
||||
|
|
|
@ -2,28 +2,31 @@
|
|||
|
||||
namespace Drupal\Tests\migrate_drupal\Kernel;
|
||||
|
||||
use Drupal\migrate_field_plugin_manager_test\Plugin\migrate\cckfield\d6\FileField;
|
||||
use Drupal\migrate_cckfield_plugin_manager_test\Plugin\migrate\cckfield\D6FileField;
|
||||
use Drupal\Tests\migrate_drupal\Kernel\d6\MigrateDrupal6TestBase;
|
||||
|
||||
/**
|
||||
* @group migrate_drupal
|
||||
* @group legacy
|
||||
*/
|
||||
class CckFieldBackwardsCompatibilityTest extends MigrateDrupal6TestBase {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static $modules = ['file', 'migrate_field_plugin_manager_test'];
|
||||
public static $modules = ['file', 'migrate_cckfield_plugin_manager_test'];
|
||||
|
||||
/**
|
||||
* Ensures that the cckfield backwards compatibility layer is invoked.
|
||||
*
|
||||
* @expectedDeprecation MigrateCckFieldInterface is deprecated in Drupal 8.3.x and will be removed before Drupal 9.0.x. Use \Drupal\migrate_drupal\Annotation\MigrateField instead.
|
||||
*/
|
||||
public function testBackwardsCompatibility() {
|
||||
$migration = $this->container
|
||||
->get('plugin.manager.migration')
|
||||
->getDefinition('d6_node:story');
|
||||
|
||||
$this->assertSame(FileField::class, $migration['process']['field_test_filefield']['class']);
|
||||
$this->assertSame(D6FileField::class, $migration['process']['field_test_filefield']['class']);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\migrate_drupal\Kernel;
|
||||
|
||||
use Drupal\Tests\migrate_drupal\Kernel\d6\MigrateDrupal6TestBase;
|
||||
|
||||
/**
|
||||
* Test that no dummy migrate_map tables are created.
|
||||
*
|
||||
* @group migrate_drupal
|
||||
*/
|
||||
class IdMapTableNoDummyTest extends MigrateDrupal6TestBase {
|
||||
|
||||
/**
|
||||
* The migration plugin manager.
|
||||
*
|
||||
* @var \Drupal\migrate\Plugin\MigrationPluginManagerInterface
|
||||
*/
|
||||
protected $pluginManager;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function setUp() {
|
||||
parent::setUp();
|
||||
$this->pluginManager = $this->container->get('plugin.manager.migration');
|
||||
$this->pluginManager->createInstance('d6_user');
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that dummy map tables do not exist.
|
||||
*/
|
||||
public function testNoDummyTables() {
|
||||
$database = \Drupal::database();
|
||||
$tables = $database->schema()->findTables('%migrate_map%');
|
||||
$dummy_tables = preg_grep("/.*migrate_map_([0-9a-fA-F]){13}/", $tables);
|
||||
$this->assertCount(0, $dummy_tables);
|
||||
}
|
||||
|
||||
}
|
|
@ -22,28 +22,20 @@ class MigrateCckFieldPluginManagerTest extends MigrateDrupalTestBase {
|
|||
public function testPluginSelection() {
|
||||
$plugin_manager = \Drupal::service('plugin.manager.migrate.cckfield');
|
||||
|
||||
$plugin_id = $plugin_manager->getPluginIdFromFieldType('filefield', ['core' => 6]);
|
||||
$this->assertIdentical('Drupal\\file\\Plugin\\migrate\\cckfield\\d6\\FileField', get_class($plugin_manager->createInstance($plugin_id, ['core' => 6])));
|
||||
$this->assertSame('d6_file', $plugin_manager->getPluginIdFromFieldType('file', ['core' => 6]));
|
||||
|
||||
try {
|
||||
// If this test passes, getPluginIdFromFieldType will raise a
|
||||
// PluginNotFoundException and we'll never reach fail().
|
||||
$plugin_manager->getPluginIdFromFieldType('filefield', ['core' => 7]);
|
||||
$plugin_manager->getPluginIdFromFieldType('d6_file', ['core' => 7]);
|
||||
$this->fail('Expected Drupal\Component\Plugin\Exception\PluginNotFoundException.');
|
||||
}
|
||||
catch (PluginNotFoundException $e) {
|
||||
$this->assertIdentical($e->getMessage(), "Plugin ID 'filefield' was not found.");
|
||||
$this->assertSame($e->getMessage(), "Plugin ID 'd6_file' was not found.");
|
||||
}
|
||||
|
||||
$this->assertIdentical('image', $plugin_manager->getPluginIdFromFieldType('image', ['core' => 7]));
|
||||
$this->assertIdentical('file', $plugin_manager->getPluginIdFromFieldType('file', ['core' => 7]));
|
||||
$this->assertIdentical('d6_file', $plugin_manager->getPluginIdFromFieldType('file', ['core' => 6]));
|
||||
|
||||
$this->assertIdentical('text', $plugin_manager->getPluginIdFromFieldType('text', ['core' => 6]));
|
||||
$this->assertIdentical('text', $plugin_manager->getPluginIdFromFieldType('text', ['core' => 7]));
|
||||
|
||||
// Test fallback when no core version is specified.
|
||||
$this->assertIdentical('d6_no_core_version_specified', $plugin_manager->getPluginIdFromFieldType('d6_no_core_version_specified', ['core' => 6]));
|
||||
$this->assertSame('d6_no_core_version_specified', $plugin_manager->getPluginIdFromFieldType('d6_no_core_version_specified', ['core' => 6]));
|
||||
|
||||
try {
|
||||
// If this test passes, getPluginIdFromFieldType will raise a
|
||||
|
@ -52,7 +44,7 @@ class MigrateCckFieldPluginManagerTest extends MigrateDrupalTestBase {
|
|||
$this->fail('Expected Drupal\Component\Plugin\Exception\PluginNotFoundException.');
|
||||
}
|
||||
catch (PluginNotFoundException $e) {
|
||||
$this->assertIdentical($e->getMessage(), "Plugin ID 'd6_no_core_version_specified' was not found.");
|
||||
$this->assertSame($e->getMessage(), "Plugin ID 'd6_no_core_version_specified' was not found.");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@ class MigrateFieldPluginManagerTest extends MigrateDrupalTestBase {
|
|||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static $modules = ['system', 'user', 'field', 'migrate_drupal', 'options', 'file', 'text', 'migrate_field_plugin_manager_test'];
|
||||
public static $modules = ['system', 'user', 'field', 'migrate_drupal', 'options', 'file', 'image', 'text', 'link', 'migrate_field_plugin_manager_test'];
|
||||
|
||||
/**
|
||||
* Tests that the correct MigrateField plugins are used.
|
||||
|
@ -32,7 +32,13 @@ class MigrateFieldPluginManagerTest extends MigrateDrupalTestBase {
|
|||
$this->assertIdentical($e->getMessage(), "Plugin ID 'filefield' was not found.");
|
||||
}
|
||||
|
||||
$this->assertIdentical('link', $plugin_manager->getPluginIdFromFieldType('link', ['core' => 6]));
|
||||
$this->assertIdentical('link_field', $plugin_manager->getPluginIdFromFieldType('link_field', ['core' => 7]));
|
||||
$this->assertIdentical('image', $plugin_manager->getPluginIdFromFieldType('image', ['core' => 7]));
|
||||
$this->assertIdentical('file', $plugin_manager->getPluginIdFromFieldType('file', ['core' => 7]));
|
||||
$this->assertIdentical('d6_file', $plugin_manager->getPluginIdFromFieldType('file', ['core' => 6]));
|
||||
$this->assertIdentical('d6_text', $plugin_manager->getPluginIdFromFieldType('text', ['core' => 6]));
|
||||
$this->assertIdentical('d7_text', $plugin_manager->getPluginIdFromFieldType('text', ['core' => 7]));
|
||||
|
||||
// Test fallback when no core version is specified.
|
||||
$this->assertIdentical('d6_no_core_version_specified', $plugin_manager->getPluginIdFromFieldType('d6_no_core_version_specified', ['core' => 6]));
|
||||
|
|
|
@ -0,0 +1,130 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\migrate_drupal\Kernel\Plugin\migrate;
|
||||
|
||||
use Drupal\ban\Plugin\migrate\destination\BlockedIP;
|
||||
use Drupal\color\Plugin\migrate\destination\Color;
|
||||
use Drupal\KernelTests\FileSystemModuleDiscoveryDataProviderTrait;
|
||||
use Drupal\migrate\Plugin\migrate\destination\ComponentEntityDisplayBase;
|
||||
use Drupal\migrate\Plugin\migrate\destination\Config;
|
||||
use Drupal\migrate\Plugin\migrate\destination\EntityConfigBase;
|
||||
use Drupal\migrate\Plugin\migrate\destination\EntityContentBase;
|
||||
use Drupal\path\Plugin\migrate\destination\UrlAlias;
|
||||
use Drupal\shortcut\Plugin\migrate\destination\ShortcutSetUsers;
|
||||
use Drupal\statistics\Plugin\migrate\destination\NodeCounter;
|
||||
use Drupal\system\Plugin\migrate\destination\d7\ThemeSettings;
|
||||
use Drupal\Tests\migrate_drupal\Kernel\MigrateDrupalTestBase;
|
||||
use Drupal\Tests\migrate_drupal\Traits\CreateMigrationsTrait;
|
||||
use Drupal\user\Plugin\migrate\destination\UserData;
|
||||
|
||||
/**
|
||||
* Tests that all migrations are tagged as either content or configuration.
|
||||
*
|
||||
* @group migrate_drupal
|
||||
*/
|
||||
class DestinationCategoryTest extends MigrateDrupalTestBase {
|
||||
|
||||
use FileSystemModuleDiscoveryDataProviderTrait;
|
||||
use CreateMigrationsTrait;
|
||||
|
||||
/**
|
||||
* The migration plugin manager.
|
||||
*
|
||||
* @var \Drupal\migrate\Plugin\MigrationPluginManager
|
||||
*/
|
||||
protected $migrationManager;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function setUp() {
|
||||
// Enable all modules.
|
||||
self::$modules = array_keys($this->coreModuleListDataProvider());
|
||||
parent::setUp();
|
||||
$this->migrationManager = \Drupal::service('plugin.manager.migration');
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that all D6 migrations are tagged as either Configuration or Content.
|
||||
*/
|
||||
public function testD6Categories() {
|
||||
$migrations = $this->drupal6Migrations();
|
||||
$this->assertArrayHasKey('d6_node:page', $migrations);
|
||||
$this->assertCategories($migrations);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that all D7 migrations are tagged as either Configuration or Content.
|
||||
*/
|
||||
public function testD7Categories() {
|
||||
$migrations = $this->drupal7Migrations();
|
||||
$this->assertArrayHasKey('d7_node:page', $migrations);
|
||||
$this->assertCategories($migrations);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Asserts that all migrations are tagged as either Configuration or Content.
|
||||
*
|
||||
* @param \Drupal\migrate\Plugin\MigrationInterface[] $migrations
|
||||
* The migrations.
|
||||
*/
|
||||
protected function assertCategories($migrations) {
|
||||
foreach ($migrations as $id => $migration) {
|
||||
$object_classes = class_parents($migration->getDestinationPlugin());
|
||||
$object_classes[] = get_class($migration->getDestinationPlugin());
|
||||
|
||||
// Ensure that the destination plugin is an instance of at least one of
|
||||
// the expected classes.
|
||||
if (in_array('Configuration', $migration->getMigrationTags(), TRUE)) {
|
||||
$this->assertNotEmpty(array_intersect($object_classes, $this->getConfigurationClasses()), "The migration $id is tagged as Configuration.");
|
||||
}
|
||||
elseif (in_array('Content', $migration->getMigrationTags(), TRUE)) {
|
||||
$this->assertNotEmpty(array_intersect($object_classes, $this->getContentClasses()), "The migration $id is tagged as Content.");
|
||||
}
|
||||
else {
|
||||
$this->fail("The migration $id is not tagged as either 'Content' or 'Configuration'.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get configuration classes.
|
||||
*
|
||||
* Configuration migrations should have a destination plugin that is an
|
||||
* instance of one of the following classes.
|
||||
*
|
||||
* @return array
|
||||
* The configuration class names.
|
||||
*/
|
||||
protected function getConfigurationClasses() {
|
||||
return [
|
||||
Color::class,
|
||||
Config::class,
|
||||
EntityConfigBase::class,
|
||||
ThemeSettings::class,
|
||||
ComponentEntityDisplayBase::class,
|
||||
ShortcutSetUsers::class,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get content classes.
|
||||
*
|
||||
* Content migrations should have a destination plugin that is an instance
|
||||
* of one of the following classes.
|
||||
*
|
||||
* @return array
|
||||
* The content class names.
|
||||
*/
|
||||
protected function getContentClasses() {
|
||||
return [
|
||||
EntityContentBase::class,
|
||||
UrlAlias::class,
|
||||
BlockedIP::class,
|
||||
NodeCounter::class,
|
||||
UserData::class,
|
||||
];
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,443 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\migrate_drupal\Kernel\Plugin\migrate\source;
|
||||
|
||||
use Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException;
|
||||
use Drupal\Core\Field\FieldStorageDefinitionInterface;
|
||||
use Drupal\Core\Language\LanguageInterface;
|
||||
use Drupal\file\Entity\File;
|
||||
use Drupal\KernelTests\KernelTestBase;
|
||||
use Drupal\language\Entity\ConfigurableLanguage;
|
||||
use Drupal\media\Entity\Media;
|
||||
use Drupal\migrate\Plugin\MigrationInterface;
|
||||
use Drupal\migrate_drupal\Plugin\migrate\source\ContentEntity;
|
||||
use Drupal\node\Entity\Node;
|
||||
use Drupal\node\Entity\NodeType;
|
||||
use Drupal\taxonomy\Entity\Term;
|
||||
use Drupal\taxonomy\Entity\Vocabulary;
|
||||
use Drupal\Tests\field\Traits\EntityReferenceTestTrait;
|
||||
use Drupal\Tests\media\Traits\MediaTypeCreationTrait;
|
||||
use Drupal\user\Entity\User;
|
||||
|
||||
/**
|
||||
* Tests the entity content source plugin.
|
||||
*
|
||||
* @group migrate_drupal
|
||||
*/
|
||||
class ContentEntityTest extends KernelTestBase {
|
||||
|
||||
use EntityReferenceTestTrait;
|
||||
use MediaTypeCreationTrait;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static $modules = [
|
||||
'user',
|
||||
'migrate',
|
||||
'migrate_drupal',
|
||||
'system',
|
||||
'node',
|
||||
'taxonomy',
|
||||
'field',
|
||||
'file',
|
||||
'image',
|
||||
'media',
|
||||
'media_test_source',
|
||||
'text',
|
||||
'filter',
|
||||
'language',
|
||||
'content_translation',
|
||||
];
|
||||
|
||||
/**
|
||||
* The bundle used in this test.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $bundle = 'article';
|
||||
|
||||
/**
|
||||
* The name of the field used in this test.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $fieldName = 'field_entity_reference';
|
||||
|
||||
/**
|
||||
* The vocabulary ID.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $vocabulary = 'fruit';
|
||||
|
||||
/**
|
||||
* The test user.
|
||||
*
|
||||
* @var \Drupal\user\Entity\User
|
||||
*/
|
||||
protected $user;
|
||||
|
||||
/**
|
||||
* The migration plugin manager.
|
||||
*
|
||||
* @var \Drupal\migrate\Plugin\MigrationPluginManagerInterface
|
||||
*/
|
||||
protected $migrationPluginManager;
|
||||
|
||||
/**
|
||||
* The source plugin manager.
|
||||
*
|
||||
* @var \Drupal\migrate\Plugin\MigrateSourcePluginManager
|
||||
*/
|
||||
protected $sourcePluginManager;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
$this->installEntitySchema('node');
|
||||
$this->installEntitySchema('file');
|
||||
$this->installEntitySchema('media');
|
||||
$this->installEntitySchema('taxonomy_term');
|
||||
$this->installEntitySchema('taxonomy_vocabulary');
|
||||
$this->installEntitySchema('user');
|
||||
$this->installSchema('system', ['sequences']);
|
||||
$this->installSchema('user', 'users_data');
|
||||
$this->installSchema('file', 'file_usage');
|
||||
$this->installSchema('node', ['node_access']);
|
||||
$this->installConfig($this->modules);
|
||||
|
||||
ConfigurableLanguage::createFromLangcode('fr')->save();
|
||||
|
||||
// Create article content type.
|
||||
$node_type = NodeType::create(['type' => $this->bundle, 'name' => 'Article']);
|
||||
$node_type->save();
|
||||
|
||||
// Create a vocabulary.
|
||||
$vocabulary = Vocabulary::create([
|
||||
'name' => $this->vocabulary,
|
||||
'description' => $this->vocabulary,
|
||||
'vid' => $this->vocabulary,
|
||||
'langcode' => LanguageInterface::LANGCODE_NOT_SPECIFIED,
|
||||
]);
|
||||
$vocabulary->save();
|
||||
|
||||
// Create a term reference field on node.
|
||||
$this->createEntityReferenceField(
|
||||
'node',
|
||||
$this->bundle,
|
||||
$this->fieldName,
|
||||
'Term reference',
|
||||
'taxonomy_term',
|
||||
'default',
|
||||
['target_bundles' => [$this->vocabulary]],
|
||||
FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED
|
||||
);
|
||||
// Create a term reference field on user.
|
||||
$this->createEntityReferenceField(
|
||||
'user',
|
||||
'user',
|
||||
$this->fieldName,
|
||||
'Term reference',
|
||||
'taxonomy_term',
|
||||
'default',
|
||||
['target_bundles' => [$this->vocabulary]],
|
||||
FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED
|
||||
);
|
||||
|
||||
// Create some data.
|
||||
$this->user = User::create([
|
||||
'name' => 'user123',
|
||||
'uid' => 1,
|
||||
'mail' => 'example@example.com',
|
||||
]);
|
||||
$this->user->save();
|
||||
|
||||
$term = Term::create([
|
||||
'vid' => $this->vocabulary,
|
||||
'name' => 'Apples',
|
||||
'uid' => $this->user->id(),
|
||||
]);
|
||||
$term->save();
|
||||
$this->user->set($this->fieldName, $term->id());
|
||||
$this->user->save();
|
||||
$node = Node::create([
|
||||
'type' => $this->bundle,
|
||||
'title' => 'Apples',
|
||||
$this->fieldName => $term->id(),
|
||||
'uid' => $this->user->id(),
|
||||
]);
|
||||
$node->save();
|
||||
$node->addTranslation('fr', [
|
||||
'title' => 'Pommes',
|
||||
$this->fieldName => $term->id(),
|
||||
])->save();
|
||||
|
||||
$this->sourcePluginManager = $this->container->get('plugin.manager.migrate.source');
|
||||
$this->migrationPluginManager = $this->container->get('plugin.manager.migration');
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the constructor for missing entity_type.
|
||||
*/
|
||||
public function testConstructorEntityTypeMissing() {
|
||||
$migration = $this->prophesize(MigrationInterface::class)->reveal();
|
||||
$configuration = [];
|
||||
$plugin_definition = [
|
||||
'entity_type' => '',
|
||||
];
|
||||
$this->setExpectedException(InvalidPluginDefinitionException::class, 'Missing required "entity_type" definition.');
|
||||
ContentEntity::create($this->container, $configuration, 'content_entity', $plugin_definition, $migration);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the constructor for non content entity.
|
||||
*/
|
||||
public function testConstructorNonContentEntity() {
|
||||
$migration = $this->prophesize(MigrationInterface::class)->reveal();
|
||||
$configuration = [];
|
||||
$plugin_definition = [
|
||||
'entity_type' => 'node_type',
|
||||
];
|
||||
$this->setExpectedException(InvalidPluginDefinitionException::class, 'The entity type (node_type) is not supported. The "content_entity" source plugin only supports content entities.');
|
||||
ContentEntity::create($this->container, $configuration, 'content_entity:node_type', $plugin_definition, $migration);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the constructor for not bundleable entity.
|
||||
*/
|
||||
public function testConstructorNotBundable() {
|
||||
$migration = $this->prophesize(MigrationInterface::class)->reveal();
|
||||
$configuration = [
|
||||
'bundle' => 'foo',
|
||||
];
|
||||
$plugin_definition = [
|
||||
'entity_type' => 'user',
|
||||
];
|
||||
$this->setExpectedException(\InvalidArgumentException::class, 'A bundle was provided but the entity type (user) is not bundleable');
|
||||
ContentEntity::create($this->container, $configuration, 'content_entity:user', $plugin_definition, $migration);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the constructor for invalid entity bundle.
|
||||
*/
|
||||
public function testConstructorInvalidBundle() {
|
||||
$migration = $this->prophesize(MigrationInterface::class)->reveal();
|
||||
$configuration = [
|
||||
'bundle' => 'foo',
|
||||
];
|
||||
$plugin_definition = [
|
||||
'entity_type' => 'node',
|
||||
];
|
||||
$this->setExpectedException(\InvalidArgumentException::class, 'The provided bundle (foo) is not valid for the (node) entity type.');
|
||||
ContentEntity::create($this->container, $configuration, 'content_entity:node', $plugin_definition, $migration);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests user source plugin.
|
||||
*/
|
||||
public function testUserSource() {
|
||||
$configuration = [
|
||||
'include_translations' => FALSE,
|
||||
];
|
||||
$migration = $this->migrationPluginManager->createStubMigration($this->migrationDefinition('content_entity:user'));
|
||||
$user_source = $this->sourcePluginManager->createInstance('content_entity:user', $configuration, $migration);
|
||||
$this->assertSame('users', $user_source->__toString());
|
||||
$this->assertEquals(1, $user_source->count());
|
||||
$ids = $user_source->getIds();
|
||||
$this->assertArrayHasKey('langcode', $ids);
|
||||
$this->assertArrayHasKey('uid', $ids);
|
||||
$fields = $user_source->fields();
|
||||
$this->assertArrayHasKey('name', $fields);
|
||||
$this->assertArrayHasKey('pass', $fields);
|
||||
$this->assertArrayHasKey('mail', $fields);
|
||||
$this->assertArrayHasKey('uid', $fields);
|
||||
$this->assertArrayHasKey('roles', $fields);
|
||||
$user_source->rewind();
|
||||
$values = $user_source->current()->getSource();
|
||||
$this->assertEquals('example@example.com', $values['mail'][0]['value']);
|
||||
$this->assertEquals('user123', $values['name'][0]['value']);
|
||||
$this->assertEquals(1, $values['uid']);
|
||||
$this->assertEquals(1, $values['field_entity_reference'][0]['target_id']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests file source plugin.
|
||||
*/
|
||||
public function testFileSource() {
|
||||
$file = File::create([
|
||||
'filename' => 'foo.txt',
|
||||
'uid' => $this->user->id(),
|
||||
'uri' => 'public://foo.txt',
|
||||
]);
|
||||
$file->save();
|
||||
|
||||
$configuration = [
|
||||
'include_translations' => FALSE,
|
||||
];
|
||||
$migration = $this->migrationPluginManager->createStubMigration($this->migrationDefinition('content_entity:file'));
|
||||
$file_source = $this->sourcePluginManager->createInstance('content_entity:file', $configuration, $migration);
|
||||
$this->assertSame('files', $file_source->__toString());
|
||||
$this->assertEquals(1, $file_source->count());
|
||||
$ids = $file_source->getIds();
|
||||
$this->assertArrayHasKey('fid', $ids);
|
||||
$fields = $file_source->fields();
|
||||
$this->assertArrayHasKey('fid', $fields);
|
||||
$this->assertArrayHasKey('filemime', $fields);
|
||||
$this->assertArrayHasKey('filename', $fields);
|
||||
$this->assertArrayHasKey('uid', $fields);
|
||||
$this->assertArrayHasKey('uri', $fields);
|
||||
$file_source->rewind();
|
||||
$values = $file_source->current()->getSource();
|
||||
$this->assertEquals('text/plain', $values['filemime'][0]['value']);
|
||||
$this->assertEquals('public://foo.txt', $values['uri'][0]['value']);
|
||||
$this->assertEquals('foo.txt', $values['filename'][0]['value']);
|
||||
$this->assertEquals(1, $values['fid']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests node source plugin.
|
||||
*/
|
||||
public function testNodeSource() {
|
||||
$migration = $this->migrationPluginManager->createStubMigration($this->migrationDefinition('content_entity:node'));
|
||||
$node_source = $this->sourcePluginManager->createInstance('content_entity:node', ['bundle' => $this->bundle], $migration);
|
||||
$this->assertSame('content items', $node_source->__toString());
|
||||
$ids = $node_source->getIds();
|
||||
$this->assertArrayHasKey('langcode', $ids);
|
||||
$this->assertArrayHasKey('nid', $ids);
|
||||
$fields = $node_source->fields();
|
||||
$this->assertArrayHasKey('nid', $fields);
|
||||
$this->assertArrayHasKey('vid', $fields);
|
||||
$this->assertArrayHasKey('title', $fields);
|
||||
$this->assertArrayHasKey('uid', $fields);
|
||||
$this->assertArrayHasKey('sticky', $fields);
|
||||
$node_source->rewind();
|
||||
$values = $node_source->current()->getSource();
|
||||
$this->assertEquals($this->bundle, $values['type'][0]['target_id']);
|
||||
$this->assertEquals(1, $values['nid']);
|
||||
$this->assertEquals('en', $values['langcode']);
|
||||
$this->assertEquals(1, $values['status'][0]['value']);
|
||||
$this->assertEquals('Apples', $values['title'][0]['value']);
|
||||
$this->assertEquals(1, $values['default_langcode'][0]['value']);
|
||||
$this->assertEquals(1, $values['field_entity_reference'][0]['target_id']);
|
||||
$node_source->next();
|
||||
$values = $node_source->current()->getSource();
|
||||
$this->assertEquals($this->bundle, $values['type'][0]['target_id']);
|
||||
$this->assertEquals(1, $values['nid']);
|
||||
$this->assertEquals('fr', $values['langcode']);
|
||||
$this->assertEquals(1, $values['status'][0]['value']);
|
||||
$this->assertEquals('Pommes', $values['title'][0]['value']);
|
||||
$this->assertEquals(0, $values['default_langcode'][0]['value']);
|
||||
$this->assertEquals(1, $values['field_entity_reference'][0]['target_id']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests media source plugin.
|
||||
*/
|
||||
public function testMediaSource() {
|
||||
$values = [
|
||||
'id' => 'image',
|
||||
'label' => 'Image',
|
||||
'source' => 'test',
|
||||
'new_revision' => FALSE,
|
||||
];
|
||||
$media_type = $this->createMediaType('test', $values);
|
||||
$media = Media::create([
|
||||
'name' => 'Foo media',
|
||||
'uid' => $this->user->id(),
|
||||
'bundle' => $media_type->id(),
|
||||
]);
|
||||
$media->save();
|
||||
|
||||
$configuration = [
|
||||
'include_translations' => FALSE,
|
||||
'bundle' => 'image',
|
||||
];
|
||||
$migration = $this->migrationPluginManager->createStubMigration($this->migrationDefinition('content_entity:media'));
|
||||
$media_source = $this->sourcePluginManager->createInstance('content_entity:media', $configuration, $migration);
|
||||
$this->assertSame('media items', $media_source->__toString());
|
||||
$this->assertEquals(1, $media_source->count());
|
||||
$ids = $media_source->getIds();
|
||||
$this->assertArrayHasKey('langcode', $ids);
|
||||
$this->assertArrayHasKey('mid', $ids);
|
||||
$fields = $media_source->fields();
|
||||
$this->assertArrayHasKey('bundle', $fields);
|
||||
$this->assertArrayHasKey('mid', $fields);
|
||||
$this->assertArrayHasKey('name', $fields);
|
||||
$this->assertArrayHasKey('status', $fields);
|
||||
$media_source->rewind();
|
||||
$values = $media_source->current()->getSource();
|
||||
$this->assertEquals(1, $values['mid']);
|
||||
$this->assertEquals('Foo media', $values['name'][0]['value']);
|
||||
$this->assertEquals('Foo media', $values['thumbnail'][0]['title']);
|
||||
$this->assertEquals(1, $values['uid'][0]['target_id']);
|
||||
$this->assertEquals('image', $values['bundle'][0]['target_id']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests term source plugin.
|
||||
*/
|
||||
public function testTermSource() {
|
||||
$term2 = Term::create([
|
||||
'vid' => $this->vocabulary,
|
||||
'name' => 'Granny Smith',
|
||||
'uid' => $this->user->id(),
|
||||
'parent' => 1,
|
||||
]);
|
||||
$term2->save();
|
||||
|
||||
$configuration = [
|
||||
'include_translations' => FALSE,
|
||||
'bundle' => $this->vocabulary,
|
||||
];
|
||||
$migration = $this->migrationPluginManager->createStubMigration($this->migrationDefinition('content_entity:taxonomy_term'));
|
||||
$term_source = $this->sourcePluginManager->createInstance('content_entity:taxonomy_term', $configuration, $migration);
|
||||
$this->assertSame('taxonomy terms', $term_source->__toString());
|
||||
$this->assertEquals(2, $term_source->count());
|
||||
$ids = $term_source->getIds();
|
||||
$this->assertArrayHasKey('langcode', $ids);
|
||||
$this->assertArrayHasKey('tid', $ids);
|
||||
$fields = $term_source->fields();
|
||||
$this->assertArrayHasKey('vid', $fields);
|
||||
$this->assertArrayHasKey('tid', $fields);
|
||||
$this->assertArrayHasKey('name', $fields);
|
||||
$term_source->rewind();
|
||||
$values = $term_source->current()->getSource();
|
||||
$this->assertEquals($this->vocabulary, $values['vid'][0]['target_id']);
|
||||
$this->assertEquals(1, $values['tid']);
|
||||
// @TODO: Add test coverage for parent in
|
||||
// https://www.drupal.org/project/drupal/issues/2940198
|
||||
$this->assertEquals('Apples', $values['name'][0]['value']);
|
||||
$term_source->next();
|
||||
$values = $term_source->current()->getSource();
|
||||
$this->assertEquals($this->vocabulary, $values['vid'][0]['target_id']);
|
||||
$this->assertEquals(2, $values['tid']);
|
||||
// @TODO: Add test coverage for parent in
|
||||
// https://www.drupal.org/project/drupal/issues/2940198
|
||||
$this->assertEquals('Granny Smith', $values['name'][0]['value']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a migration definition.
|
||||
*
|
||||
* @param string $plugin_id
|
||||
* The plugin id.
|
||||
*
|
||||
* @return array
|
||||
* The definition.
|
||||
*/
|
||||
protected function migrationDefinition($plugin_id) {
|
||||
return [
|
||||
'source' => [
|
||||
'plugin' => $plugin_id,
|
||||
],
|
||||
'process' => [],
|
||||
'destination' => [
|
||||
'plugin' => 'null',
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
}
|
|
@ -10,6 +10,7 @@ use Drupal\Tests\migrate\Kernel\MigrateSqlSourceTestBase;
|
|||
* @covers \Drupal\migrate_drupal\Plugin\migrate\source\d6\i18nVariable
|
||||
*
|
||||
* @group migrate_drupal
|
||||
* @group legacy
|
||||
*/
|
||||
class i18nVariableTest extends MigrateSqlSourceTestBase {
|
||||
|
||||
|
|
|
@ -0,0 +1,77 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\migrate_drupal\Kernel\Plugin\migrate\source\d7;
|
||||
|
||||
use Drupal\Tests\migrate\Kernel\MigrateSqlSourceTestBase;
|
||||
|
||||
/**
|
||||
* Tests the variable source plugin.
|
||||
*
|
||||
* @covers \Drupal\migrate_drupal\Plugin\migrate\source\d7\VariableTranslation
|
||||
*
|
||||
* @group migrate_drupal
|
||||
*/
|
||||
class VariableTranslationTest extends MigrateSqlSourceTestBase {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static $modules = ['migrate_drupal'];
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function providerSource() {
|
||||
$tests = [];
|
||||
|
||||
// The source data.
|
||||
$tests[0]['source_data']['variable_store'] = [
|
||||
[
|
||||
'realm' => 'language',
|
||||
'realm_key' => 'fr',
|
||||
'name' => 'site_slogan',
|
||||
'value' => 'fr - site slogan',
|
||||
'serialized' => '0',
|
||||
],
|
||||
[
|
||||
'realm' => 'language',
|
||||
'realm_key' => 'fr',
|
||||
'name' => 'user_mail_status_blocked_subject',
|
||||
'value' => 'fr - BEGONE!',
|
||||
'serialized' => '0',
|
||||
],
|
||||
[
|
||||
'realm' => 'language',
|
||||
'realm_key' => 'is',
|
||||
'name' => 'site_slogan',
|
||||
'value' => 's:16:"is - site slogan";',
|
||||
'serialized' => '1',
|
||||
],
|
||||
];
|
||||
|
||||
// The expected results.
|
||||
$tests[0]['expected_data'] = [
|
||||
[
|
||||
'language' => 'fr',
|
||||
'site_slogan' => 'fr - site slogan',
|
||||
'user_mail_status_blocked_subject' => 'fr - BEGONE!',
|
||||
],
|
||||
[
|
||||
'language' => 'is',
|
||||
'site_slogan' => 'is - site slogan',
|
||||
],
|
||||
];
|
||||
|
||||
// The expected count.
|
||||
$tests[0]['expected_count'] = NULL;
|
||||
|
||||
// The migration configuration.
|
||||
$tests[0]['configuration']['variables'] = [
|
||||
'site_slogan',
|
||||
'user_mail_status_blocked_subject',
|
||||
];
|
||||
|
||||
return $tests;
|
||||
}
|
||||
|
||||
}
|
|
@ -72,7 +72,7 @@ class ConfigTest extends MigrateSqlSourceTestBase {
|
|||
],
|
||||
'collections' => [
|
||||
'language.af',
|
||||
]
|
||||
],
|
||||
];
|
||||
|
||||
// Test with name and no collection in configuration.
|
||||
|
|
|
@ -114,8 +114,8 @@ class EntityContentBaseTest extends MigrateDrupal6TestBase {
|
|||
$message = $this->prophesize(MigrateMessageInterface::class);
|
||||
// Match the expected message. Can't use default argument types, because
|
||||
// we need to convert to string from TranslatableMarkup.
|
||||
$argument = Argument::that(function($msg) {
|
||||
return strpos((string) $msg, "This entity type does not support translation") !== FALSE;
|
||||
$argument = Argument::that(function ($msg) {
|
||||
return strpos((string) $msg, htmlentities('The "no_language_entity_test" entity type does not support translations.')) !== FALSE;
|
||||
});
|
||||
$message->display($argument, Argument::any())
|
||||
->shouldBeCalled();
|
||||
|
|
|
@ -0,0 +1,80 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\migrate_drupal\Kernel\d6;
|
||||
|
||||
use Drupal\node\Entity\Node;
|
||||
use Drupal\Tests\node\Kernel\Migrate\d6\MigrateNodeTestBase;
|
||||
|
||||
/**
|
||||
* Tests follow-up migrations.
|
||||
*
|
||||
* @group migrate_drupal
|
||||
*/
|
||||
class FollowUpMigrationsTest extends MigrateNodeTestBase {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static $modules = [
|
||||
'content_translation',
|
||||
'language',
|
||||
'menu_ui',
|
||||
// A requirement for d6_node_translation.
|
||||
'migrate_drupal_multilingual',
|
||||
];
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
$this->executeMigrations([
|
||||
'language',
|
||||
'd6_language_content_settings',
|
||||
'd6_node',
|
||||
'd6_node_translation',
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test entity reference translations.
|
||||
*/
|
||||
public function testEntityReferenceTranslations() {
|
||||
// Test the entity reference field before the follow-up migrations.
|
||||
$node = Node::load(10);
|
||||
$this->assertSame('13', $node->get('field_reference')->target_id);
|
||||
$this->assertSame('13', $node->get('field_reference_2')->target_id);
|
||||
$translation = $node->getTranslation('fr');
|
||||
$this->assertSame('20', $translation->get('field_reference')->target_id);
|
||||
$this->assertSame('20', $translation->get('field_reference_2')->target_id);
|
||||
|
||||
$node = Node::load(12)->getTranslation('en');
|
||||
$this->assertSame('10', $node->get('field_reference')->target_id);
|
||||
$this->assertSame('10', $node->get('field_reference_2')->target_id);
|
||||
$translation = $node->getTranslation('fr');
|
||||
$this->assertSame('11', $translation->get('field_reference')->target_id);
|
||||
$this->assertSame('11', $translation->get('field_reference_2')->target_id);
|
||||
|
||||
// Run the follow-up migrations.
|
||||
$migration_plugin_manager = $this->container->get('plugin.manager.migration');
|
||||
$migration_plugin_manager->clearCachedDefinitions();
|
||||
$follow_up_migrations = $migration_plugin_manager->createInstances('d6_entity_reference_translation');
|
||||
$this->executeMigrations(array_keys($follow_up_migrations));
|
||||
|
||||
// Test the entity reference field after the follow-up migrations.
|
||||
$node = Node::load(10);
|
||||
$this->assertSame('12', $node->get('field_reference')->target_id);
|
||||
$this->assertSame('12', $node->get('field_reference_2')->target_id);
|
||||
$translation = $node->getTranslation('fr');
|
||||
$this->assertSame('12', $translation->get('field_reference')->target_id);
|
||||
$this->assertSame('12', $translation->get('field_reference_2')->target_id);
|
||||
|
||||
$node = Node::load(12)->getTranslation('en');
|
||||
$this->assertSame('10', $node->get('field_reference')->target_id);
|
||||
$this->assertSame('10', $node->get('field_reference_2')->target_id);
|
||||
$translation = $node->getTranslation('fr');
|
||||
$this->assertSame('10', $translation->get('field_reference')->target_id);
|
||||
$this->assertSame('10', $translation->get('field_reference_2')->target_id);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,201 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\migrate_drupal\Kernel\d6;
|
||||
|
||||
use Drupal\KernelTests\FileSystemModuleDiscoveryDataProviderTrait;
|
||||
use Drupal\migrate\Audit\AuditResult;
|
||||
use Drupal\migrate\Audit\IdAuditor;
|
||||
use Drupal\node\Entity\Node;
|
||||
use Drupal\node\Entity\NodeType;
|
||||
use Drupal\Tests\content_moderation\Traits\ContentModerationTestTrait;
|
||||
use Drupal\Tests\migrate_drupal\Traits\CreateTestContentEntitiesTrait;
|
||||
|
||||
/**
|
||||
* Tests the migration auditor for ID conflicts.
|
||||
*
|
||||
* @group migrate_drupal
|
||||
*/
|
||||
class MigrateDrupal6AuditIdsTest extends MigrateDrupal6TestBase {
|
||||
|
||||
use FileSystemModuleDiscoveryDataProviderTrait;
|
||||
use CreateTestContentEntitiesTrait;
|
||||
use ContentModerationTestTrait;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function setUp() {
|
||||
// Enable all modules.
|
||||
self::$modules = array_keys($this->coreModuleListDataProvider());
|
||||
parent::setUp();
|
||||
|
||||
// Install required entity schemas.
|
||||
$this->installEntitySchemas();
|
||||
|
||||
// Install required schemas.
|
||||
$this->installSchema('book', ['book']);
|
||||
$this->installSchema('dblog', ['watchdog']);
|
||||
$this->installSchema('forum', ['forum_index']);
|
||||
$this->installSchema('node', ['node_access']);
|
||||
$this->installSchema('search', ['search_dataset']);
|
||||
$this->installSchema('system', ['sequences']);
|
||||
$this->installSchema('tracker', ['tracker_node', 'tracker_user']);
|
||||
|
||||
// Enable content moderation for nodes of type page.
|
||||
$this->installEntitySchema('content_moderation_state');
|
||||
$this->installConfig('content_moderation');
|
||||
NodeType::create(['type' => 'page'])->save();
|
||||
$workflow = $this->createEditorialWorkflow();
|
||||
$workflow->getTypePlugin()->addEntityTypeAndBundle('node', 'page');
|
||||
$workflow->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests multiple migrations to the same destination with no ID conflicts.
|
||||
*/
|
||||
public function testMultipleMigrationWithoutIdConflicts() {
|
||||
// Create a node of type page.
|
||||
$node = Node::create(['type' => 'page', 'title' => 'foo']);
|
||||
$node->moderation_state->value = 'published';
|
||||
$node->save();
|
||||
|
||||
// Insert data in the d6_node:page migration mapping table to simulate a
|
||||
// previously migrated node.
|
||||
$id_map = $this->getMigration('d6_node:page')->getIdMap();
|
||||
$table_name = $id_map->mapTableName();
|
||||
$id_map->getDatabase()->insert($table_name)
|
||||
->fields([
|
||||
'source_ids_hash' => 1,
|
||||
'sourceid1' => 1,
|
||||
'destid1' => 1,
|
||||
])
|
||||
->execute();
|
||||
|
||||
// Audit the IDs of the d6_node migrations for the page & article node type.
|
||||
// There should be no conflicts since the highest destination ID should be
|
||||
// equal to the highest migrated ID, as found in the aggregated mapping
|
||||
// tables of the two node migrations.
|
||||
$migrations = [
|
||||
$this->getMigration('d6_node:page'),
|
||||
$this->getMigration('d6_node:article'),
|
||||
];
|
||||
|
||||
$results = (new IdAuditor())->auditMultiple($migrations);
|
||||
/** @var \Drupal\migrate\Audit\AuditResult $result */
|
||||
foreach ($results as $result) {
|
||||
$this->assertInstanceOf(AuditResult::class, $result);
|
||||
$this->assertTrue($result->passed());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests all migrations with no ID conflicts.
|
||||
*/
|
||||
public function testAllMigrationsWithNoIdConflicts() {
|
||||
$migrations = $this->container
|
||||
->get('plugin.manager.migration')
|
||||
->createInstancesByTag('Drupal 6');
|
||||
|
||||
// Audit all Drupal 6 migrations that support it. There should be no
|
||||
// conflicts since no content has been created.
|
||||
$results = (new IdAuditor())->auditMultiple($migrations);
|
||||
/** @var \Drupal\migrate\Audit\AuditResult $result */
|
||||
foreach ($results as $result) {
|
||||
$this->assertInstanceOf(AuditResult::class, $result);
|
||||
$this->assertTrue($result->passed());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests all migrations with ID conflicts.
|
||||
*/
|
||||
public function testAllMigrationsWithIdConflicts() {
|
||||
// Get all Drupal 6 migrations.
|
||||
$migrations = $this->container
|
||||
->get('plugin.manager.migration')
|
||||
->createInstancesByTag('Drupal 6');
|
||||
|
||||
// Create content.
|
||||
$this->createContent();
|
||||
|
||||
// Audit the IDs of all migrations. There should be conflicts since content
|
||||
// has been created.
|
||||
$conflicts = array_map(
|
||||
function (AuditResult $result) {
|
||||
return $result->passed() ? NULL : $result->getMigration()->getBaseId();
|
||||
},
|
||||
(new IdAuditor())->auditMultiple($migrations)
|
||||
);
|
||||
|
||||
$expected = [
|
||||
'd6_aggregator_feed',
|
||||
'd6_aggregator_item',
|
||||
'd6_comment',
|
||||
'd6_custom_block',
|
||||
'd6_file',
|
||||
'd6_menu_links',
|
||||
'd6_node',
|
||||
'd6_node_revision',
|
||||
'd6_taxonomy_term',
|
||||
'd6_term_node_revision',
|
||||
'd6_user',
|
||||
'node_translation_menu_links',
|
||||
];
|
||||
$this->assertEmpty(array_diff(array_filter($conflicts), $expected));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests draft revisions ID conflicts.
|
||||
*/
|
||||
public function testDraftRevisionIdConflicts() {
|
||||
// Create a published node of type page.
|
||||
$node = Node::create(['type' => 'page', 'title' => 'foo']);
|
||||
$node->moderation_state->value = 'published';
|
||||
$node->save();
|
||||
|
||||
// Create a draft revision.
|
||||
$node->moderation_state->value = 'draft';
|
||||
$node->setNewRevision(TRUE);
|
||||
$node->save();
|
||||
|
||||
// Insert data in the d6_node_revision:page migration mapping table to
|
||||
// simulate a previously migrated node revision.
|
||||
$id_map = $this->getMigration('d6_node_revision:page')->getIdMap();
|
||||
$table_name = $id_map->mapTableName();
|
||||
$id_map->getDatabase()->insert($table_name)
|
||||
->fields([
|
||||
'source_ids_hash' => 1,
|
||||
'sourceid1' => 1,
|
||||
'destid1' => 1,
|
||||
])
|
||||
->execute();
|
||||
|
||||
// Audit the IDs of the d6_node_revision migration. There should be
|
||||
// conflicts since a draft revision has been created.
|
||||
/** @var \Drupal\migrate\Audit\AuditResult $result */
|
||||
$result = (new IdAuditor())->audit($this->getMigration('d6_node_revision:page'));
|
||||
$this->assertInstanceOf(AuditResult::class, $result);
|
||||
$this->assertFalse($result->passed());
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests ID conflicts for inaccessible nodes.
|
||||
*/
|
||||
public function testNodeGrantsIdConflicts() {
|
||||
// Enable the node_test module to restrict access to page nodes.
|
||||
$this->enableModules(['node_test']);
|
||||
|
||||
// Create a published node of type page.
|
||||
$node = Node::create(['type' => 'page', 'title' => 'foo']);
|
||||
$node->moderation_state->value = 'published';
|
||||
$node->save();
|
||||
|
||||
// Audit the IDs of the d6_node migration. There should be conflicts
|
||||
// even though the new node is not accessible.
|
||||
/** @var \Drupal\migrate\Audit\AuditResult $result */
|
||||
$result = (new IdAuditor())->audit($this->getMigration('d6_node:page'));
|
||||
$this->assertInstanceOf(AuditResult::class, $result);
|
||||
$this->assertFalse($result->passed());
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,119 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\migrate_drupal\Kernel\d7;
|
||||
|
||||
use Drupal\node\Entity\Node;
|
||||
use Drupal\Tests\file\Kernel\Migrate\d7\FileMigrationSetupTrait;
|
||||
|
||||
/**
|
||||
* Tests follow-up migrations.
|
||||
*
|
||||
* @group migrate_drupal
|
||||
*/
|
||||
class FollowUpMigrationsTest extends MigrateDrupal7TestBase {
|
||||
|
||||
use FileMigrationSetupTrait;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static $modules = [
|
||||
'content_translation',
|
||||
'comment',
|
||||
'datetime',
|
||||
'file',
|
||||
'image',
|
||||
'language',
|
||||
'link',
|
||||
'menu_ui',
|
||||
// A requirement for translation migrations.
|
||||
'migrate_drupal_multilingual',
|
||||
'node',
|
||||
'taxonomy',
|
||||
'telephone',
|
||||
'text',
|
||||
];
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
$this->fileMigrationSetup();
|
||||
|
||||
$this->installEntitySchema('node');
|
||||
$this->installEntitySchema('comment');
|
||||
$this->installEntitySchema('taxonomy_term');
|
||||
$this->installConfig(static::$modules);
|
||||
$this->installSchema('node', ['node_access']);
|
||||
|
||||
$this->executeMigrations([
|
||||
'language',
|
||||
'd7_user_role',
|
||||
'd7_user',
|
||||
'd7_node_type',
|
||||
'd7_language_content_settings',
|
||||
'd7_comment_type',
|
||||
'd7_taxonomy_vocabulary',
|
||||
'd7_field',
|
||||
'd7_field_instance',
|
||||
'd7_node',
|
||||
'd7_node_translation',
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function getFileMigrationInfo() {
|
||||
return [
|
||||
'path' => 'public://sites/default/files/cube.jpeg',
|
||||
'size' => '3620',
|
||||
'base_path' => 'public://',
|
||||
'plugin_id' => 'd7_file',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Test entity reference translations.
|
||||
*/
|
||||
public function testEntityReferenceTranslations() {
|
||||
// Test the entity reference field before the follow-up migrations.
|
||||
$node = Node::load(2);
|
||||
$this->assertSame('5', $node->get('field_reference')->target_id);
|
||||
$this->assertSame('5', $node->get('field_reference_2')->target_id);
|
||||
$translation = $node->getTranslation('is');
|
||||
$this->assertSame('4', $translation->get('field_reference')->target_id);
|
||||
$this->assertSame('4', $translation->get('field_reference_2')->target_id);
|
||||
|
||||
$node = Node::load(4);
|
||||
$this->assertSame('3', $node->get('field_reference')->target_id);
|
||||
$this->assertSame('3', $node->get('field_reference_2')->target_id);
|
||||
$translation = $node->getTranslation('en');
|
||||
$this->assertSame('2', $translation->get('field_reference')->target_id);
|
||||
$this->assertSame('2', $translation->get('field_reference_2')->target_id);
|
||||
|
||||
// Run the follow-up migrations.
|
||||
$migration_plugin_manager = $this->container->get('plugin.manager.migration');
|
||||
$migration_plugin_manager->clearCachedDefinitions();
|
||||
$follow_up_migrations = $migration_plugin_manager->createInstances('d7_entity_reference_translation');
|
||||
$this->executeMigrations(array_keys($follow_up_migrations));
|
||||
|
||||
// Test the entity reference field after the follow-up migrations.
|
||||
$node = Node::load(2);
|
||||
$this->assertSame('4', $node->get('field_reference')->target_id);
|
||||
$this->assertSame('4', $node->get('field_reference_2')->target_id);
|
||||
$translation = $node->getTranslation('is');
|
||||
$this->assertSame('4', $translation->get('field_reference')->target_id);
|
||||
$this->assertSame('4', $translation->get('field_reference_2')->target_id);
|
||||
|
||||
$node = Node::load(4);
|
||||
$this->assertSame('2', $node->get('field_reference')->target_id);
|
||||
$this->assertSame('2', $node->get('field_reference_2')->target_id);
|
||||
$translation = $node->getTranslation('en');
|
||||
$this->assertSame('2', $translation->get('field_reference')->target_id);
|
||||
$this->assertSame('2', $translation->get('field_reference_2')->target_id);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,200 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\migrate_drupal\Kernel\d7;
|
||||
|
||||
use Drupal\KernelTests\FileSystemModuleDiscoveryDataProviderTrait;
|
||||
use Drupal\migrate\Audit\AuditResult;
|
||||
use Drupal\migrate\Audit\IdAuditor;
|
||||
use Drupal\node\Entity\Node;
|
||||
use Drupal\node\Entity\NodeType;
|
||||
use Drupal\Tests\content_moderation\Traits\ContentModerationTestTrait;
|
||||
use Drupal\Tests\migrate_drupal\Traits\CreateTestContentEntitiesTrait;
|
||||
|
||||
/**
|
||||
* Tests the migration auditor for ID conflicts.
|
||||
*
|
||||
* @group migrate_drupal
|
||||
*/
|
||||
class MigrateDrupal7AuditIdsTest extends MigrateDrupal7TestBase {
|
||||
|
||||
use FileSystemModuleDiscoveryDataProviderTrait;
|
||||
use CreateTestContentEntitiesTrait;
|
||||
use ContentModerationTestTrait;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function setUp() {
|
||||
// Enable all modules.
|
||||
self::$modules = array_keys($this->coreModuleListDataProvider());
|
||||
parent::setUp();
|
||||
|
||||
// Install required entity schemas.
|
||||
$this->installEntitySchemas();
|
||||
|
||||
// Install required schemas.
|
||||
$this->installSchema('book', ['book']);
|
||||
$this->installSchema('dblog', ['watchdog']);
|
||||
$this->installSchema('forum', ['forum_index']);
|
||||
$this->installSchema('node', ['node_access']);
|
||||
$this->installSchema('search', ['search_dataset']);
|
||||
$this->installSchema('system', ['sequences']);
|
||||
$this->installSchema('tracker', ['tracker_node', 'tracker_user']);
|
||||
|
||||
// Enable content moderation for nodes of type page.
|
||||
$this->installEntitySchema('content_moderation_state');
|
||||
$this->installConfig('content_moderation');
|
||||
NodeType::create(['type' => 'page'])->save();
|
||||
$workflow = $this->createEditorialWorkflow();
|
||||
$workflow->getTypePlugin()->addEntityTypeAndBundle('node', 'page');
|
||||
$workflow->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests multiple migrations to the same destination with no ID conflicts.
|
||||
*/
|
||||
public function testMultipleMigrationWithoutIdConflicts() {
|
||||
// Create a node of type page.
|
||||
$node = Node::create(['type' => 'page', 'title' => 'foo']);
|
||||
$node->moderation_state->value = 'published';
|
||||
$node->save();
|
||||
|
||||
// Insert data in the d7_node:page migration mapping table to simulate a
|
||||
// previously migrated node.
|
||||
$id_map = $this->getMigration('d7_node:page')->getIdMap();
|
||||
$table_name = $id_map->mapTableName();
|
||||
$id_map->getDatabase()->insert($table_name)
|
||||
->fields([
|
||||
'source_ids_hash' => 1,
|
||||
'sourceid1' => 1,
|
||||
'destid1' => 1,
|
||||
])
|
||||
->execute();
|
||||
|
||||
// Audit the IDs of the d7_node migrations for the page & article node type.
|
||||
// There should be no conflicts since the highest destination ID should be
|
||||
// equal to the highest migrated ID, as found in the aggregated mapping
|
||||
// tables of the two node migrations.
|
||||
$migrations = [
|
||||
$this->getMigration('d7_node:page'),
|
||||
$this->getMigration('d7_node:article'),
|
||||
];
|
||||
|
||||
$results = (new IdAuditor())->auditMultiple($migrations);
|
||||
/** @var \Drupal\migrate\Audit\AuditResult $result */
|
||||
foreach ($results as $result) {
|
||||
$this->assertInstanceOf(AuditResult::class, $result);
|
||||
$this->assertTrue($result->passed());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests all migrations with no ID conflicts.
|
||||
*/
|
||||
public function testAllMigrationsWithNoIdConflicts() {
|
||||
$migrations = $this->container
|
||||
->get('plugin.manager.migration')
|
||||
->createInstancesByTag('Drupal 7');
|
||||
|
||||
// Audit the IDs of all Drupal 7 migrations. There should be no conflicts
|
||||
// since no content has been created.
|
||||
$results = (new IdAuditor())->auditMultiple($migrations);
|
||||
/** @var \Drupal\migrate\Audit\AuditResult $result */
|
||||
foreach ($results as $result) {
|
||||
$this->assertInstanceOf(AuditResult::class, $result);
|
||||
$this->assertTrue($result->passed());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests all migrations with ID conflicts.
|
||||
*/
|
||||
public function testAllMigrationsWithIdConflicts() {
|
||||
$migrations = $this->container
|
||||
->get('plugin.manager.migration')
|
||||
->createInstancesByTag('Drupal 7');
|
||||
|
||||
// Create content.
|
||||
$this->createContent();
|
||||
|
||||
// Audit the IDs of all Drupal 7 migrations. There should be conflicts since
|
||||
// content has been created.
|
||||
$conflicts = array_map(
|
||||
function (AuditResult $result) {
|
||||
return $result->passed() ? NULL : $result->getMigration()->getBaseId();
|
||||
},
|
||||
(new IdAuditor())->auditMultiple($migrations)
|
||||
);
|
||||
|
||||
$expected = [
|
||||
'd7_aggregator_feed',
|
||||
'd7_aggregator_item',
|
||||
'd7_comment',
|
||||
'd7_custom_block',
|
||||
'd7_file',
|
||||
'd7_file_private',
|
||||
'd7_menu_links',
|
||||
'd7_node',
|
||||
'd7_node_revision',
|
||||
'd7_taxonomy_term',
|
||||
'd7_user',
|
||||
'node_translation_menu_links',
|
||||
];
|
||||
$this->assertEmpty(array_diff(array_filter($conflicts), $expected));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests draft revisions ID conflicts.
|
||||
*/
|
||||
public function testDraftRevisionIdConflicts() {
|
||||
// Create a published node of type page.
|
||||
$node = Node::create(['type' => 'page', 'title' => 'foo']);
|
||||
$node->moderation_state->value = 'published';
|
||||
$node->save();
|
||||
|
||||
// Create a draft revision.
|
||||
$node->moderation_state->value = 'draft';
|
||||
$node->setNewRevision(TRUE);
|
||||
$node->save();
|
||||
|
||||
// Insert data in the d7_node_revision:page migration mapping table to
|
||||
// simulate a previously migrated node revision.
|
||||
$id_map = $this->getMigration('d7_node_revision:page')->getIdMap();
|
||||
$table_name = $id_map->mapTableName();
|
||||
$id_map->getDatabase()->insert($table_name)
|
||||
->fields([
|
||||
'source_ids_hash' => 1,
|
||||
'sourceid1' => 1,
|
||||
'destid1' => 1,
|
||||
])
|
||||
->execute();
|
||||
|
||||
// Audit the IDs of the d7_node_revision migration. There should be
|
||||
// conflicts since a draft revision has been created.
|
||||
/** @var \Drupal\migrate\Audit\AuditResult $result */
|
||||
$result = (new IdAuditor())->audit($this->getMigration('d7_node_revision:page'));
|
||||
$this->assertInstanceOf(AuditResult::class, $result);
|
||||
$this->assertFalse($result->passed());
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests ID conflicts for inaccessible nodes.
|
||||
*/
|
||||
public function testNodeGrantsIdConflicts() {
|
||||
// Enable the node_test module to restrict access to page nodes.
|
||||
$this->enableModules(['node_test']);
|
||||
|
||||
// Create a published node of type page.
|
||||
$node = Node::create(['type' => 'page', 'title' => 'foo']);
|
||||
$node->moderation_state->value = 'published';
|
||||
$node->save();
|
||||
|
||||
// Audit the IDs of the d7_node migration. There should be conflicts
|
||||
// even though the new node is not accessible.
|
||||
/** @var \Drupal\migrate\Audit\AuditResult $result */
|
||||
$result = (new IdAuditor())->audit($this->getMigration('d7_node:page'));
|
||||
$this->assertInstanceOf(AuditResult::class, $result);
|
||||
$this->assertFalse($result->passed());
|
||||
}
|
||||
|
||||
}
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
namespace Drupal\Tests\migrate_drupal\Kernel\dependencies;
|
||||
|
||||
use Drupal\Component\Utility\SafeMarkup;
|
||||
use Drupal\Component\Render\FormattableMarkup;
|
||||
use Drupal\migrate\MigrateExecutable;
|
||||
use Drupal\Tests\migrate_drupal\Kernel\d6\MigrateDrupal6TestBase;
|
||||
|
||||
|
@ -67,7 +67,7 @@ class MigrateDependenciesTest extends MigrateDrupal6TestBase {
|
|||
$executable = new MigrateExecutable($migration, $this);
|
||||
$this->startCollectingMessages();
|
||||
$executable->import();
|
||||
$this->assertEqual($this->migrateMessages['error'], [SafeMarkup::format('Migration @id did not meet the requirements. Missing migrations d6_aggregator_feed. requirements: d6_aggregator_feed.', ['@id' => $migration->id()])]);
|
||||
$this->assertEqual($this->migrateMessages['error'], [new FormattableMarkup('Migration @id did not meet the requirements. Missing migrations d6_aggregator_feed. requirements: d6_aggregator_feed.', ['@id' => $migration->id()])]);
|
||||
$this->collectMessages = FALSE;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\migrate_drupal\Traits;
|
||||
|
||||
trait CreateMigrationsTrait {
|
||||
|
||||
/**
|
||||
* Create instances of all Drupal 6 migrations.
|
||||
*
|
||||
* @return \Drupal\migrate\Plugin\MigrationInterface[]
|
||||
* The migrations
|
||||
*/
|
||||
public function drupal6Migrations() {
|
||||
$dirs = \Drupal::service('module_handler')->getModuleDirectories();
|
||||
$migrate_drupal_directory = $dirs['migrate_drupal'];
|
||||
$this->loadFixture("$migrate_drupal_directory/tests/fixtures/drupal6.php");
|
||||
return \Drupal::service('plugin.manager.migration')->createInstancesByTag('Drupal 6');
|
||||
}
|
||||
|
||||
/**
|
||||
* Create instances of all Drupal 7 migrations.
|
||||
*
|
||||
* @return \Drupal\migrate\Plugin\MigrationInterface[]
|
||||
* The migrations
|
||||
*/
|
||||
public function drupal7Migrations() {
|
||||
$dirs = \Drupal::service('module_handler')->getModuleDirectories();
|
||||
$migrate_drupal_directory = $dirs['migrate_drupal'];
|
||||
$this->loadFixture("$migrate_drupal_directory/tests/fixtures/drupal7.php");
|
||||
return \Drupal::service('plugin.manager.migration')->createInstancesByTag('Drupal 7');
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,210 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\migrate_drupal\Traits;
|
||||
|
||||
/**
|
||||
* Provides helper methods for creating test content.
|
||||
*/
|
||||
trait CreateTestContentEntitiesTrait {
|
||||
|
||||
/**
|
||||
* Gets required modules.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getRequiredModules() {
|
||||
return [
|
||||
'aggregator',
|
||||
'block_content',
|
||||
'comment',
|
||||
'field',
|
||||
'file',
|
||||
'link',
|
||||
'menu_link_content',
|
||||
'migrate_drupal',
|
||||
'node',
|
||||
'options',
|
||||
'system',
|
||||
'taxonomy',
|
||||
'text',
|
||||
'user',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Install required entity schemas.
|
||||
*/
|
||||
protected function installEntitySchemas() {
|
||||
$this->installEntitySchema('aggregator_feed');
|
||||
$this->installEntitySchema('aggregator_item');
|
||||
$this->installEntitySchema('block_content');
|
||||
$this->installEntitySchema('comment');
|
||||
$this->installEntitySchema('file');
|
||||
$this->installEntitySchema('menu_link_content');
|
||||
$this->installEntitySchema('node');
|
||||
$this->installEntitySchema('taxonomy_term');
|
||||
$this->installEntitySchema('user');
|
||||
}
|
||||
|
||||
/**
|
||||
* Create several pieces of generic content.
|
||||
*/
|
||||
protected function createContent() {
|
||||
$entity_type_manager = \Drupal::entityTypeManager();
|
||||
|
||||
// Create an aggregator feed.
|
||||
if ($entity_type_manager->hasDefinition('aggregator_feed')) {
|
||||
$feed = $entity_type_manager->getStorage('aggregator_feed')->create([
|
||||
'title' => 'feed',
|
||||
'url' => 'http://www.example.com',
|
||||
]);
|
||||
$feed->save();
|
||||
|
||||
// Create an aggregator feed item.
|
||||
$item = $entity_type_manager->getStorage('aggregator_item')->create([
|
||||
'title' => 'feed item',
|
||||
'fid' => $feed->id(),
|
||||
'link' => 'http://www.example.com',
|
||||
]);
|
||||
$item->save();
|
||||
}
|
||||
|
||||
// Create a block content.
|
||||
if ($entity_type_manager->hasDefinition('block_content')) {
|
||||
$block = $entity_type_manager->getStorage('block_content')->create([
|
||||
'info' => 'block',
|
||||
'type' => 'block',
|
||||
]);
|
||||
$block->save();
|
||||
}
|
||||
|
||||
// Create a node.
|
||||
if ($entity_type_manager->hasDefinition('node')) {
|
||||
$node = $entity_type_manager->getStorage('node')->create([
|
||||
'type' => 'page',
|
||||
'title' => 'page',
|
||||
]);
|
||||
$node->save();
|
||||
|
||||
// Create a comment.
|
||||
if ($entity_type_manager->hasDefinition('comment')) {
|
||||
$comment = $entity_type_manager->getStorage('comment')->create([
|
||||
'comment_type' => 'comment',
|
||||
'field_name' => 'comment',
|
||||
'entity_type' => 'node',
|
||||
'entity_id' => $node->id(),
|
||||
]);
|
||||
$comment->save();
|
||||
}
|
||||
}
|
||||
|
||||
// Create a file.
|
||||
if ($entity_type_manager->hasDefinition('file')) {
|
||||
$file = $entity_type_manager->getStorage('file')->create([
|
||||
'uri' => 'public://example.txt',
|
||||
]);
|
||||
$file->save();
|
||||
}
|
||||
|
||||
// Create a menu link.
|
||||
if ($entity_type_manager->hasDefinition('menu_link_content')) {
|
||||
$menu_link = $entity_type_manager->getStorage('menu_link_content')->create([
|
||||
'title' => 'menu link',
|
||||
'link' => ['uri' => 'http://www.example.com'],
|
||||
'menu_name' => 'tools',
|
||||
]);
|
||||
$menu_link->save();
|
||||
}
|
||||
|
||||
// Create a taxonomy term.
|
||||
if ($entity_type_manager->hasDefinition('taxonomy_term')) {
|
||||
$term = $entity_type_manager->getStorage('taxonomy_term')->create([
|
||||
'name' => 'term',
|
||||
'vid' => 'term',
|
||||
]);
|
||||
$term->save();
|
||||
}
|
||||
|
||||
// Create a user.
|
||||
if ($entity_type_manager->hasDefinition('user')) {
|
||||
$user = $entity_type_manager->getStorage('user')->create([
|
||||
'name' => 'user',
|
||||
'mail' => 'user@example.com',
|
||||
]);
|
||||
$user->save();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create several pieces of generic content.
|
||||
*/
|
||||
protected function createContentPostUpgrade() {
|
||||
$entity_type_manager = \Drupal::entityTypeManager();
|
||||
|
||||
// Create a block content.
|
||||
if ($entity_type_manager->hasDefinition('block_content')) {
|
||||
$block = $entity_type_manager->getStorage('block_content')->create([
|
||||
'info' => 'Post upgrade block',
|
||||
'type' => 'block',
|
||||
]);
|
||||
$block->save();
|
||||
}
|
||||
|
||||
// Create a node.
|
||||
if ($entity_type_manager->hasDefinition('node')) {
|
||||
$node = $entity_type_manager->getStorage('node')->create([
|
||||
'type' => 'page',
|
||||
'title' => 'Post upgrade page',
|
||||
]);
|
||||
$node->save();
|
||||
|
||||
// Create a comment.
|
||||
if ($entity_type_manager->hasDefinition('comment')) {
|
||||
$comment = $entity_type_manager->getStorage('comment')->create([
|
||||
'comment_type' => 'comment',
|
||||
'field_name' => 'comment',
|
||||
'entity_type' => 'node',
|
||||
'entity_id' => $node->id(),
|
||||
]);
|
||||
$comment->save();
|
||||
}
|
||||
}
|
||||
|
||||
// Create a file.
|
||||
if ($entity_type_manager->hasDefinition('file')) {
|
||||
$file = $entity_type_manager->getStorage('file')->create([
|
||||
'uri' => 'public://post_upgrade_example.txt',
|
||||
]);
|
||||
$file->save();
|
||||
}
|
||||
|
||||
// Create a menu link.
|
||||
if ($entity_type_manager->hasDefinition('menu_link_content')) {
|
||||
$menu_link = $entity_type_manager->getStorage('menu_link_content')->create([
|
||||
'title' => 'post upgrade menu link',
|
||||
'link' => ['uri' => 'http://www.drupal.org'],
|
||||
'menu_name' => 'tools',
|
||||
]);
|
||||
$menu_link->save();
|
||||
}
|
||||
|
||||
// Create a taxonomy term.
|
||||
if ($entity_type_manager->hasDefinition('taxonomy_term')) {
|
||||
$term = $entity_type_manager->getStorage('taxonomy_term')->create([
|
||||
'name' => 'post upgrade term',
|
||||
'vid' => 'term',
|
||||
]);
|
||||
$term->save();
|
||||
}
|
||||
|
||||
// Create a user.
|
||||
if ($entity_type_manager->hasDefinition('user')) {
|
||||
$user = $entity_type_manager->getStorage('user')->create([
|
||||
'name' => 'universe',
|
||||
'mail' => 'universe@example.com',
|
||||
]);
|
||||
$user->save();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -43,7 +43,7 @@ class DrupalSqlBaseTest extends MigrateTestCase {
|
|||
*/
|
||||
public function testSourceProviderNotActive() {
|
||||
$plugin_definition['requirements_met'] = TRUE;
|
||||
$plugin_definition['source_provider'] = 'module1';
|
||||
$plugin_definition['source_module'] = 'module1';
|
||||
/** @var \Drupal\Core\State\StateInterface $state */
|
||||
$state = $this->getMock('Drupal\Core\State\StateInterface');
|
||||
/** @var \Drupal\Core\Entity\EntityManagerInterface $entity_manager */
|
||||
|
@ -57,7 +57,7 @@ class DrupalSqlBaseTest extends MigrateTestCase {
|
|||
}
|
||||
catch (RequirementsException $e) {
|
||||
// Ensure requirements are set on the exception.
|
||||
$this->assertEquals(['source_provider' => 'module1'], $e->getRequirements());
|
||||
$this->assertEquals(['source_module' => 'module1'], $e->getRequirements());
|
||||
// Re-throw so PHPUnit can assert the exception.
|
||||
throw $e;
|
||||
}
|
||||
|
|
|
@ -150,10 +150,10 @@ class TestDrupal6SqlBase extends DrupalSqlBase {
|
|||
'owner' => t("A theme's 'parent'. Can be either a theme or an engine."),
|
||||
'status' => t('Boolean indicating whether or not this item is enabled.'),
|
||||
'throttle' => t('Boolean indicating whether this item is disabled when the throttle.module disables throttleable items.'),
|
||||
'bootstrap' => t('Boolean indicating whether this module is loaded during Drupal\'s early bootstrapping phase (e.g. even before the page cache is consulted).'),
|
||||
'schema_version' => t('The module\'s database schema version number.'),
|
||||
'weight' => t('The order in which this module\'s hooks should be invoked.'),
|
||||
'info' => t('A serialized array containing information from the module\'s .info file.'),
|
||||
'bootstrap' => t("Boolean indicating whether this module is loaded during Drupal's early bootstrapping phase (e.g. even before the page cache is consulted)."),
|
||||
'schema_version' => t("The module's database schema version number."),
|
||||
'weight' => t("The order in which this module's hooks should be invoked."),
|
||||
'info' => t("A serialized array containing information from the module's .info file."),
|
||||
];
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,62 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\migrate_drupal\Unit\source\d6;
|
||||
|
||||
use Drupal\Tests\migrate\Unit\MigrateSqlSourceTestCase;
|
||||
|
||||
/**
|
||||
* Tests the variable source plugin.
|
||||
*
|
||||
* @group migrate_drupal
|
||||
* @group legacy
|
||||
*/
|
||||
class VariableTranslationTest extends MigrateSqlSourceTestCase {
|
||||
|
||||
// The plugin system is not working during unit testing so the source plugin
|
||||
// class needs to be manually specified.
|
||||
const PLUGIN_CLASS = 'Drupal\migrate_drupal\Plugin\migrate\source\d6\VariableTranslation';
|
||||
|
||||
/**
|
||||
* Define bare minimum migration configuration.
|
||||
*/
|
||||
protected $migrationConfiguration = [
|
||||
'id' => 'test',
|
||||
'highWaterProperty' => ['field' => 'test'],
|
||||
'source' => [
|
||||
'plugin' => 'variable_translation',
|
||||
'variables' => [
|
||||
'site_slogan',
|
||||
'site_name',
|
||||
],
|
||||
],
|
||||
];
|
||||
|
||||
/**
|
||||
* Expected results from the source.
|
||||
*/
|
||||
protected $expectedResults = [
|
||||
[
|
||||
'language' => 'fr',
|
||||
'site_slogan' => 'Migrate est génial',
|
||||
'site_name' => 'nom de site',
|
||||
],
|
||||
[
|
||||
'language' => 'mi',
|
||||
'site_slogan' => 'Ko whakamataku heke',
|
||||
'site_name' => 'ingoa_pae',
|
||||
],
|
||||
];
|
||||
|
||||
/**
|
||||
* Database contents for tests.
|
||||
*/
|
||||
protected $databaseContents = [
|
||||
'i18n_variable' => [
|
||||
['name' => 'site_slogan', 'language' => 'fr', 'value' => 's:19:"Migrate est génial";'],
|
||||
['name' => 'site_name', 'language' => 'fr', 'value' => 's:11:"nom de site";'],
|
||||
['name' => 'site_slogan', 'language' => 'mi', 'value' => 's:19:"Ko whakamataku heke";'],
|
||||
['name' => 'site_name', 'language' => 'mi', 'value' => 's:9:"ingoa_pae";'],
|
||||
],
|
||||
];
|
||||
|
||||
}
|
|
@ -8,6 +8,7 @@ use Drupal\Tests\migrate\Unit\MigrateSqlSourceTestCase;
|
|||
* Tests the variable source plugin.
|
||||
*
|
||||
* @group migrate_drupal
|
||||
* @group legacy
|
||||
*/
|
||||
class i18nVariableTest extends MigrateSqlSourceTestCase {
|
||||
|
||||
|
@ -43,7 +44,7 @@ class i18nVariableTest extends MigrateSqlSourceTestCase {
|
|||
'language' => 'mi',
|
||||
'site_slogan' => 'Ko whakamataku heke',
|
||||
'site_name' => 'ingoa_pae',
|
||||
]
|
||||
],
|
||||
];
|
||||
|
||||
/**
|
||||
|
|
Reference in a new issue