class OEmbedFormatter
Same name in other branches
- 9 core/modules/media/src/Plugin/Field/FieldFormatter/OEmbedFormatter.php \Drupal\media\Plugin\Field\FieldFormatter\OEmbedFormatter
- 8.9.x core/modules/media/src/Plugin/Field/FieldFormatter/OEmbedFormatter.php \Drupal\media\Plugin\Field\FieldFormatter\OEmbedFormatter
- 10 core/modules/media/src/Plugin/Field/FieldFormatter/OEmbedFormatter.php \Drupal\media\Plugin\Field\FieldFormatter\OEmbedFormatter
Plugin implementation of the 'oembed' formatter.
@internal This is an internal part of the oEmbed system and should only be used by oEmbed-related code in Drupal core.
Hierarchy
- class \Drupal\Component\Plugin\PluginBase implements \Drupal\Component\Plugin\PluginInspectionInterface, \Drupal\Component\Plugin\DerivativeInspectionInterface
- class \Drupal\Core\Plugin\PluginBase extends \Drupal\Component\Plugin\PluginBase uses \Drupal\Core\StringTranslation\StringTranslationTrait, \Drupal\Core\DependencyInjection\DependencySerializationTrait, \Drupal\Core\Messenger\MessengerTrait
- class \Drupal\Core\Field\PluginSettingsBase extends \Drupal\Core\Plugin\PluginBase implements \Drupal\Core\Field\PluginSettingsInterface, \Drupal\Component\Plugin\DependentPluginInterface
- class \Drupal\Core\Field\FormatterBase extends \Drupal\Core\Field\PluginSettingsBase implements \Drupal\Core\Field\FormatterInterface, \Drupal\Core\Plugin\ContainerFactoryPluginInterface
- class \Drupal\media\Plugin\Field\FieldFormatter\OEmbedFormatter extends \Drupal\Core\Field\FormatterBase
- class \Drupal\Core\Field\FormatterBase extends \Drupal\Core\Field\PluginSettingsBase implements \Drupal\Core\Field\FormatterInterface, \Drupal\Core\Plugin\ContainerFactoryPluginInterface
- class \Drupal\Core\Field\PluginSettingsBase extends \Drupal\Core\Plugin\PluginBase implements \Drupal\Core\Field\PluginSettingsInterface, \Drupal\Component\Plugin\DependentPluginInterface
- class \Drupal\Core\Plugin\PluginBase extends \Drupal\Component\Plugin\PluginBase uses \Drupal\Core\StringTranslation\StringTranslationTrait, \Drupal\Core\DependencyInjection\DependencySerializationTrait, \Drupal\Core\Messenger\MessengerTrait
Expanded class hierarchy of OEmbedFormatter
File
-
core/
modules/ media/ src/ Plugin/ Field/ FieldFormatter/ OEmbedFormatter.php, line 32
Namespace
Drupal\media\Plugin\Field\FieldFormatterView source
class OEmbedFormatter extends FormatterBase {
/**
* The messenger service.
*
* @var \Drupal\Core\Messenger\MessengerInterface
*/
protected $messenger;
/**
* The oEmbed resource fetcher.
*
* @var \Drupal\media\OEmbed\ResourceFetcherInterface
*/
protected $resourceFetcher;
/**
* The oEmbed URL resolver service.
*
* @var \Drupal\media\OEmbed\UrlResolverInterface
*/
protected $urlResolver;
/**
* The logger service.
*
* @var \Psr\Log\LoggerInterface
*/
protected $logger;
/**
* The media settings config.
*
* @var \Drupal\Core\Config\ImmutableConfig
*/
protected $config;
/**
* The iFrame URL helper service.
*
* @var \Drupal\media\IFrameUrlHelper
*/
protected $iFrameUrlHelper;
/**
* Constructs an OEmbedFormatter instance.
*
* @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.
* @param \Drupal\Core\Messenger\MessengerInterface $messenger
* The messenger service.
* @param \Drupal\media\OEmbed\ResourceFetcherInterface $resource_fetcher
* The oEmbed resource fetcher service.
* @param \Drupal\media\OEmbed\UrlResolverInterface $url_resolver
* The oEmbed URL resolver service.
* @param \Drupal\Core\Logger\LoggerChannelFactoryInterface $logger_factory
* The logger factory service.
* @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
* The config factory service.
* @param \Drupal\media\IFrameUrlHelper $iframe_url_helper
* The iFrame URL helper service.
*/
public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, MessengerInterface $messenger, ResourceFetcherInterface $resource_fetcher, UrlResolverInterface $url_resolver, LoggerChannelFactoryInterface $logger_factory, ConfigFactoryInterface $config_factory, IFrameUrlHelper $iframe_url_helper) {
parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings);
$this->messenger = $messenger;
$this->resourceFetcher = $resource_fetcher;
$this->urlResolver = $url_resolver;
$this->logger = $logger_factory->get('media');
$this->config = $config_factory->get('media.settings');
$this->iFrameUrlHelper = $iframe_url_helper;
}
/**
* {@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('messenger'), $container->get('media.oembed.resource_fetcher'), $container->get('media.oembed.url_resolver'), $container->get('logger.factory'), $container->get('config.factory'), $container->get('media.oembed.iframe_url_helper'));
}
/**
* {@inheritdoc}
*/
public static function defaultSettings() {
return [
'max_width' => 0,
'max_height' => 0,
'loading' => [
'attribute' => 'lazy',
],
] + parent::defaultSettings();
}
/**
* {@inheritdoc}
*/
public function viewElements(FieldItemListInterface $items, $langcode) {
$element = [];
$max_width = $this->getSetting('max_width');
$max_height = $this->getSetting('max_height');
foreach ($items as $delta => $item) {
$main_property = $item->getFieldDefinition()
->getFieldStorageDefinition()
->getMainPropertyName();
$value = $item->{$main_property};
if (empty($value)) {
continue;
}
try {
$resource_url = $this->urlResolver
->getResourceUrl($value, $max_width, $max_height);
$resource = $this->resourceFetcher
->fetchResource($resource_url);
} catch (ResourceException $exception) {
$this->logger
->error("Could not retrieve the remote URL (@url): %error", [
'@url' => $value,
'%error' => $exception->getPrevious() ? $exception->getPrevious()
->getMessage() : $exception->getMessage(),
'exception' => $exception,
]);
continue;
}
if ($resource->getType() === Resource::TYPE_LINK) {
$element[$delta] = [
'#title' => $resource->getTitle(),
'#type' => 'link',
'#url' => Url::fromUri($value),
];
}
elseif ($resource->getType() === Resource::TYPE_PHOTO) {
$element[$delta] = [
'#theme' => 'image',
'#uri' => $resource->getUrl()
->toString(),
'#width' => $resource->getWidth(),
'#height' => $resource->getHeight(),
'#attributes' => [
'loading' => $this->getSetting('loading')['attribute'],
],
];
}
else {
$url = Url::fromRoute('media.oembed_iframe', [], [
'absolute' => TRUE,
'query' => [
'url' => $value,
'max_width' => $max_width,
'max_height' => $max_height,
'hash' => $this->iFrameUrlHelper
->getHash($value, $max_width, $max_height),
],
]);
$domain = $this->config
->get('iframe_domain');
if ($domain) {
$url->setOption('base_url', $domain);
}
// Render videos and rich content in an iframe for security reasons.
// @see: https://oembed.com/#section3
$element[$delta] = [
'#type' => 'html_tag',
'#tag' => 'iframe',
'#attributes' => [
'src' => $url->toString(),
'scrolling' => FALSE,
// External service is not supposed to send something larger
// than the max width or max height, so those values should be used.
'width' => $resource->getWidth() ?: $max_width,
'height' => $resource->getHeight() ?: $max_height,
'class' => [
'media-oembed-content',
],
'loading' => $this->getSetting('loading')['attribute'],
],
'#attached' => [
'library' => [
'media/oembed.formatter',
],
],
];
// An empty title attribute will disable title inheritance, so only
// add it if the resource has a title.
$title = $resource->getTitle();
if ($title) {
$element[$delta]['#attributes']['title'] = $title;
}
CacheableMetadata::createFromObject($resource)->addCacheTags($this->config
->getCacheTags())
->applyTo($element[$delta]);
}
}
return $element;
}
/**
* {@inheritdoc}
*/
public function settingsForm(array $form, FormStateInterface $form_state) {
$form = parent::settingsForm($form, $form_state) + [
'max_width' => [
'#type' => 'number',
'#title' => $this->t('Maximum width'),
'#default_value' => $this->getSetting('max_width'),
'#size' => 5,
'#maxlength' => 5,
'#field_suffix' => $this->t('pixels'),
'#min' => 0,
],
'max_height' => [
'#type' => 'number',
'#title' => $this->t('Maximum height'),
'#default_value' => $this->getSetting('max_height'),
'#size' => 5,
'#maxlength' => 5,
'#field_suffix' => $this->t('pixels'),
'#min' => 0,
],
'loading' => [
'#type' => 'details',
'#title' => $this->t('oEmbed loading'),
'#description' => $this->t('Lazy render oEmbed with native loading attribute (<em>loading="lazy"</em>). This improves performance by allowing browsers to lazily load assets.'),
'attribute' => [
'#title' => $this->t('oEmbed loading attribute'),
'#type' => 'radios',
'#default_value' => $this->getSetting('loading')['attribute'],
'#options' => [
'lazy' => $this->t('Lazy (<em>loading="lazy"</em>)'),
'eager' => $this->t('Eager (<em>loading="eager"</em>)'),
],
'#description' => $this->t('Select the loading attribute for oEmbed. <a href=":link">Learn more about the loading attribute for oEmbed.</a>', [
':link' => 'https://html.spec.whatwg.org/multipage/urls-and-fetching.html#lazy-loading-attributes',
]),
],
],
];
$form['loading']['attribute']['lazy']['#description'] = $this->t('Delays loading the resource until that section of the page is visible in the browser. When in doubt, lazy loading is recommended.');
$form['loading']['attribute']['eager']['#description'] = $this->t('Force browsers to download a resource as soon as possible. This is the browser default for legacy reasons. Only use this option when the resource is always expected to render.');
return $form;
}
/**
* {@inheritdoc}
*/
public function settingsSummary() {
$summary = parent::settingsSummary();
if ($this->getSetting('max_width') && $this->getSetting('max_height')) {
$summary[] = $this->t('Maximum size: %max_width x %max_height pixels', [
'%max_width' => $this->getSetting('max_width'),
'%max_height' => $this->getSetting('max_height'),
]);
}
elseif ($this->getSetting('max_width')) {
$summary[] = $this->t('Maximum width: %max_width pixels', [
'%max_width' => $this->getSetting('max_width'),
]);
}
elseif ($this->getSetting('max_height')) {
$summary[] = $this->t('Maximum height: %max_height pixels', [
'%max_height' => $this->getSetting('max_height'),
]);
}
$summary[] = $this->t('Loading attribute: @attribute', [
'@attribute' => $this->getSetting('loading')['attribute'],
]);
return $summary;
}
/**
* {@inheritdoc}
*/
public static function isApplicable(FieldDefinitionInterface $field_definition) {
if ($field_definition->getTargetEntityTypeId() !== 'media') {
return FALSE;
}
if (parent::isApplicable($field_definition)) {
$media_type = $field_definition->getTargetBundle();
if ($media_type) {
$media_type = MediaType::load($media_type);
return $media_type && $media_type->getSource() instanceof OEmbedInterface;
}
}
return FALSE;
}
}
Members
Title Sort descending | Modifiers | Object type | Summary | Overriden Title | Overrides |
---|---|---|---|---|---|
FormatterBase::$fieldDefinition | protected | property | The field definition. | ||
FormatterBase::$label | protected | property | The label display setting. | ||
FormatterBase::$settings | protected | property | The formatter settings. | Overrides PluginSettingsBase::$settings | |
FormatterBase::$viewMode | protected | property | The view mode. | ||
FormatterBase::getFieldSetting | protected | function | Returns the value of a field setting. | ||
FormatterBase::getFieldSettings | protected | function | Returns the array of field settings. | ||
FormatterBase::prepareView | public | function | Allows formatters to load information for field values being displayed. | Overrides FormatterInterface::prepareView | 2 |
FormatterBase::view | public | function | Builds a renderable array for a fully themed field. | Overrides FormatterInterface::view | 1 |
OEmbedFormatter::$config | protected | property | The media settings config. | ||
OEmbedFormatter::$iFrameUrlHelper | protected | property | The iFrame URL helper service. | ||
OEmbedFormatter::$logger | protected | property | The logger service. | ||
OEmbedFormatter::$messenger | protected | property | The messenger service. | ||
OEmbedFormatter::$resourceFetcher | protected | property | The oEmbed resource fetcher. | ||
OEmbedFormatter::$urlResolver | protected | property | The oEmbed URL resolver service. | ||
OEmbedFormatter::create | public static | function | Creates an instance of the plugin. | Overrides FormatterBase::create | |
OEmbedFormatter::defaultSettings | public static | function | Defines the default settings for this plugin. | Overrides PluginSettingsBase::defaultSettings | |
OEmbedFormatter::isApplicable | public static | function | Returns if the formatter can be used for the provided field. | Overrides FormatterBase::isApplicable | |
OEmbedFormatter::settingsForm | public | function | Returns a form to configure settings for the formatter. | Overrides FormatterBase::settingsForm | |
OEmbedFormatter::settingsSummary | public | function | Returns a short summary for the current formatter settings. | Overrides FormatterBase::settingsSummary | |
OEmbedFormatter::viewElements | public | function | Builds a renderable array for a field value. | Overrides FormatterInterface::viewElements | |
OEmbedFormatter::__construct | public | function | Constructs an OEmbedFormatter instance. | Overrides FormatterBase::__construct | |
PluginInspectionInterface::getPluginDefinition | public | function | Gets the definition of the plugin implementation. | 6 | |
PluginInspectionInterface::getPluginId | public | function | Gets the plugin_id of the plugin instance. | 2 | |
PluginSettingsBase::$defaultSettingsMerged | protected | property | Whether default settings have been merged into the current $settings. | ||
PluginSettingsBase::$thirdPartySettings | protected | property | The plugin settings injected by third party modules. | ||
PluginSettingsBase::calculateDependencies | public | function | Calculates dependencies for the configured plugin. | Overrides DependentPluginInterface::calculateDependencies | 6 |
PluginSettingsBase::getSetting | public | function | Returns the value of a setting, or its default value if absent. | Overrides PluginSettingsInterface::getSetting | |
PluginSettingsBase::getSettings | public | function | Returns the array of settings, including defaults for missing settings. | Overrides PluginSettingsInterface::getSettings | |
PluginSettingsBase::getThirdPartyProviders | public | function | Gets the list of third parties that store information. | Overrides ThirdPartySettingsInterface::getThirdPartyProviders | |
PluginSettingsBase::getThirdPartySetting | public | function | Gets the value of a third-party setting. | Overrides ThirdPartySettingsInterface::getThirdPartySetting | |
PluginSettingsBase::getThirdPartySettings | public | function | Gets all third-party settings of a given module. | Overrides ThirdPartySettingsInterface::getThirdPartySettings | |
PluginSettingsBase::mergeDefaults | protected | function | Merges default settings values into $settings. | ||
PluginSettingsBase::onDependencyRemoval | public | function | Informs the plugin that some configuration it depends on will be deleted. | Overrides PluginSettingsInterface::onDependencyRemoval | 3 |
PluginSettingsBase::setSetting | public | function | Sets the value of a setting for the plugin. | Overrides PluginSettingsInterface::setSetting | |
PluginSettingsBase::setSettings | public | function | Sets the settings for the plugin. | Overrides PluginSettingsInterface::setSettings | |
PluginSettingsBase::setThirdPartySetting | public | function | Sets the value of a third-party setting. | Overrides ThirdPartySettingsInterface::setThirdPartySetting | |
PluginSettingsBase::unsetThirdPartySetting | public | function | Unsets a third-party setting. | Overrides ThirdPartySettingsInterface::unsetThirdPartySetting |
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.