Version 1
[yaffs-website] / web / modules / contrib / blazy / src / Plugin / Field / FieldFormatter / BlazyFormatterTrait.php
1 <?php
2
3 namespace Drupal\blazy\Plugin\Field\FieldFormatter;
4
5 use Drupal\Core\Field\FieldItemListInterface;
6 use Drupal\Core\Template\Attribute;
7 use Drupal\Component\Utility\Xss;
8 use Drupal\blazy\BlazyGrid;
9
10 /**
11  * A Trait common for blazy image and file ER formatters.
12  */
13 trait BlazyFormatterTrait {
14
15   /**
16    * Returns the blazy admin service.
17    */
18   public function admin() {
19     return \Drupal::service('blazy.admin.formatter');
20   }
21
22   /**
23    * {@inheritdoc}
24    */
25   public function viewElements(FieldItemListInterface $items, $langcode) {
26     $build = [];
27     $files = $this->getEntitiesToView($items, $langcode);
28
29     // Early opt-out if the field is empty.
30     if (empty($files)) {
31       return $build;
32     }
33
34     // Collects specific settings to this formatter.
35     $settings              = $this->buildSettings();
36     $settings['blazy']     = TRUE;
37     $settings['namespace'] = $settings['item_id'] = $settings['lazy'] = 'blazy';
38     $settings['_grid']     = !empty($settings['style']) && !empty($settings['grid']);
39
40     // Build the settings.
41     $build = ['settings' => $settings];
42
43     // Modifies settings.
44     $this->blazyManager->buildSettings($build, $items);
45
46     // Build the elements.
47     $this->buildElements($build, $files);
48
49     // Updates settings.
50     $settings = $build['settings'];
51     unset($build['settings']);
52
53     // Supports Blazy multi-breakpoint images if provided.
54     $this->blazyManager->isBlazy($settings, $build[0]['#build']);
55
56     // Build grid if provided.
57     if (empty($settings['_grid'])) {
58       $build['#blazy'] = $settings;
59     }
60     else {
61       $build = BlazyGrid::build($build, $settings);
62     }
63
64     $build['#attached'] = $this->blazyManager->attach($settings);
65     return $build;
66   }
67
68   /**
69    * Build the Blazy elements.
70    */
71   public function buildElements(array &$build, $files) {
72     $settings = $build['settings'];
73     $item_id  = $settings['item_id'];
74     $is_media = method_exists($this, 'getMediaItem');
75
76     if (!empty($settings['caption'])) {
77       $settings['caption_attributes']['class'][] = $item_id . '__caption';
78     }
79
80     foreach ($files as $delta => $file) {
81       /* @var Drupal\image\Plugin\Field\FieldType\ImageItem $item */
82       $item = $file->_referringItem;
83
84       $settings['delta']     = $delta;
85       $settings['file_tags'] = $file->getCacheTags();
86       $settings['type']      = 'image';
87       $settings['uri']       = $file->getFileUri();
88
89       $box['item']     = $item;
90       $box['settings'] = $settings;
91
92       // If imported Drupal\blazy\Dejavu\BlazyVideoTrait.
93       if ($is_media) {
94         /** @var Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem $item */
95         // EntityReferenceItem provides $item->entity Drupal\file\Entity\File.
96         if (!empty($this->getImageItem($item, $delta))) {
97           $box['item'] = $this->getImageItem($item)['item'];
98           $box['settings'] = array_merge($settings, $this->getImageItem($item)['settings']);
99         }
100
101         $this->getMediaItem($box, $file);
102       }
103
104       // Build caption if so configured.
105       if (!empty($settings['caption'])) {
106         foreach ($settings['caption'] as $caption) {
107           $box['captions'][$caption]['content'] = empty($box['item']->{$caption}) ? [] : ['#markup' => Xss::filterAdmin($box['item']->{$caption})];
108           $box['captions'][$caption]['tag'] = $caption == 'title' ? 'h2' : 'div';
109           if (!isset($box['captions'][$caption]['attributes'])) {
110             $class = $caption == 'alt' ? 'description' : $caption;
111             $box['captions'][$caption]['attributes'] = new Attribute();
112             $box['captions'][$caption]['attributes']->addClass($item_id . '__' . $class);
113           }
114         }
115       }
116
117       // Image with grid, responsive image, lazyLoad, and lightbox supports.
118       $build[$delta] = $this->blazyManager->getImage($box);
119       unset($box);
120     }
121   }
122
123   /**
124    * {@inheritdoc}
125    */
126   public function settingsSummary() {
127     return $this->admin()->settingsSummary($this);
128   }
129
130 }