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 {
16 * Returns the blazy admin service.
18 public function admin() {
19 return \Drupal::service('blazy.admin.formatter');
25 public function viewElements(FieldItemListInterface $items, $langcode) {
27 $files = $this->getEntitiesToView($items, $langcode);
29 // Early opt-out if the field is empty.
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']);
40 // Build the settings.
41 $build = ['settings' => $settings];
44 $this->blazyManager->buildSettings($build, $items);
46 // Build the elements.
47 $this->buildElements($build, $files);
50 $settings = $build['settings'];
51 unset($build['settings']);
53 // Supports Blazy multi-breakpoint images if provided.
54 $this->blazyManager->isBlazy($settings, $build[0]['#build']);
56 // Build grid if provided.
57 if (empty($settings['_grid'])) {
58 $build['#blazy'] = $settings;
61 $build = BlazyGrid::build($build, $settings);
64 $build['#attached'] = $this->blazyManager->attach($settings);
69 * Build the Blazy elements.
71 public function buildElements(array &$build, $files) {
72 $settings = $build['settings'];
73 $item_id = $settings['item_id'];
74 $is_media = method_exists($this, 'getMediaItem');
76 if (!empty($settings['caption'])) {
77 $settings['caption_attributes']['class'][] = $item_id . '__caption';
80 foreach ($files as $delta => $file) {
81 /* @var Drupal\image\Plugin\Field\FieldType\ImageItem $item */
82 $item = $file->_referringItem;
84 $settings['delta'] = $delta;
85 $settings['file_tags'] = $file->getCacheTags();
86 $settings['type'] = 'image';
87 $settings['uri'] = $file->getFileUri();
90 $box['settings'] = $settings;
92 // If imported Drupal\blazy\Dejavu\BlazyVideoTrait.
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']);
101 $this->getMediaItem($box, $file);
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);
117 // Image with grid, responsive image, lazyLoad, and lightbox supports.
118 $build[$delta] = $this->blazyManager->getImage($box);
126 public function settingsSummary() {
127 return $this->admin()->settingsSummary($this);