renderer = $renderer; } /** * {@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'), $container->get('renderer') ); } /** * {@inheritdoc} * * This has to be overriden because FileFormatterBase expects $item to be * of type \Drupal\file\Plugin\Field\FieldType\FileItem and calls * isDisplayed() which is not in FieldItemInterface. */ protected function needsEntityLoad(EntityReferenceItem $item) { return !$item->hasNewEntity(); } /** * {@inheritdoc} */ public function settingsForm(array $form, FormStateInterface $form_state) { $element = parent::settingsForm($form, $form_state); $link_types = [ 'content' => $this->t('Content'), 'media' => $this->t('Media entity'), ]; $element['image_link']['#options'] = $link_types; return $element; } /** * {@inheritdoc} */ public function settingsSummary() { $summary = parent::settingsSummary(); $link_types = [ 'content' => $this->t('Linked to content'), 'media' => $this->t('Linked to media entity'), ]; // 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 = []; $media = $this->getEntitiesToView($items, $langcode); // Early opt-out if the field is empty. if (empty($media)) { 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->toUrl(); } } elseif ($image_link_setting == 'media') { $link_media = TRUE; } $image_style_setting = $this->getSetting('image_style'); /** @var \Drupal\media_entity\MediaInterface $media_item */ foreach ($media as $delta => $media_item) { if (isset($link_media)) { $url = $media_item->toUrl(); } $elements[$delta] = [ '#theme' => 'image_formatter', '#item' => $media_item->get('thumbnail'), '#item_attributes' => [], '#image_style' => $image_style_setting, '#url' => $url, ]; // Collect cache tags to be added for each item in the field. $this->renderer->addCacheableDependency($elements[$delta], $media_item); } // Collect cache tags related to the image style setting. $image_style = $this->imageStyleStorage->load($image_style_setting); $this->renderer->addCacheableDependency($elements, $image_style); return $elements; } /** * {@inheritdoc} */ public static function isApplicable(FieldDefinitionInterface $field_definition) { // This formatter is only available for entity types that reference // media entities. $target_type = $field_definition->getFieldStorageDefinition()->getSetting('target_type'); return $target_type == 'media'; } }