You are here

trait BlazyFormatterTrait in Blazy 8

Same name and namespace in other branches
  1. 8.2 src/Plugin/Field/FieldFormatter/BlazyFormatterTrait.php \Drupal\blazy\Plugin\Field\FieldFormatter\BlazyFormatterTrait
  2. 7 src/Plugin/Field/FieldFormatter/BlazyFormatterTrait.php \Drupal\blazy\Plugin\Field\FieldFormatter\BlazyFormatterTrait

A Trait common for blazy image and file ER formatters.

Hierarchy

File

src/Plugin/Field/FieldFormatter/BlazyFormatterTrait.php, line 13

Namespace

Drupal\blazy\Plugin\Field\FieldFormatter
View source
trait BlazyFormatterTrait {

  /**
   * {@inheritdoc}
   */
  public function viewElements(FieldItemListInterface $items, $langcode) {
    $build = [];
    $files = $this
      ->getEntitiesToView($items, $langcode);

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

    // Collects specific settings to this formatter.
    $settings = $this
      ->buildSettings();
    $settings['blazy'] = TRUE;
    $settings['namespace'] = $settings['item_id'] = $settings['lazy'] = 'blazy';
    $settings['_grid'] = !empty($settings['style']) && !empty($settings['grid']);

    // Build the settings.
    $build = [
      'settings' => $settings,
    ];

    // Modifies settings.
    $this->blazyManager
      ->buildSettings($build, $items);

    // Build the elements.
    $this
      ->buildElements($build, $files);

    // Updates settings.
    $settings = $build['settings'];
    unset($build['settings']);

    // Supports Blazy multi-breakpoint images if provided.
    $this->blazyManager
      ->isBlazy($settings, $build[0]['#build']);

    // Build grid if provided.
    if (empty($settings['_grid'])) {
      $build['#blazy'] = $settings;
    }
    else {
      $build = BlazyGrid::build($build, $settings);
    }
    $build['#attached'] = $this->blazyManager
      ->attach($settings);
    return $build;
  }

  /**
   * Build the Blazy elements.
   */
  public function buildElements(array &$build, $files) {
    $settings = $build['settings'];
    $item_id = $settings['item_id'];
    $is_media = method_exists($this, 'getMediaItem');
    if (!empty($settings['caption'])) {
      $settings['caption_attributes']['class'][] = $item_id . '__caption';
    }
    foreach ($files as $delta => $file) {

      /* @var Drupal\image\Plugin\Field\FieldType\ImageItem $item */
      $item = $file->_referringItem;
      $settings['delta'] = $delta;
      $settings['file_tags'] = $file
        ->getCacheTags();
      $settings['type'] = 'image';
      $settings['uri'] = $file
        ->getFileUri();
      $box['item'] = $item;
      $box['settings'] = $settings;

      // If imported Drupal\blazy\Dejavu\BlazyVideoTrait.
      if ($is_media) {

        /** @var Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem $item */

        // EntityReferenceItem provides $item->entity Drupal\file\Entity\File.
        if (!empty($this
          ->getImageItem($item))) {
          $box['item'] = $this
            ->getImageItem($item)['item'];
          $box['settings'] = array_merge($settings, $this
            ->getImageItem($item)['settings']);
        }
        $this
          ->getMediaItem($box, $file);
      }

      // Build caption if so configured.
      if (!empty($settings['caption'])) {
        foreach ($settings['caption'] as $caption) {
          $box['captions'][$caption]['content'] = empty($box['item']->{$caption}) ? [] : [
            '#markup' => Xss::filterAdmin($box['item']->{$caption}),
          ];
          $box['captions'][$caption]['tag'] = $caption == 'title' ? 'h2' : 'div';
          if (!isset($box['captions'][$caption]['attributes'])) {
            $class = $caption == 'alt' ? 'description' : $caption;
            $box['captions'][$caption]['attributes'] = new Attribute();
            $box['captions'][$caption]['attributes']
              ->addClass($item_id . '__' . $class);
          }
        }
      }

      // Image with grid, responsive image, lazyLoad, and lightbox supports.
      $build[$delta] = $this->blazyManager
        ->getImage($box);
      unset($box);
    }
  }

}

Members