You are here

public function ViewsFieldFormatter::viewElements in Views field formatter 8.2

Same name and namespace in other branches
  1. 8 src/Plugin/Field/FieldFormatter/ViewsFieldFormatter.php \Drupal\views_field_formatter\Plugin\Field\FieldFormatter\ViewsFieldFormatter::viewElements()

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/ViewsFieldFormatter.php, line 376

Class

ViewsFieldFormatter
Class ViewsFieldFormatter.

Namespace

Drupal\views_field_formatter\Plugin\Field\FieldFormatter

Code

public function viewElements(FieldItemListInterface $items, $langcode) {
  $elements = [];
  $settings = $this
    ->getSettings();
  if (isset($settings['view']) && !empty($settings['view']) && \strpos($settings['view'], '::') !== FALSE) {
    list($view_id, $view_display) = \explode('::', $settings['view'], 2);
  }
  else {
    return $elements;
  }

  // First check the availability of the view.
  $view = Views::getView($view_id);
  if (!$view || !$view
    ->access($view_display)) {
    return $elements;
  }
  $user_arguments = \array_filter((array) $this
    ->getSetting('arguments'), function ($argument) {
    return $argument['checked'];
  });

  /** @var \Drupal\Core\Entity\EntityInterface $entity */
  $entity = $items
    ->getParent()
    ->getValue();
  $token = \Drupal::token();
  $arguments = [];
  foreach ($user_arguments as $delta_argument => $item_argument) {
    foreach ($items as $delta_item => $item) {

      // This is temporary until we find a solution to get that same value
      // using a tokens.
      if ($item_argument['token'] === '%value%') {
        $columns = array_keys($items
          ->getFieldDefinition()
          ->getFieldStorageDefinition()
          ->getSchema()['columns']);
        $column = array_shift($columns);
        $arguments[$delta_argument][] = !empty($column) && isset($item
          ->getValue()[$column]) ? $item
          ->getValue()[$column] : NULL;
        continue;
      }
      $replacements = [
        $entity
          ->getEntityTypeId() => $entity,
        'entity' => $entity,
        'views_field_formatter' => [
          'delta' => $delta_item,
          'item' => $item,
          'items' => $items,
        ],
      ];
      switch ($this->fieldDefinition
        ->getTargetEntityTypeId()) {
        case 'taxonomy_term':
          $replacements['term'] = $entity;
          $replacements['vocabulary'] = Vocabulary::load($entity
            ->getVocabularyId());
          break;
      }
      $arguments[$delta_argument][] = $token
        ->replace($item_argument['token'], $replacements);
    }
  }
  if ((bool) $settings['multiple'] === TRUE) {
    foreach ($items as $delta => $item) {
      $viewArray = $this
        ->getViewArray($view, $view_display, \array_column($arguments, $delta), $settings);
      if ([] !== $viewArray) {
        $elements[$delta] = $viewArray;
      }
    }
  }
  else {
    foreach ($arguments as $delta_argument => $item_argument) {
      $arguments[$delta_argument] = \implode($settings['implode_character'], $arguments[$delta_argument]);
    }
    $viewArray = $this
      ->getViewArray($view, $view_display, $arguments, $settings);
    if ([] !== $viewArray) {
      $elements[0] = $viewArray;
    }
  }
  return $elements;
}