Skip to content
Snippets Groups Projects
Commit 3d8ffbe8 authored by Geoffrey Roberts's avatar Geoffrey Roberts Committed by Nicolas Borda
Browse files

Issue #3375397 by geoffreyr, ipwa: Field formatter should support Media fields

parent 6e8c1bc9
No related branches found
No related tags found
1 merge request!113375397: Add support for media entities
......@@ -5,6 +5,7 @@ namespace Drupal\tiny_slider\Plugin\Field\FieldFormatter;
use Drupal\Component\Utility\Html;
use Drupal\Component\Utility\Random;
use Drupal\Core\Cache\Cache;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\FieldItemInterface;
......@@ -25,7 +26,8 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
* id = "tiny_slider_field_formatter",
* label = @Translation("Tiny Slider Carousel"),
* field_types = {
* "image"
* "image",
* "entity_reference"
* }
* )
*/
......@@ -493,21 +495,17 @@ class TinySliderFieldFormatter extends EntityReferenceFormatterBase implements C
foreach ($files as $delta => $file) {
if (isset($link_file)) {
$image_uri = $file->getFileUri();
$image_uri = $this->getEntityFileUrl($file);
$url = \Drupal::service('file_url_generator')->generate($image_uri);
}
$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);
$item_info = $this->getEntityItem($file);
$elements[$delta] = [
'#theme' => 'image_formatter',
'#item' => $item,
'#item_attributes' => $item_attributes,
'#item' => $item_info['item'],
'#item_attributes' => $item_info['attributes'],
'#image_style' => $image_style_setting,
'#url' => $url,
'#cache' => [
......@@ -533,6 +531,70 @@ class TinySliderFieldFormatter extends EntityReferenceFormatterBase implements C
}
/**
* Get the FieldItem
*
* @param EntityInterface $entity
* The file or media entity.
*
* @return mixed[]
* 'item' is a \Drupal\Core\Field\FieldItemInterface.
* 'attributes' is an array of attributes.
*/
protected function getEntityItem(EntityInterface $entity) {
// 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 = $entity->_referringItem;
$item_attributes = $item->_attributes;
unset($item->_attributes);
if ($entity->getEntityTypeId() === 'media') {
$file_id = $entity->getSource()->getSourceFieldValue($entity);
$file = \Drupal::entityTypeManager()->getStorage('file')->load($file_id);
// @see BlazyFormatterBase::getEntitiesToView().
$source_field = $entity->getSource()->getConfiguration()['source_field'];
$file_meta = $entity->get($source_field)->getValue()[0] ?? [];
$item = (object) [
'target_id' => $file->id(),
'alt' => $file_meta['alt'] ?? '',
'title' => $file_meta['title'] ?? '',
'width' => intval($file_meta['width'] ?? '0'),
'height' => intval($file_meta['height'] ?? '0'),
'entity' => $file,
'_loaded' => TRUE,
'_is_default' => TRUE,
];
}
return [
'item' => $item,
'attributes' => $item_attributes,
];
}
/**
* Fetch the URL of the file attached to this entity.
*
* Works with file or media entities.
*
* @param \Drupal\Core\Entity\EntityInterface $entity
* The entity.
*
* @return \Drupal\Core\Url|null
* The file URL if available.
*/
protected function getEntityFileUrl(EntityInterface $entity): ?Url {
if ($entity->getEntityTypeId() === 'file') {
return $entity->getFileUri();
}
if ($entity->getEntityTypeId() === 'media') {
$file_id = $entity->getSource()->getSourceFieldValue($entity);
$file = \Drupal::entityTypeManager()->getStorage('file')->load($file_id);
return $file->getFileUri();
}
return NULL;
}
/**
* Generate the output appropriate for one field item.
*
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment