You are here

public function ViewfieldFormatterDefault::viewElements in Viewfield 8.3

Builds a renderable array for a field value.

Parameters

\Drupal\Core\Field\FieldItemListInterface $items: The field values to be rendered.

string $langcode: The language that should be used to render the field.

Return value

array A renderable array for $items, as an array of child elements keyed by consecutive numeric indexes starting from 0.

Overrides FormatterInterface::viewElements

File

src/Plugin/Field/FieldFormatter/ViewfieldFormatterDefault.php, line 112

Class

ViewfieldFormatterDefault
Viewfield Default Formatter plugin definition.

Namespace

Drupal\viewfield\Plugin\Field\FieldFormatter

Code

public function viewElements(FieldItemListInterface $items, $langcode) {
  $entity = $items
    ->getEntity();
  if ($this
    ->getFieldSetting('force_default')) {
    $values = $this->fieldDefinition
      ->getDefaultValue($entity);
  }
  else {
    $values = [];
    foreach ($items as $delta => $item) {
      $values[$delta] = $item
        ->getValue();
    }
  }
  $elements = [];
  $cacheability = new CacheableMetadata();
  $always_build_output = $this
    ->getSetting('always_build_output');
  $view_title = $this
    ->getSetting('view_title');
  $empty_view_title = $this
    ->getSetting('empty_view_title');
  foreach ($values as $delta => $value) {
    if (!empty($value['target_id']) && !empty($value['display_id'])) {
      $target_id = $value['target_id'];
      $display_id = $value['display_id'];
      $items_to_display = $value['items_to_display'];
      if (!empty($value['arguments'])) {
        $arguments = $this
          ->processArguments($value['arguments'], $entity);
      }
      else {
        $arguments = [];
      }

      // @see views_embed_view()
      // @see views_get_view_result()
      $view = Views::getView($target_id);
      if (!$view || !$view
        ->access($display_id)) {
        continue;
      }

      // Set arguments if they exist
      if (!empty($arguments)) {
        $view
          ->setArguments($arguments);
      }
      $view
        ->setDisplay($display_id);

      // Override items to display if set.
      if (!empty($items_to_display)) {
        $view
          ->setItemsPerPage($items_to_display);
      }
      $view
        ->preExecute();
      $view
        ->execute();

      // Disable pager, if items_to_display was set.
      if (!empty($items_to_display)) {
        $view->pager = new \Drupal\views\Plugin\views\pager\None([], '', []);
        $view->pager
          ->init($view, $view->display_handler);
        $view->pager
          ->setItemsPerPage($items_to_display);
      }
      $rendered_view = $view
        ->buildRenderable($display_id, $arguments);

      // Get cache metadata from view and merge.
      $view_cacheability = CacheableMetadata::createFromRenderArray($view->element);
      $cacheability = $cacheability
        ->merge($view_cacheability);
      if (!empty($view->result) || $always_build_output) {
        $elements[$delta] = [
          '#theme' => 'viewfield_item',
          '#content' => $rendered_view,
          '#title' => $view
            ->getTitle(),
          '#label_display' => empty($view->result) ? $empty_view_title : $view_title,
          '#delta' => $delta,
          '#field_name' => $this->fieldDefinition
            ->getName(),
          '#view_id' => $target_id,
          '#display_id' => $display_id,
        ];

        // Add arguments to view cache keys to allow multiple viewfields with
        // same view but different arguments per page.
        $cache_keys = array_merge($rendered_view['#cache']['keys'], $arguments);
        $elements[$delta]['#content']['#cache']['keys'] = $cache_keys;
      }
    }
  }

  // Apply merged cache metadata to $elements.
  $cacheability
    ->applyTo($elements);
  return $elements;
}