function EntityReferenceTranslationDeriver::getDerivativeDefinitions

Same name and namespace in other branches
  1. 9 core/modules/migrate_drupal/src/Plugin/migrate/EntityReferenceTranslationDeriver.php \Drupal\migrate_drupal\Plugin\migrate\EntityReferenceTranslationDeriver::getDerivativeDefinitions()
  2. 8.9.x core/modules/migrate_drupal/src/Plugin/migrate/EntityReferenceTranslationDeriver.php \Drupal\migrate_drupal\Plugin\migrate\EntityReferenceTranslationDeriver::getDerivativeDefinitions()
  3. 11.x core/modules/migrate_drupal/src/Plugin/migrate/EntityReferenceTranslationDeriver.php \Drupal\migrate_drupal\Plugin\migrate\EntityReferenceTranslationDeriver::getDerivativeDefinitions()

Overrides DeriverBase::getDerivativeDefinitions

File

core/modules/migrate_drupal/src/Plugin/migrate/EntityReferenceTranslationDeriver.php, line 93

Class

EntityReferenceTranslationDeriver
Deriver for entity reference field translations.

Namespace

Drupal\migrate_drupal\Plugin\migrate

Code

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' => [
            'translation_target_id' => [
              [
                'plugin' => 'migration_lookup',
                'source' => 'target_id',
                'migration' => $base_plugin_definition['target_types'][$target_type],
                'no_stub' => TRUE,
              ],
              [
                'plugin' => 'skip_on_empty',
                'method' => 'process',
              ],
              [
                'plugin' => 'extract',
                'index' => [
                  0,
                ],
              ],
            ],
            'target_id' => [
              [
                'plugin' => 'null_coalesce',
                'source' => [
                  '@translation_target_id',
                  'target_id',
                ],
              ],
            ],
          ],
        ];
        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 add it to
          // overwrite_properties so it can be overwritten.
          $this->derivatives[$derivative_key]['process'] += $derivative['process'];
          $this->derivatives[$derivative_key]['destination']['overwrite_properties'] += $derivative['destination']['overwrite_properties'];
        }
      }
    }
  }
  return $this->derivatives;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.