You are here

public function MigrationImportSync::sync in Migrate Tools 8.5

Same name and namespace in other branches
  1. 8.4 src/EventSubscriber/MigrationImportSync.php \Drupal\migrate_tools\EventSubscriber\MigrationImportSync::sync()

Event callback to sync source and destination.

Parameters

\Drupal\migrate\Event\MigrateImportEvent $event: The migration import event.

File

src/EventSubscriber/MigrationImportSync.php, line 51

Class

MigrationImportSync
Import and sync source and destination.

Namespace

Drupal\migrate_tools\EventSubscriber

Code

public function sync(MigrateImportEvent $event) {
  $migration = $event
    ->getMigration();
  if (!empty($migration->syncSource)) {
    $id_map = $migration
      ->getIdMap();
    $id_map
      ->prepareUpdate();

    // Clone so that any generators aren't initialized prematurely.
    $source = clone $migration
      ->getSourcePlugin();
    $source
      ->rewind();
    $source_id_values = [];
    while ($source
      ->valid()) {
      $source_id_values[] = $source
        ->current()
        ->getSourceIdValues();
      $source
        ->next();
    }
    $id_map
      ->rewind();
    $destination = $migration
      ->getDestinationPlugin();
    while ($id_map
      ->valid()) {
      $map_source_id = $id_map
        ->currentSource();
      if (!in_array($map_source_id, $source_id_values, TRUE)) {
        $destination_ids = $id_map
          ->currentDestination();
        $this
          ->dispatchRowDeleteEvent(MigrateEvents::PRE_ROW_DELETE, $migration, $destination_ids);
        $this
          ->dispatchRowDeleteEvent(MigratePlusEvents::MISSING_SOURCE_ITEM, $migration, $destination_ids);
        $destination
          ->rollback($destination_ids);
        $this
          ->dispatchRowDeleteEvent(MigrateEvents::POST_ROW_DELETE, $migration, $destination_ids);
        $id_map
          ->delete($map_source_id);
      }
      $id_map
        ->next();
    }
    $this->dispatcher
      ->dispatch(MigrateEvents::POST_ROLLBACK, new MigrateRollbackEvent($migration));
  }
}