X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=web%2Fcore%2Fmodules%2Fmigrate%2Fsrc%2FPlugin%2Fmigrate%2Fdestination%2FEntityRevision.php;fp=web%2Fcore%2Fmodules%2Fmigrate%2Fsrc%2FPlugin%2Fmigrate%2Fdestination%2FEntityRevision.php;h=52d0f4fe1576ce557921b62020884d541b568abe;hp=b0db4769877cad453b186f5ffa6bfc5a4d0f5927;hb=af6d1fb995500ae68849458ee10d66abbdcfb252;hpb=680c79a86e3ed402f263faeac92e89fb6d9edcc0 diff --git a/web/core/modules/migrate/src/Plugin/migrate/destination/EntityRevision.php b/web/core/modules/migrate/src/Plugin/migrate/destination/EntityRevision.php index b0db47698..52d0f4fe1 100644 --- a/web/core/modules/migrate/src/Plugin/migrate/destination/EntityRevision.php +++ b/web/core/modules/migrate/src/Plugin/migrate/destination/EntityRevision.php @@ -3,12 +3,107 @@ namespace Drupal\migrate\Plugin\migrate\destination; use Drupal\Core\Entity\ContentEntityInterface; +use Drupal\Core\Entity\EntityManagerInterface; +use Drupal\Core\Entity\EntityStorageInterface; +use Drupal\Core\Field\FieldTypePluginManagerInterface; +use Drupal\Core\StringTranslation\TranslatableMarkup; use Drupal\migrate\MigrateException; +use Drupal\migrate\Plugin\MigrationInterface; use Drupal\migrate\Row; /** * 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. + * @code + * 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: '

Current content

' + * 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 + * @endcode + * + * Example of the corresponding node revision migration, which must be executed + * after the above migration. + * @code + * 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: '

Previous content

' + * 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 + * @endcode + * * @MigrateDestination( * id = "entity_revision", * deriver = "Drupal\migrate\Plugin\Derivative\MigrateEntityRevision" @@ -16,6 +111,16 @@ use Drupal\migrate\Row; */ class EntityRevision extends EntityContentBase { + /** + * {@inheritdoc} + */ + public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, EntityStorageInterface $storage, array $bundles, EntityManagerInterface $entity_manager, FieldTypePluginManagerInterface $field_type_manager) { + $plugin_definition += [ + 'label' => new TranslatableMarkup('@entity_type revisions', ['@entity_type' => $storage->getEntityType()->getSingularLabel()]), + ]; + parent::__construct($configuration, $plugin_id, $plugin_definition, $migration, $storage, $bundles, $entity_manager, $field_type_manager); + } + /** * {@inheritdoc} */ @@ -78,4 +183,19 @@ class EntityRevision extends EntityContentBase { throw new MigrateException('This entity type does not support revisions.'); } + /** + * {@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); + } + }