diff --git a/core/modules/media/src/Plugin/Field/FieldFormatter/MediaGenericFileFormatter.php b/core/modules/media/src/Plugin/Field/FieldFormatter/MediaGenericFileFormatter.php index e69de29..50d660b 100644 --- a/core/modules/media/src/Plugin/Field/FieldFormatter/MediaGenericFileFormatter.php +++ b/core/modules/media/src/Plugin/Field/FieldFormatter/MediaGenericFileFormatter.php @@ -0,0 +1,91 @@ +getSetting('target_type') == 'media') { + /** @var MediaType[] $bundles */ + $allowed_types = MediaType::loadMultiple($field_definition->getSetting('handler_settings')['target_bundles']); + + $media_handlers = []; + $definitions = \Drupal::service('plugin.manager.field.formatter')->getDefinitions(); + foreach ($definitions as $definition) { + if ($definition['class'] == static::class) { + $media_handlers = $definition['media_handlers']; + } + } + + foreach ($allowed_types as $type) { + /** @var \Drupal\media\Entity\MediaType $type */ + if (in_array($type->getHandler()->getPluginId(), $media_handlers)) { + return TRUE; + } + } + } + return FALSE; + } + + protected function needsEntityLoad(EntityReferenceItem $item) { + return TRUE; + } + + + /** + * {@inheritdoc} + */ + public function viewElements(FieldItemListInterface $items, $langcode) { + $elements = array(); + $referenced_entities = $items->referencedEntities(); + foreach ($items->referencedEntities() as $delta => $entity) { + $source_field_name = $entity->getHandler()->getConfiguration()['source_field']; + /** @var \Drupal\file\FileInterface $file */ + $file = $entity->get($source_field_name)->entity; + + $elements[$delta] = array( + '#theme' => 'file_link', + '#file' => $file, + '#description' => $file->description, + '#cache' => array( + 'tags' => $file->getCacheTags(), + ), + ); + // Pass field item attributes to the theme function. + if (isset($item->_attributes)) { + $elements[$delta] += array('#attributes' => array()); + $elements[$delta]['#attributes'] += $item->_attributes; + // Unset field item attributes since they have been included in the + // formatter output and should not be rendered in the field template. + unset($item->_attributes); + } + } + + return $elements; + } + +} diff --git a/core/modules/media/src/Plugin/Field/FieldFormatter/MediaImageFormatter.php b/core/modules/media/src/Plugin/Field/FieldFormatter/MediaImageFormatter.php index e69de29..79dcdda 100644 --- a/core/modules/media/src/Plugin/Field/FieldFormatter/MediaImageFormatter.php +++ b/core/modules/media/src/Plugin/Field/FieldFormatter/MediaImageFormatter.php @@ -0,0 +1,319 @@ +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 static function isApplicable(FieldDefinitionInterface $field_definition) { + if (parent::isApplicable($field_definition) && $field_definition->getSetting('target_type') == 'media') { + /** @var MediaType[] $bundles */ + $allowed_types = MediaType::loadMultiple($field_definition->getSetting('handler_settings')['target_bundles']); + + $media_handlers = []; + $definitions = \Drupal::service('plugin.manager.field.formatter')->getDefinitions(); + foreach ($definitions as $definition) { + if ($definition['class'] == static::class) { + $media_handlers = $definition['media_handlers']; + } + } + + foreach ($allowed_types as $type) { + /** @var \Drupal\media\Entity\MediaType $type */ + if (in_array($type->getHandler()->getPluginId(), $media_handlers)) { + return TRUE; + } + } + } + return FALSE; + } + + + protected function needsEntityLoad(EntityReferenceItem $item) { + return TRUE; + } + + /** + * {@inheritdoc} + */ + public function viewElements(FieldItemListInterface $items, $langcode) { + + $elements = array(); + + + //$files = $this->getEntitiesToView($items, $langcode); + $entities = $items->referencedEntities(); + + // Early opt-out if the field is empty. + if (empty($entities)) { + 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. + $base_cache_tags = []; + if (!empty($image_style_setting)) { + $image_style = $this->imageStyleStorage->load($image_style_setting); + $base_cache_tags = $image_style->getCacheTags(); + } + + foreach ($entities as $delta => $entity) { + $source_field_name = $entity->getHandler()->getConfiguration()['source_field']; + /** @var \Drupal\file\FileInterface $file */ + $file = $entity->get($source_field_name)->entity; + + $cache_contexts = []; + 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($base_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' => 'media_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; + } + +} diff --git a/core/modules/media/src/Plugin/Field/FieldFormatter/MediaImageUrlFormatter.php b/core/modules/media/src/Plugin/Field/FieldFormatter/MediaImageUrlFormatter.php index e69de29..d1fee1b 100644 --- a/core/modules/media/src/Plugin/Field/FieldFormatter/MediaImageUrlFormatter.php +++ b/core/modules/media/src/Plugin/Field/FieldFormatter/MediaImageUrlFormatter.php @@ -0,0 +1,129 @@ + '', + ]; + } + + /** + * {@inheritdoc} + */ + public function settingsForm(array $form, FormStateInterface $form_state) { + $element = parent::settingsForm($form, $form_state); + + unset($element['image_link']);; + + return $element; + } + + /** + * {@inheritdoc} + */ + public function settingsSummary() { + $summary = parent::settingsSummary(); + return [$summary[0]]; + } + + /** + * {@inheritdoc} + */ + public static function isApplicable(FieldDefinitionInterface $field_definition) { + if (parent::isApplicable($field_definition) && $field_definition->getSetting('target_type') == 'media') { + /** @var MediaType[] $bundles */ + $allowed_types = MediaType::loadMultiple($field_definition->getSetting('handler_settings')['target_bundles']); + + $media_handlers = []; + $definitions = \Drupal::service('plugin.manager.field.formatter')->getDefinitions(); + foreach ($definitions as $definition) { + if ($definition['class'] == static::class) { + $media_handlers = $definition['media_handlers']; + } + } + + foreach ($allowed_types as $type) { + /** @var \Drupal\media\Entity\MediaType $type */ + if (in_array($type->getHandler()->getPluginId(), $media_handlers)) { + return TRUE; + } + } + } + return FALSE; + } + + protected function needsEntityLoad(EntityReferenceItem $item) { + return TRUE; + } + + /** + * {@inheritdoc} + */ + public function getFileUri() { + return $this->get('uri')->value; + } + + /** + * {@inheritdoc} + */ + public function viewElements(FieldItemListInterface $items, $langcode) { + $elements = []; + + if (empty($items->referencedEntities())) { + // Early opt-out if the field is empty. + return $elements; + } + + $image_style = $this->imageStyleStorage->load($this->getSetting('image_style')); + /** @var \Drupal\file\FileInterface[] $images */ + foreach($items->referencedEntities() as $entity) { + $source_field_name = $entity->getHandler()->getConfiguration()['source_field']; + /** @var \Drupal\file\FileInterface $file */ + $image = $entity->get($source_field_name)->entity; + $image_uri = $image->getFileUri(); + $url = $image_style ? $image_style->buildUrl($image_uri) : file_create_url($image_uri); + $url = file_url_transform_relative($url); + + // Add cacheability metadata from the image and image style. + $cacheability = CacheableMetadata::createFromObject($image); + if ($image_style) { + $cacheability->addCacheableDependency(CacheableMetadata::createFromObject($image_style)); + } + + $elements[] = ['#markup' => $url]; + // TODO Not working + //$cacheability->applyTo($elements[]); + } + + return $elements; + } + +} diff --git a/core/modules/media/src/Plugin/Field/FieldFormatter/MediaTableFormatter.php b/core/modules/media/src/Plugin/Field/FieldFormatter/MediaTableFormatter.php index e69de29..1138218 100644 --- a/core/modules/media/src/Plugin/Field/FieldFormatter/MediaTableFormatter.php +++ b/core/modules/media/src/Plugin/Field/FieldFormatter/MediaTableFormatter.php @@ -0,0 +1,90 @@ +getSetting('target_type') == 'media') { + /** @var MediaType[] $bundles */ + $allowed_types = MediaType::loadMultiple($field_definition->getSetting('handler_settings')['target_bundles']); + + $media_handlers = []; + $definitions = \Drupal::service('plugin.manager.field.formatter')->getDefinitions(); + foreach ($definitions as $definition) { + if ($definition['class'] == static::class) { + $media_handlers = $definition['media_handlers']; + } + } + + foreach ($allowed_types as $type) { + /** @var \Drupal\media\Entity\MediaType $type */ + if (in_array($type->getHandler()->getPluginId(), $media_handlers)) { + return TRUE; + } + } + } + return FALSE; + } + + /** + * {@inheritdoc} + */ + public function viewElements(FieldItemListInterface $items, $langcode) { + $elements = array(); + + if ($files = $this->getEntitiesToView($items, $langcode)) { + $header = array(t('Attachment'), t('Size')); + $rows = array(); + foreach ($files as $delta => $file) { + $rows[] = array( + array( + 'data' => array( + '#theme' => 'file_link', + '#file' => $file, + '#cache' => array( + 'tags' => $file->getCacheTags(), + ), + ), + ), + array('data' => format_size($file->getSize())), + ); + } + + $elements[0] = array(); + if (!empty($rows)) { + $elements[0] = array( + '#theme' => 'table__file_formatter_table', + '#header' => $header, + '#rows' => $rows, + ); + } + } + + return $elements; + } + +} diff --git a/core/modules/media/src/Plugin/Field/FieldFormatter/MediaUrlPlainFormatter.php b/core/modules/media/src/Plugin/Field/FieldFormatter/MediaUrlPlainFormatter.php index e69de29..31156d3 100644 --- a/core/modules/media/src/Plugin/Field/FieldFormatter/MediaUrlPlainFormatter.php +++ b/core/modules/media/src/Plugin/Field/FieldFormatter/MediaUrlPlainFormatter.php @@ -0,0 +1,86 @@ +getSetting('target_type') == 'media') { + /** @var MediaType[] $bundles */ + $allowed_types = MediaType::loadMultiple($field_definition->getSetting('handler_settings')['target_bundles']); + + $media_handlers = []; + $definitions = \Drupal::service('plugin.manager.field.formatter')->getDefinitions(); + foreach ($definitions as $definition) { + if ($definition['class'] == static::class) { + $media_handlers = $definition['media_handlers']; + } + } + + foreach ($allowed_types as $type) { + /** @var \Drupal\media\Entity\MediaType $type */ + if (in_array($type->getHandler()->getPluginId(), $media_handlers)) { + return TRUE; + } + } + } + return FALSE; + } + + protected function needsEntityLoad(EntityReferenceItem $item) { + return TRUE; + } + + /** + * {@inheritdoc} + */ + public function getFileUri() { + return $this->get('uri')->value; + } + + /** + * {@inheritdoc} + */ + public function viewElements(FieldItemListInterface $items, $langcode) { + $elements = array(); + + foreach($items->referencedEntities() as $entity) { + $source_field_name = $entity->getHandler()->getConfiguration()['source_field']; + /** @var \Drupal\file\FileInterface $file */ + $file = $entity->get($source_field_name)->entity; + $elements[] = array( + '#markup' => file_url_transform_relative(file_create_url($file->getFileUri())), + '#cache' => array( + 'tags' => $file->getCacheTags(), + ), + ); + } + + return $elements; + } + +}