class EntityRevision in Drupal 10
Same name in this branch
- 10 core/modules/migrate/tests/src/Unit/destination/EntityRevisionTest.php \Drupal\Tests\migrate\Unit\destination\EntityRevision
- 10 core/modules/migrate/src/Plugin/migrate/destination/EntityRevision.php \Drupal\migrate\Plugin\migrate\destination\EntityRevision
Same name and namespace in other branches
- 8 core/modules/migrate/src/Plugin/migrate/destination/EntityRevision.php \Drupal\migrate\Plugin\migrate\destination\EntityRevision
- 9 core/modules/migrate/src/Plugin/migrate/destination/EntityRevision.php \Drupal\migrate\Plugin\migrate\destination\EntityRevision
Provides entity revision destination plugin.
Refer to the parent class for configuration keys: \Drupal\migrate\Plugin\migrate\destination\EntityContentBase
Entity revisions can only be migrated after the entity to which the revisions belong has been migrated. For example, revisions of a given content type can be migrated only after the nodes of that content type have been migrated.
In order to avoid revision ID conflicts, make sure that the entity migration also includes the revision ID. If the entity migration did not include the revision ID, the entity would get the next available revision ID (1 when migrating to a clean database). Then, when revisions are migrated after the entities, the revision IDs would almost certainly collide.
The examples below contain simple node and node revision migrations. The examples use the EmbeddedDataSource source plugin for the sake of simplicity. The important part of both examples is the 'vid' property, which is the revision ID for nodes.
Example of 'article' node migration, which must be executed before the 'article' revisions.
id: custom_article_migration
label: 'Custom article migration'
source:
plugin: embedded_data
data_rows:
-
nid: 1
vid: 2
revision_timestamp: 1514661000
revision_log: 'Second revision'
title: 'Current title'
content: '<p>Current content</p>'
ids:
nid:
type: integer
process:
nid: nid
vid: vid
revision_timestamp: revision_timestamp
revision_log: revision_log
title: title
'body/0/value': content
'body/0/format':
plugin: default_value
default_value: basic_html
destination:
plugin: entity:node
default_bundle: article
Example of the corresponding node revision migration, which must be executed after the above migration.
id: custom_article_revision_migration
label: 'Custom article revision migration'
source:
plugin: embedded_data
data_rows:
-
nid: 1
vid: 1
revision_timestamp: 1514660000
revision_log: 'First revision'
title: 'Previous title'
content: '<p>Previous content</p>'
ids:
nid:
type: integer
process:
nid:
plugin: migration_lookup
migration: custom_article_migration
source: nid
vid: vid
revision_timestamp: revision_timestamp
revision_log: revision_log
title: title
'body/0/value': content
'body/0/format':
plugin: default_value
default_value: basic_html
destination:
plugin: entity_revision:node
default_bundle: article
migration_dependencies:
required:
- custom_article_migration
Plugin annotation
@MigrateDestination(
id = "entity_revision",
deriver = "Drupal\migrate\Plugin\Derivative\MigrateEntityRevision"
)
Hierarchy
- class \Drupal\Component\Plugin\PluginBase implements DerivativeInspectionInterface, PluginInspectionInterface
- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait
- class \Drupal\migrate\Plugin\migrate\destination\DestinationBase implements MigrateDestinationInterface, RequirementsInterface
- class \Drupal\migrate\Plugin\migrate\destination\Entity implements DependentPluginInterface, ContainerFactoryPluginInterface uses DependencyTrait, EntityFieldDefinitionTrait
- class \Drupal\migrate\Plugin\migrate\destination\EntityContentBase implements HighestIdInterface, MigrateValidatableEntityInterface
- class \Drupal\migrate\Plugin\migrate\destination\EntityRevision
- class \Drupal\migrate\Plugin\migrate\destination\EntityContentBase implements HighestIdInterface, MigrateValidatableEntityInterface
- class \Drupal\migrate\Plugin\migrate\destination\Entity implements DependentPluginInterface, ContainerFactoryPluginInterface uses DependencyTrait, EntityFieldDefinitionTrait
- class \Drupal\migrate\Plugin\migrate\destination\DestinationBase implements MigrateDestinationInterface, RequirementsInterface
- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait
Expanded class hierarchy of EntityRevision
2 files declare their use of EntityRevision
- EntityRevisionTest.php in core/
modules/ migrate/ tests/ src/ Unit/ destination/ EntityRevisionTest.php - Contains \Drupal\Tests\migrate\Unit\destination\EntityRevisionTest.
- EntityRevisionTest.php in core/
modules/ migrate/ tests/ src/ Unit/ Plugin/ migrate/ destination/ EntityRevisionTest.php
File
- core/
modules/ migrate/ src/ Plugin/ migrate/ destination/ EntityRevision.php, line 113
Namespace
Drupal\migrate\Plugin\migrate\destinationView source
class EntityRevision extends EntityContentBase {
/**
* {@inheritdoc}
*/
public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, EntityStorageInterface $storage, array $bundles, EntityFieldManagerInterface $entity_field_manager, FieldTypePluginManagerInterface $field_type_manager, AccountSwitcherInterface $account_switcher) {
$plugin_definition += [
'label' => new TranslatableMarkup('@entity_type revisions', [
'@entity_type' => $storage
->getEntityType()
->getSingularLabel(),
]),
];
parent::__construct($configuration, $plugin_id, $plugin_definition, $migration, $storage, $bundles, $entity_field_manager, $field_type_manager, $account_switcher);
}
/**
* Gets the entity.
*
* @param \Drupal\migrate\Row $row
* The row object.
* @param array $old_destination_id_values
* The old destination IDs.
*
* @return \Drupal\Core\Entity\EntityInterface|false
* The entity or false if it can not be created.
*/
protected function getEntity(Row $row, array $old_destination_id_values) {
$revision_id = $old_destination_id_values ? reset($old_destination_id_values) : $row
->getDestinationProperty($this
->getKey('revision'));
if (!empty($revision_id) && ($entity = $this->storage
->loadRevision($revision_id))) {
$entity
->setNewRevision(FALSE);
}
else {
$entity_id = $row
->getDestinationProperty($this
->getKey('id'));
$entity = $this->storage
->load($entity_id);
// If we fail to load the original entity something is wrong and we need
// to return immediately.
if (!$entity) {
return FALSE;
}
$entity
->enforceIsNew(FALSE);
$entity
->setNewRevision(TRUE);
}
// We need to update the entity, so that the destination row IDs are
// correct.
$entity = $this
->updateEntity($entity, $row);
$entity
->isDefaultRevision(FALSE);
return $entity;
}
/**
* {@inheritdoc}
*/
protected function save(ContentEntityInterface $entity, array $old_destination_id_values = []) {
$entity
->save();
return [
$entity
->getRevisionId(),
];
}
/**
* {@inheritdoc}
*/
public function getIds() {
$ids = [];
$revision_key = $this
->getKey('revision');
if (!$revision_key) {
throw new MigrateException(sprintf('The "%s" entity type does not support revisions.', $this->storage
->getEntityTypeId()));
}
$ids[$revision_key] = $this
->getDefinitionFromEntity($revision_key);
if ($this
->isTranslationDestination()) {
$langcode_key = $this
->getKey('langcode');
if (!$langcode_key) {
throw new MigrateException(sprintf('The "%s" entity type does not support translations.', $this->storage
->getEntityTypeId()));
}
$ids[$langcode_key] = $this
->getDefinitionFromEntity($langcode_key);
}
return $ids;
}
/**
* {@inheritdoc}
*/
public function getHighestId() {
$values = $this->storage
->getQuery()
->accessCheck(FALSE)
->allRevisions()
->sort($this
->getKey('revision'), 'DESC')
->range(0, 1)
->execute();
// The array keys are the revision IDs.
// The array contains only one entry, so we can use key().
return (int) key($values);
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
DependencySerializationTrait:: |
protected | property | ||
DependencySerializationTrait:: |
protected | property | ||
DependencySerializationTrait:: |
public | function | 2 | |
DependencySerializationTrait:: |
public | function | 2 | |
DependencyTrait:: |
protected | property | The object's dependencies. | |
DependencyTrait:: |
protected | function | Adds multiple dependencies. | |
DependencyTrait:: |
protected | function | Adds a dependency. | |
DestinationBase:: |
protected | property | The migration. | |
DestinationBase:: |
protected | property | The rollback action to be saved for the last imported item. | |
DestinationBase:: |
protected | property | Indicates whether the destination can be rolled back. | |
DestinationBase:: |
public | function |
Checks if requirements for this plugin are OK. Overrides RequirementsInterface:: |
|
DestinationBase:: |
public | function |
Gets the destination module handling the destination data. Overrides MigrateDestinationInterface:: |
1 |
DestinationBase:: |
public | function |
The rollback action for the last imported item. Overrides MigrateDestinationInterface:: |
|
DestinationBase:: |
protected | function | For a destination item being updated, set the appropriate rollback action. | |
DestinationBase:: |
public | function |
Whether the destination can be rolled back or not. Overrides MigrateDestinationInterface:: |
|
Entity:: |
protected | property | The list of the bundles of this entity type. | |
Entity:: |
protected | property | The entity storage. | |
Entity:: |
public | function |
Calculates dependencies for the configured plugin. Overrides DependentPluginInterface:: |
|
Entity:: |
public | function |
Returns an array of destination fields. Overrides MigrateDestinationInterface:: |
|
Entity:: |
public | function | Gets the bundle for the row taking into account the default. | |
Entity:: |
protected | function | Gets the entity ID of the row. | 2 |
Entity:: |
protected | function | Returns a specific entity key. | |
EntityContentBase:: |
protected | property | The account switcher service. | |
EntityContentBase:: |
protected | property | Entity field manager. | |
EntityContentBase:: |
protected | property | Field type plugin manager. | |
EntityContentBase:: |
public static | function |
Creates an instance of the plugin. Overrides Entity:: |
2 |
EntityContentBase:: |
public | function |
Overrides MigrateDestinationInterface:: |
2 |
EntityContentBase:: |
public | function |
Returns a state of whether an entity needs to be validated before saving. Overrides MigrateValidatableEntityInterface:: |
|
EntityContentBase:: |
public | function | ||
EntityContentBase:: |
protected | function | Populates as much of the stub row as possible. | 3 |
EntityContentBase:: |
public | function |
Delete the specified destination object from the target Drupal. Overrides Entity:: |
1 |
EntityContentBase:: |
protected | function | Updates an entity with the new values from row. | 3 |
EntityContentBase:: |
public | function |
Validates the entity. Overrides MigrateValidatableEntityInterface:: |
|
EntityFieldDefinitionTrait:: |
protected | function | Gets the field definition from a specific entity base field. | |
EntityFieldDefinitionTrait:: |
protected static | function | Finds the entity type from configuration or plugin ID. | 3 |
EntityRevision:: |
protected | function |
Gets the entity. Overrides Entity:: |
2 |
EntityRevision:: |
public | function |
Returns the highest ID tracked by the implementing plugin. Overrides EntityContentBase:: |
|
EntityRevision:: |
public | function |
Gets the destination IDs. Overrides EntityContentBase:: |
|
EntityRevision:: |
protected | function |
Saves the entity. Overrides EntityContentBase:: |
1 |
EntityRevision:: |
public | function |
Constructs a content entity. Overrides EntityContentBase:: |
|
MessengerTrait:: |
protected | property | The messenger. | 18 |
MessengerTrait:: |
public | function | Gets the messenger. | 18 |
MessengerTrait:: |
public | function | Sets the messenger. | |
PluginBase:: |
protected | property | Configuration information passed into the plugin. | 1 |
PluginBase:: |
protected | property | The plugin implementation definition. | |
PluginBase:: |
protected | property | The plugin_id. | |
PluginBase:: |
constant | A string which is used to separate base plugin IDs from the derivative ID. | ||
PluginBase:: |
public | function | ||
PluginBase:: |
public | function | ||
PluginBase:: |
public | function | 2 | |
PluginBase:: |
public | function | ||
PluginBase:: |
public | function | Determines if the plugin is configurable. | |
StringTranslationTrait:: |
protected | property | The string translation service. | 3 |
StringTranslationTrait:: |
protected | function | Formats a string containing a count of items. | |
StringTranslationTrait:: |
protected | function | Returns the number of plurals supported by a given language. | |
StringTranslationTrait:: |
protected | function | Gets the string translation service. | |
StringTranslationTrait:: |
public | function | Sets the string translation service to use. | 1 |
StringTranslationTrait:: |
protected | function | Translates a string to the current language or to a given language. |