You are here

public function BlockField::getTargetEntities in Entity Usage 8.3

Same name and namespace in other branches
  1. 8.2 src/Plugin/EntityUsage/Track/BlockField.php \Drupal\entity_usage\Plugin\EntityUsage\Track\BlockField::getTargetEntities()

Retrieve the target entity(ies) from a field item value.

Parameters

\Drupal\Core\Field\FieldItemInterface $item: The field item to get the target entity(ies) from.

Return value

string[] An indexed array of strings where each target entity type and ID are concatenated with a "|" character. Will return an empty array if no target entity could be retrieved from the received field item value.

Overrides EntityUsageTrackInterface::getTargetEntities

File

src/Plugin/EntityUsage/Track/BlockField.php, line 25

Class

BlockField
Tracks usage of entities related in block_field fields.

Namespace

Drupal\entity_usage\Plugin\EntityUsage\Track

Code

public function getTargetEntities(FieldItemInterface $item) {

  /** @var \Drupal\block_field\BlockFieldItemInterface $item */
  $block_instance = $item
    ->getBlock();
  if (!$block_instance) {
    return [];
  }
  $target_type = NULL;
  $target_id = NULL;

  // If there is a view inside this block, track the view entity instead.
  if ($block_instance
    ->getBaseId() === 'views_block') {
    list($view_name, $display_id) = explode('-', $block_instance
      ->getDerivativeId(), 2);

    // @todo worth trying to track the display id as well?
    // At this point the view is supposed to exist. Only track it if so.
    if ($this->entityTypeManager
      ->getStorage('view')
      ->load($view_name)) {
      $target_type = 'view';
      $target_id = $view_name;
    }
  }
  elseif ($block_instance instanceof BlockContentBlock && ($uuid = $block_instance
    ->getDerivativeId())) {
    $blocks = $this->entityTypeManager
      ->getStorage('block_content')
      ->loadByProperties([
      'uuid' => $uuid,
    ]);
    if (!empty($blocks)) {

      // Doing this here means that an initial save operation of a host entity
      // will likely not track this block, once it does not exist at this
      // point. However, it's preferable to miss that and ensure we only track
      // lodable entities.
      $block = reset($blocks);
      $target_id = $block
        ->id();
      $target_type = 'block_content';
    }
  }
  elseif ($block_instance instanceof BlockPluginInterface && !$block_instance instanceof BlockContentBlock) {
    $target_id = $block_instance
      ->getPluginId();
    $target_type = 'block';
  }
  else {
    throw new \Exception('Block saved as target entity is not one of the trackable block types.');
  }
  return $target_type && $target_id ? [
    $target_type . '|' . $target_id,
  ] : [];
}