You are here

public function ImageHotspotsFormatter::viewElements in Image Hotspots 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 ImageFormatter::viewElements

File

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

Class

ImageHotspotsFormatter
Plugin implementation of the 'image_with_hotspots' formatter.

Namespace

Drupal\image_hotspots\Plugin\Field\FieldFormatter

Code

public function viewElements(FieldItemListInterface $items, $langcode) {
  $elements = parent::viewElements($items, $langcode);
  $image_hotspots_style = $this
    ->getSetting('image_hotspots_style');
  $image_style = !empty($this
    ->getSetting('image_style')) ? $this
    ->getSetting('image_style') : 'none';
  $field_name = $items
    ->getName();
  $files = $this
    ->getEntitiesToView($items, $langcode);
  $info = [
    'field_name' => $field_name,
    'image_style' => $image_style,
  ];
  $default_lang = $this->languageManager
    ->getDefaultLanguage()
    ->getId();

  /** @var \Drupal\file\FileInterface $file */
  foreach ($files as $delta => $file) {
    $info['fid'] = $file
      ->id();
    $hotspots = ImageHotspot::loadByTarget($info);

    // Get translations if they exist.
    if ($langcode != $default_lang) {
      foreach ($hotspots as $hid => $hotspot) {
        if ($hotspot
          ->hasTranslation($langcode)) {
          $hotspots[$hid] = $hotspot
            ->getTranslation($langcode);
        }
      }
    }
    $editable = FALSE;
    $translatable = FALSE;

    // Load library for edit hotspots if user in permission.
    if ($this->currentUser
      ->hasPermission('edit image hotspots')) {
      $editable = TRUE;

      // Only allow translation if the editor is not viewing the default lang.
      if ($langcode != $default_lang) {
        $translatable = TRUE;
        $elements[$delta]['#attached']['library'][] = 'image_hotspots/translate';
      }
      else {
        $elements[$delta]['#attached']['library'][] = 'image_hotspots/edit';
      }
    }

    // Attach hotspots data to js settings.

    /** @var \Drupal\image_hotspots\Entity\ImageHotspot $hotspot */
    $hotspots_to_show = [];
    foreach ($hotspots as $hid => $hotspot) {
      $title = $hotspot
        ->getTitle();
      $description = $hotspot
        ->getDescription();
      $link = $hotspot
        ->getLink();
      $target = $hotspot
        ->getTargetLink();
      $value = [
        'title' => $title,
        'description' => !is_null($description) ? $description : '',
        'link' => !is_null($link) ? $link : '',
        'target' => !is_null($target) ? $target : '',
      ];
      foreach ($hotspot
        ->getCoordinates() as $coordinate => $val) {
        $value[$coordinate] = $val;
      }
      $hotspots_to_show[$hid] = $value;
    }

    // Add cache tag 'hotspots:field_name:fid:image_style'.
    $elements[$delta]['#cache']['tags'][] = 'hotspots:' . $info['field_name'] . ':' . $info['fid'] . ':' . $info['image_style'];

    // Attache libraries.
    $elements[$delta]['#attached']['drupalSettings']['image_hotspots'][$field_name][$file
      ->id()][$image_style][$image_hotspots_style][$langcode]['hotspots'] = $hotspots_to_show;
    $elements[$delta]['#attached']['library'][] = 'image_hotspots/view';
    $elements[$delta]['#attached']['library'][] = 'core/drupal.dialog.ajax';

    // Change element theme from 'image_formatter'.
    $elements[$delta]['#theme'] = 'image_formatter_with_hotspots';

    // Add additional info for render.
    $elements[$delta]['#info'] = $info;
    $elements[$delta]['#info']['hotspots_style'] = $image_hotspots_style;
    $elements[$delta]['#info']['langcode'] = $langcode;
    $elements[$delta]['#info']['editable'] = $editable;
    $elements[$delta]['#info']['translatable'] = $translatable;
  }
  return $elements;
}