3 namespace Drupal\blazy\Plugin\Field\FieldFormatter;
5 use Drupal\Core\Field\FieldItemListInterface;
6 use Drupal\Core\Template\Attribute;
7 use Drupal\Component\Utility\Xss;
8 use Drupal\blazy\BlazyGrid;
11 * A Trait common for blazy image and file ER formatters.
13 trait BlazyFormatterTrait {
18 public function viewElements(FieldItemListInterface $items, $langcode) {
20 $files = $this->getEntitiesToView($items, $langcode);
22 // Early opt-out if the field is empty.
27 // Collects specific settings to this formatter.
28 $settings = $this->buildSettings();
29 $settings['blazy'] = TRUE;
30 $settings['namespace'] = $settings['item_id'] = $settings['lazy'] = 'blazy';
31 $settings['_grid'] = !empty($settings['style']) && !empty($settings['grid']);
33 // Build the settings.
34 $build = ['settings' => $settings];
37 $this->blazyManager->buildSettings($build, $items);
39 // Build the elements.
40 $this->buildElements($build, $files);
43 $settings = $build['settings'];
44 unset($build['settings']);
46 // Supports Blazy multi-breakpoint images if provided.
47 $this->blazyManager->isBlazy($settings, $build[0]['#build']);
49 // Build grid if provided.
50 if (empty($settings['_grid'])) {
51 $build['#blazy'] = $settings;
54 $build = BlazyGrid::build($build, $settings);
57 $build['#attached'] = $this->blazyManager->attach($settings);
62 * Build the Blazy elements.
64 public function buildElements(array &$build, $files) {
65 $settings = $build['settings'];
66 $item_id = $settings['item_id'];
67 $is_media = method_exists($this, 'getMediaItem');
69 if (!empty($settings['caption'])) {
70 $settings['caption_attributes']['class'][] = $item_id . '__caption';
73 foreach ($files as $delta => $file) {
74 /* @var Drupal\image\Plugin\Field\FieldType\ImageItem $item */
75 $item = $file->_referringItem;
77 $settings['delta'] = $delta;
78 $settings['file_tags'] = $file->getCacheTags();
79 $settings['type'] = 'image';
80 $settings['uri'] = $file->getFileUri();
83 $box['settings'] = $settings;
85 // If imported Drupal\blazy\Dejavu\BlazyVideoTrait.
87 /** @var Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem $item */
88 // EntityReferenceItem provides $item->entity Drupal\file\Entity\File.
89 if (!empty($this->getImageItem($item, $delta))) {
90 $box['item'] = $this->getImageItem($item)['item'];
91 $box['settings'] = array_merge($settings, $this->getImageItem($item)['settings']);
94 $this->getMediaItem($box, $file);
97 // Build caption if so configured.
98 if (!empty($settings['caption'])) {
99 foreach ($settings['caption'] as $caption) {
100 $box['captions'][$caption]['content'] = empty($box['item']->{$caption}) ? [] : ['#markup' => Xss::filterAdmin($box['item']->{$caption})];
101 $box['captions'][$caption]['tag'] = $caption == 'title' ? 'h2' : 'div';
102 if (!isset($box['captions'][$caption]['attributes'])) {
103 $class = $caption == 'alt' ? 'description' : $caption;
104 $box['captions'][$caption]['attributes'] = new Attribute();
105 $box['captions'][$caption]['attributes']->addClass($item_id . '__' . $class);
110 // Image with grid, responsive image, lazyLoad, and lightbox supports.
111 $build[$delta] = $this->blazyManager->getImage($box);