Created
December 14, 2017 23:45
-
-
Save krisrobinson/8d1929cf5d6e16005e3bad255fce32c2 to your computer and use it in GitHub Desktop.
Thumbnail Image URL Field Formatter for Video Embed Field in Drupal 8
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace Drupal\video_embed_field\Plugin\Field\FieldFormatter; | |
use Drupal\Core\Cache\CacheableMetadata; | |
use Drupal\Core\Entity\EntityStorageInterface; | |
use Drupal\Core\Field\FieldDefinitionInterface; | |
use Drupal\Core\Field\FormatterBase; | |
use Drupal\Core\Field\FieldItemListInterface; | |
use Drupal\Core\Form\FormStateInterface; | |
use Drupal\Core\Plugin\ContainerFactoryPluginInterface; | |
use Drupal\Core\Url; | |
use Drupal\image\Entity\ImageStyle; | |
use Drupal\video_embed_field\ProviderManagerInterface; | |
use Symfony\Component\DependencyInjection\ContainerInterface; | |
/** | |
* Plugin implementation of the thumbnail field formatter. | |
* | |
* @FieldFormatter( | |
* id = "video_embed_field_image_url", | |
* label = @Translation("Image Url"), | |
* field_types = { | |
* "video_embed_field" | |
* } | |
* ) | |
*/ | |
class ImageUrl extends FormatterBase implements ContainerFactoryPluginInterface { | |
/** | |
* The embed provider plugin manager. | |
* | |
* @var \Drupal\video_embed_field\ProviderManagerInterface | |
*/ | |
protected $providerManager; | |
/** | |
* The image style entity storage. | |
* | |
* @var \Drupal\Core\Entity\EntityStorageInterface | |
*/ | |
protected $imageStyleStorage; | |
/** | |
* Class constant for linking to content. | |
*/ | |
const LINK_CONTENT = 'content'; | |
/** | |
* Class constant for linking to the provider URL. | |
*/ | |
const LINK_PROVIDER = 'provider'; | |
/** | |
* Constructs a new instance of the plugin. | |
* | |
* @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 | |
* Third party settings. | |
* @param \Drupal\video_embed_field\ProviderManagerInterface $provider_manager | |
* The video embed provider manager. | |
*/ | |
public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, $settings, $label, $view_mode, $third_party_settings, ProviderManagerInterface $provider_manager, EntityStorageInterface $image_style_storage) { | |
parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings); | |
$this->providerManager = $provider_manager; | |
$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('video_embed_field.provider_manager'), | |
$container->get('entity.manager')->getStorage('image_style') | |
); | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function viewElements(FieldItemListInterface $items, $langcode) { | |
$element = []; | |
foreach ($items as $delta => $item) { | |
$provider = $this->providerManager->loadProviderFromInput($item->value); | |
$image_style = $this->imageStyleStorage->load($this->getSetting('image_style')); | |
if (!$provider) { | |
$element[$delta] = ['#theme' => 'video_embed_field_missing_provider']; | |
} | |
else { | |
//$provider->downloadThumbnail(); | |
//$element[$delta] = $provider->renderThumbnail($this->getSetting('image_style'), $url); | |
$thumbnail_uri = $provider->getLocalThumbnailUri(); | |
$url = $image_style ? $image_style->buildUrl($thumbnail_uri) : file_create_url($thumbnail_uri); | |
$url = file_url_transform_relative($url); | |
$cacheability = CacheableMetadata::createFromObject($item); | |
if ($image_style) { | |
$cacheability->addCacheableDependency(CacheableMetadata::createFromObject($image_style)); | |
} | |
$element[$delta] = [ | |
'#markup' => $url, | |
// '#url' => $url, | |
]; | |
$cacheability->applyTo($element[$delta]); | |
} | |
} | |
return $element; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public static function defaultSettings() { | |
return [ | |
'image_style' => '', | |
'link_image_to' => '', | |
]; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function settingsForm(array $form, FormStateInterface $form_state) { | |
$element = parent::settingsForm($form, $form_state); | |
$element['image_style'] = [ | |
'#title' => $this->t('Image Style'), | |
'#type' => 'select', | |
'#default_value' => $this->getSetting('image_style'), | |
'#required' => FALSE, | |
'#options' => image_style_options(), | |
]; | |
$element['link_image_to'] = [ | |
'#title' => $this->t('Link image to'), | |
'#type' => 'select', | |
'#empty_option' => $this->t('- None -'), | |
'#default_value' => $this->getSetting('link_image_to'), | |
'#options' => [ | |
static::LINK_CONTENT => $this->t('Content'), | |
static::LINK_PROVIDER => $this->t('Provider URL'), | |
], | |
]; | |
return $element; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function settingsSummary() { | |
$linked = ''; | |
if (!empty($this->getSetting('link_image_to'))) { | |
$linked = $this->getSetting('link_image_to') == static::LINK_CONTENT ? $this->t(', linked to content') : $this->t(', linked to provider'); | |
} | |
$summary[] = $this->t('Video thumbnail (@style@linked).', [ | |
'@style' => $this->getSetting('image_style') ? $this->getSetting('image_style') : $this->t('no image style'), | |
'@linked' => $linked, | |
]); | |
return $summary; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function calculateDependencies() { | |
$dependencies = parent::calculateDependencies(); | |
$style_id = $this->getSetting('image_style'); | |
if ($style_id && $style = ImageStyle::load($style_id)) { | |
$dependencies[$style->getConfigDependencyKey()][] = $style->getConfigDependencyName(); | |
} | |
return $dependencies; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function onDependencyRemoval(array $dependencies) { | |
$changed = parent::onDependencyRemoval($dependencies); | |
$style_id = $this->getSetting('image_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; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment