gridstack-8.x-2.5/src/Plugin/Field/FieldFormatter/GridStackFileFormatterBase.php
src/Plugin/Field/FieldFormatter/GridStackFileFormatterBase.php
<?php
namespace Drupal\gridstack\Plugin\Field\FieldFormatter;
use Drupal\Component\Utility\Xss;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\blazy\Plugin\Field\FieldFormatter\BlazyFileFormatterBase;
use Drupal\gridstack\GridStackDefault;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Base class for gridstack image and file ER formatters.
*/
abstract class GridStackFileFormatterBase extends BlazyFileFormatterBase {
use GridStackFormatterTrait;
use GridStackFormatterViewTrait;
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
$instance = parent::create($container, $configuration, $plugin_id, $plugin_definition);
return self::injectServices($instance, $container, 'image');
}
/**
* {@inheritdoc}
*/
public static function defaultSettings() {
return GridStackDefault::imageSettings();
}
/**
* {@inheritdoc}
*/
public function viewElements(FieldItemListInterface $items, $langcode) {
$entities = $this->getEntitiesToView($items, $langcode);
// Early opt-out if the field is empty.
if (empty($entities)) {
return [];
}
return $this->commonViewElements($items, $langcode, $entities);
}
/**
* Build the gridstack carousel elements.
*/
public function buildElements(array &$build, $files) {
$settings = &$build['settings'];
$item_id = $settings['item_id'];
foreach ($files as $delta => $file) {
$settings['delta'] = $delta;
$settings['type'] = 'image';
/** @var Drupal\image\Plugin\Field\FieldType\ImageItem $item */
$item = $file->_referringItem;
$settings['file_tags'] = $file->getCacheTags();
$settings['uri'] = $file->getFileUri();
// Overrides fallback breakpoint image_style with grid image_style.
// This tells theme_blazy() to respect different image style per item.
if (!empty($settings['breakpoints'])) {
$this->manager->buildImageStyleMultiple($settings, $delta);
}
$element = ['item' => $item, 'settings' => $settings];
// If imported Drupal\blazy\Dejavu\BlazyVideoTrait.
$this->buildElement($element, $file);
// Image with responsive image, lazyLoad, and lightbox supports.
$element[$item_id] = $this->formatter->getBlazy($element);
if (!empty($settings['caption'])) {
foreach ($settings['caption'] as $caption) {
$element['caption'][$caption] = empty($element['item']->{$caption}) ? [] : ['#markup' => Xss::filterAdmin($element['item']->{$caption})];
}
}
// Build individual gridstack item.
$build['items'][$delta] = $element;
unset($element);
}
}
/**
* {@inheritdoc}
*/
public function settingsForm(array $form, FormStateInterface $form_state) {
$element = parent::settingsForm($form, $form_state);
if (isset($element['image_style'])) {
$element['image_style']['#description'] = $this->t('This will be treated as the fallback image style if the optionset image styles not provided.');
}
return $element;
}
/**
* {@inheritdoc}
*/
public function getScopedFormElements() {
return [
'background' => TRUE,
'breakpoints' => FALSE,
'no_ratio' => TRUE,
] + $this->getCommonScopedFormElements() + parent::getScopedFormElements();
}
}
