You are here

public function MigrationDataImport::__construct in CRM Core 7

General initialization of a Migration object.

Overrides Migration::__construct

File

modules/crm_core_data_import/includes/controllers/MigrationDataImport.inc, line 26
Handler for migration process.

Class

MigrationDataImport
@file Handler for migration process.

Code

public function __construct(array $arguments) {
  $this->arguments = $arguments;
  parent::__construct($arguments);
  $importer = $this
    ->getImporter();
  $entity_type = $this
    ->getEntityType();
  $entity_bundle = $this
    ->getEntityBundle();
  $delta = $this
    ->getDelta();

  // Set migrate source settings.
  $this->source = $importer
    ->migrateSource($entity_type, $entity_bundle);

  // Set migrate destination settings.
  $this->destination = $importer
    ->migrateDestination($entity_type, $entity_bundle, $delta);

  // Key schema.
  $this->map = new CRMCoreMigrateSQLMap($this->machineName, $importer
    ->migrateSourceMap($entity_type, $entity_bundle, $delta), $importer
    ->migrateDestinationMap($entity_type, $entity_bundle, $delta), 'default', array(
    'importer' => $importer,
    'entity_type' => $entity_type,
    'entity_bundle' => $entity_bundle,
    'delta' => $delta,
  ));

  // Get linked data imports.
  // If found, we will populate MigrateFieldMapping::sourceMigration later
  // to automatically pull already imported values.
  $linked_imports = $importer
    ->getLinkedImports();
  $source_migration = array();
  if ($linked_imports) {
    foreach ($linked_imports as $id => $field) {
      $linked_importer = crm_core_data_import_load_importer($id);
      $candidates = $linked_importer
        ->getMigrationInstances();
      foreach ($candidates as $m) {

        /** @var Migration $m */
        $source_keys = array_keys($m
          ->getMap()
          ->getSourceKey());
        if ($source_keys[0] == $field['destination']) {
          $source_migration[$field['destination']] = $m
            ->getMachineName();
        }
      }
    }
  }

  // Set mapping according to settings.
  $destination = $importer
    ->getDestinationsForEntity($this
    ->getEntityType(), $this
    ->getEntityBundle(), $this
    ->getDelta());
  $mapping = $importer
    ->getMappingSettings();
  if ($destination->entityType == $entity_type && $destination->bundle == $entity_bundle && !empty($mapping[$destination->controller . ':' . $destination->bundle . ':' . $delta])) {
    $this->fields_mapping = $mapping[$destination->controller . ':' . $destination->bundle . ':' . $delta];
    switch ($destination->entityType) {
      case 'user':

        // Separate handling for user entity.
        foreach ($this->fields_mapping as $key => $field) {
          if ($key !== 'primary' && !$this
            ->skipCollectionField($field) && !$this
            ->skipReferencesField($field)) {
            if ($field['destination_field'] == 'name') {
              $single_mapping = $this
                ->addFieldMapping($field['destination_field'], $field['source_field'])
                ->dedupe('users', 'name');
            }
            elseif ($field['destination_field'] == 'mail') {
              $single_mapping = $this
                ->addFieldMapping($field['destination_field'], $field['source_field'])
                ->dedupe('users', 'mail');
            }
            else {
              $single_mapping = $this
                ->addRegularFieldMapping($field);
            }

            // Add sourceMigration from linked import(s) if necessary
            if (!empty($source_migration[$field['source_field']])) {
              $single_mapping
                ->sourceMigration($source_migration[$field['source_field']]);
            }
          }
        }

        // Add status if not added in the configuration form.
        if (!array_key_exists('status', $this->codedFieldMappings)) {
          $this
            ->addFieldMapping('status')
            ->defaultValue(TRUE);
        }
        break;
      case 'crm_core_activity':

        // Separate handling for crm_core_activity entity.
        foreach ($this->fields_mapping as $key => $field) {
          if ($key !== 'primary' && !$this
            ->skipReferencesField($field)) {
            $single_mapping = $this
              ->addRegularFieldMapping($field);

            // Add sourceMigration from linked import(s) if necessary
            if (!empty($source_migration[$field['source_field']])) {
              $single_mapping
                ->sourceMigration($source_migration[$field['source_field']]);
            }
          }
        }

        // Add uid if not added in the configuration form.
        if (!array_key_exists('uid', $this->codedFieldMappings)) {
          $this
            ->addFieldMapping('uid')
            ->defaultValue(0);
        }
        break;
      default:
        foreach ($this->fields_mapping as $key => $field) {
          if ($key !== 'primary' && !$this
            ->skipCollectionField($field) && !$this
            ->skipReferencesField($field)) {
            $single_mapping = $this
              ->addRegularFieldMapping($field);

            // Add sourceMigration from linked import(s) if necessary
            if (!empty($source_migration[$field['source_field']])) {
              $single_mapping
                ->sourceMigration($source_migration[$field['source_field']]);
            }
          }

          // Collect names of the field collection fields.
          if ($this
            ->skipCollectionField($field)) {
            $main_field = $this
              ->getMainFieldName($field['destination_field']);
            $this->collection_items[] = $main_field;
          }
        }
        break;
    }
  }

  // Run preImport method in settings plugins.
  $importer_settings = $importer
    ->getSettings();
  if (!empty($importer_settings['settings_controllers'])) {
    foreach ($importer_settings['settings_controllers'] as $controller) {
      $settings_controller = crm_core_data_import_load_plugin_instance('crm_core_data_import_settings', $controller);
      if ($settings_controller) {
        $settings_controller
          ->preImport($importer, $this);
      }
    }
  }
  if (!empty($this->collection_items)) {
    $this->collection_items = array_unique($this->collection_items);
    $this
      ->buildFieldCollectionMapping();
  }
  drupal_alter('crm_core_data_import_migration', $this);
}