You are here

public function OrbitMediaFormatter::viewElements in ZURB Orbit 8

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 OrbitFormatter::viewElements

File

src/Plugin/Field/FieldFormatter/OrbitMediaFormatter.php, line 104

Class

OrbitMediaFormatter
Plugin implementation of the 'Orbit' formatter.

Namespace

Drupal\field_orbit\Plugin\Field\FieldFormatter

Code

public function viewElements(FieldItemListInterface $items, $langcode) {
  $elements = [];
  $images = [];
  $media_items = $this
    ->getEntitiesToView($items, $langcode);

  // Early opt-out if the field is empty.
  if (empty($media_items)) {
    return $elements;
  }

  // Initialize the list definition type to mock image field values.
  $list_definition = ListDataDefinition::create('field_item:image');

  /** @var \Drupal\Core\Field\FieldItemListInterface $items_list */
  $items_list = $this->typedDataManager
    ->create($list_definition);
  foreach ($media_items as $key => $item) {

    // Currently only image media bundles are supported.
    if ($item
      ->get('field_media_image')
      ->isEmpty()) {
      continue;
    }
    $image_item = $item
      ->get('field_media_image')
      ->first();

    // Add the file entity to the items list.
    $items_list
      ->appendItem($image_item
      ->getValue());

    // Store other values used by the template.
    $files[$key] = $image_item->entity;
    $images[$key] = [
      '#theme' => 'image_formatter',
      '#item' => $image_item,
      '#item_attributes' => [],
      '#image_style' => $this
        ->getSetting('image_style'),
      '#url' => Url::fromUri(file_create_url($image_item->entity
        ->get('uri')->value)),
    ];
  }
  static $orbit_count;
  $orbit_count = is_int($orbit_count) ? $orbit_count + 1 : 1;
  $entity = [];
  $item_settings = [];
  $links = [
    'image_link' => 'path',
    'caption_link' => 'caption_path',
  ];

  // Loop through required links (because image and
  // caption can have different links).
  foreach ($items_list as $delta => $item) {

    // Set Image caption.
    if ($this
      ->getSetting('caption') != '') {
      $caption_settings = $this
        ->getSetting('caption');
      if ($caption_settings == 'title') {
        $item_settings[$delta]['caption'] = $item
          ->getValue()['title'];
      }
      elseif ($caption_settings == 'alt') {
        $item_settings[$delta]['caption'] = $item
          ->getValue()['alt'];
      }
      $item
        ->set('caption', $item_settings[$delta]['caption']);
    }

    // Set Image and Caption Link.
    foreach ($links as $setting => $path) {
      if ($this
        ->getSetting($setting) != '') {
        switch ($this
          ->getSetting($setting)) {
          case 'content':
            $entity = $items[$delta]
              ->getEntity();
            if (!$entity
              ->isNew()) {
              $uri = $entity
                ->urlInfo();
              $uri = !empty($uri) ? $uri : '';
              $item
                ->set($path, $uri);
              $images[$delta]['#url'] = $uri;
            }
            break;
          case 'file':
            foreach ($files as $file_delta => $file) {
              $image_uri = $file
                ->getFileUri();
              $uri = Url::fromUri(file_create_url($image_uri));
              $uri = !empty($uri) ? $uri : '';
              $items_list[$file_delta]
                ->set($path, $uri);
            }
            break;
        }
      }
    }
  }
  $defaults = $this
    ->defaultSettings();
  if (count($items_list)) {

    // Only include non-default values to minimize html output.
    $options = [];
    foreach ($defaults as $key => $setting) {

      // Don't pass these to orbit.
      if ($key == 'caption_link' || $key == 'caption' || $key == 'image_style') {
        continue;
      }
      if ($this
        ->getSetting($key) != $setting) {
        $options[$key] = $this
          ->getSetting($key);
      }
    }
    $elements[] = [
      '#theme' => 'field_orbit',
      '#items' => $items_list,
      '#options' => $options,
      '#entity' => $entity,
      '#image' => $images,
      '#orbit_id' => $orbit_count,
    ];
  }
  return $elements;
}