You are here

function feeds_para_mapper_feeds_targets_alter in Feeds Paragraphs 8

Implements hook_feeds_targets_alter().

Parameters

\Drupal\feeds\FieldTargetDefinition[] $targets:

File

./feeds_para_mapper.module, line 54
Allows mapping to Paragraphs fields.

Code

function feeds_para_mapper_feeds_targets_alter(&$targets) {

  // Collect Paragraphs fields targets to remove from mappings:
  $toRemove = [];
  foreach ($targets as $name => $target) {
    if ($target
      ->getPluginId() === "paragraphs") {
      $field = $target
        ->getFieldDefinition();
      if (!isset($field->fpm_removed)) {
        $toRemove[] = $target;
      }
    }
  }
  if (empty($toRemove)) {
    return;
  }

  // Search for the feed type that contains the above Paragraphs targets:
  $entityTypeManager = Drupal::service('entity_type.manager');
  $storage = $entityTypeManager
    ->getStorage('feeds_feed_type');
  $feedTypes = $storage
    ->loadMultiple();
  $firstTarget = $toRemove[0];
  $feedType = array_filter($feedTypes, function ($item) use ($firstTarget) {
    $mappings = $item
      ->getMappings();
    foreach ($mappings as $mapping) {
      if ($mapping['target'] === $firstTarget
        ->getFieldDefinition()
        ->getName()) {
        return $item;
      }
    }
    return false;
  });
  $feedType = reset($feedType);
  if (!$feedType) {
    return;
  }

  // Remove the default Paragraphs mapping:
  $mappings = $feedType
    ->getMappings();
  $changed = false;
  foreach ($toRemove as $target) {
    $field = $target
      ->getFieldDefinition();
    foreach ($mappings as $delta => $mapping) {
      if ($mapping['target'] === $field
        ->getName()) {
        $feedType
          ->removeMapping($delta);
        $changed = true;
        $field->fpm_removed = TRUE;
      }
    }
  }
  if ($changed) {
    $messenger = Drupal::messenger();
    $messenger
      ->addWarning(t('Mapping has been updated, please refresh the page.'));
    $feedType
      ->save();
  }
}