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; | |
| } | |
| } |