Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 8 |
CRAP | |
0.00% |
0 / 136 |
ImageFormatter | |
0.00% |
0 / 1 |
|
0.00% |
0 / 8 |
600 | |
0.00% |
0 / 136 |
__construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 4 |
|||
create | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 12 |
|||
defaultSettings | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 5 |
|||
settingsForm | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 28 |
|||
settingsSummary | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 20 |
|||
viewElements | |
0.00% |
0 / 1 |
72 | |
0.00% |
0 / 47 |
|||
calculateDependencies | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 7 |
|||
onDependencyRemoval | |
0.00% |
0 / 1 |
42 | |
0.00% |
0 / 13 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\image\Plugin\Field\FieldFormatter\ImageFormatter. | |
*/ | |
namespace Drupal\image\Plugin\Field\FieldFormatter; | |
use Drupal\Core\Entity\EntityStorageInterface; | |
use Drupal\Core\Field\FieldItemListInterface; | |
use Drupal\Core\Field\FieldDefinitionInterface; | |
use Drupal\Core\Link; | |
use Drupal\Core\Plugin\ContainerFactoryPluginInterface; | |
use Drupal\Core\Session\AccountInterface; | |
use Drupal\Core\Url; | |
use Drupal\image\Entity\ImageStyle; | |
use Symfony\Component\DependencyInjection\ContainerInterface; | |
use Drupal\Core\Form\FormStateInterface; | |
use Drupal\Core\Cache\Cache; | |
/** | |
* Plugin implementation of the 'image' formatter. | |
* | |
* @FieldFormatter( | |
* id = "image", | |
* label = @Translation("Image"), | |
* field_types = { | |
* "image" | |
* } | |
* ) | |
*/ | |
class ImageFormatter extends ImageFormatterBase implements ContainerFactoryPluginInterface { | |
/** | |
* The current user. | |
* | |
* @var \Drupal\Core\Session\AccountInterface | |
*/ | |
protected $currentUser; | |
/** | |
* The image style entity storage. | |
* | |
* @var \Drupal\image\ImageStyleStorageInterface | |
*/ | |
protected $imageStyleStorage; | |
/** | |
* Constructs an ImageFormatter object. | |
* | |
* @param string $plugin_id | |
* The plugin_id for the formatter. | |
* @param mixed $plugin_definition | |
* The plugin implementation definition. | |
* @param \Drupal\Core\Field\FieldDefinitionInterface $field_definition | |
* The definition of the field to which the formatter is associated. | |
* @param array $settings | |
* The formatter settings. | |
* @param string $label | |
* The formatter label display setting. | |
* @param string $view_mode | |
* The view mode. | |
* @param array $third_party_settings | |
* Any third party settings settings. | |
* @param \Drupal\Core\Session\AccountInterface $current_user | |
* The current user. | |
*/ | |
public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, AccountInterface $current_user, EntityStorageInterface $image_style_storage) { | |
parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings); | |
$this->currentUser = $current_user; | |
$this->imageStyleStorage = $image_style_storage; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { | |
return new static( | |
$plugin_id, | |
$plugin_definition, | |
$configuration['field_definition'], | |
$configuration['settings'], | |
$configuration['label'], | |
$configuration['view_mode'], | |
$configuration['third_party_settings'], | |
$container->get('current_user'), | |
$container->get('entity.manager')->getStorage('image_style') | |
); | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public static function defaultSettings() { | |
return array( | |
'image_style' => '', | |
'image_link' => '', | |
) + parent::defaultSettings(); | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function settingsForm(array $form, FormStateInterface $form_state) { | |
$image_styles = image_style_options(FALSE); | |
$description_link = Link::fromTextAndUrl( | |
$this->t('Configure Image Styles'), | |
Url::fromRoute('entity.image_style.collection') | |
); | |
$element['image_style'] = [ | |
'#title' => t('Image style'), | |
'#type' => 'select', | |
'#default_value' => $this->getSetting('image_style'), | |
'#empty_option' => t('None (original image)'), | |
'#options' => $image_styles, | |
'#description' => $description_link->toRenderable() + [ | |
'#access' => $this->currentUser->hasPermission('administer image styles') | |
], | |
]; | |
$link_types = array( | |
'content' => t('Content'), | |
'file' => t('File'), | |
); | |
$element['image_link'] = array( | |
'#title' => t('Link image to'), | |
'#type' => 'select', | |
'#default_value' => $this->getSetting('image_link'), | |
'#empty_option' => t('Nothing'), | |
'#options' => $link_types, | |
); | |
return $element; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function settingsSummary() { | |
$summary = array(); | |
$image_styles = image_style_options(FALSE); | |
// Unset possible 'No defined styles' option. | |
unset($image_styles['']); | |
// Styles could be lost because of enabled/disabled modules that defines | |
// their styles in code. | |
$image_style_setting = $this->getSetting('image_style'); | |
if (isset($image_styles[$image_style_setting])) { | |
$summary[] = t('Image style: @style', array('@style' => $image_styles[$image_style_setting])); | |
} | |
else { | |
$summary[] = t('Original image'); | |
} | |
$link_types = array( | |
'content' => t('Linked to content'), | |
'file' => t('Linked to file'), | |
); | |
// Display this setting only if image is linked. | |
$image_link_setting = $this->getSetting('image_link'); | |
if (isset($link_types[$image_link_setting])) { | |
$summary[] = $link_types[$image_link_setting]; | |
} | |
return $summary; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function viewElements(FieldItemListInterface $items, $langcode) { | |
$elements = array(); | |
$files = $this->getEntitiesToView($items, $langcode); | |
// Early opt-out if the field is empty. | |
if (empty($files)) { | |
return $elements; | |
} | |
$url = NULL; | |
$image_link_setting = $this->getSetting('image_link'); | |
// Check if the formatter involves a link. | |
if ($image_link_setting == 'content') { | |
$entity = $items->getEntity(); | |
if (!$entity->isNew()) { | |
$url = $entity->urlInfo(); | |
} | |
} | |
elseif ($image_link_setting == 'file') { | |
$link_file = TRUE; | |
} | |
$image_style_setting = $this->getSetting('image_style'); | |
// Collect cache tags to be added for each item in the field. | |
$cache_tags = array(); | |
if (!empty($image_style_setting)) { | |
$image_style = $this->imageStyleStorage->load($image_style_setting); | |
$cache_tags = $image_style->getCacheTags(); | |
} | |
foreach ($files as $delta => $file) { | |
$cache_contexts = array(); | |
if (isset($link_file)) { | |
$image_uri = $file->getFileUri(); | |
// @todo Wrap in file_url_transform_relative(). This is currently | |
// impossible. As a work-around, we currently add the 'url.site' cache | |
// context to ensure different file URLs are generated for different | |
// sites in a multisite setup, including HTTP and HTTPS versions of the | |
// same site. Fix in https://www.drupal.org/node/2646744. | |
$url = Url::fromUri(file_create_url($image_uri)); | |
$cache_contexts[] = 'url.site'; | |
} | |
$cache_tags = Cache::mergeTags($cache_tags, $file->getCacheTags()); | |
// Extract field item attributes for the theme function, and unset them | |
// from the $item so that the field template does not re-render them. | |
$item = $file->_referringItem; | |
$item_attributes = $item->_attributes; | |
unset($item->_attributes); | |
$elements[$delta] = array( | |
'#theme' => 'image_formatter', | |
'#item' => $item, | |
'#item_attributes' => $item_attributes, | |
'#image_style' => $image_style_setting, | |
'#url' => $url, | |
'#cache' => array( | |
'tags' => $cache_tags, | |
'contexts' => $cache_contexts, | |
), | |
); | |
} | |
return $elements; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function calculateDependencies() { | |
$dependencies = parent::calculateDependencies(); | |
$style_id = $this->getSetting('image_style'); | |
/** @var \Drupal\image\ImageStyleInterface $style */ | |
if ($style_id && $style = ImageStyle::load($style_id)) { | |
// If this formatter uses a valid image style to display the image, add | |
// the image style configuration entity as dependency of this formatter. | |
$dependencies[$style->getConfigDependencyKey()][] = $style->getConfigDependencyName(); | |
} | |
return $dependencies; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function onDependencyRemoval(array $dependencies) { | |
$changed = parent::onDependencyRemoval($dependencies); | |
$style_id = $this->getSetting('image_style'); | |
/** @var \Drupal\image\ImageStyleInterface $style */ | |
if ($style_id && $style = ImageStyle::load($style_id)) { | |
if (!empty($dependencies[$style->getConfigDependencyKey()][$style->getConfigDependencyName()])) { | |
$replacement_id = $this->imageStyleStorage->getReplacementId($style_id); | |
// If a valid replacement has been provided in the storage, replace the | |
// image style with the replacement and signal that the formatter plugin | |
// settings were updated. | |
if ($replacement_id && ImageStyle::load($replacement_id)) { | |
$this->setSetting('image_style', $replacement_id); | |
$changed = TRUE; | |
} | |
} | |
} | |
return $changed; | |
} | |
} |