X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=web%2Fcore%2Fmodules%2Fmedia%2Fsrc%2FPlugin%2FField%2FFieldFormatter%2FOEmbedFormatter.php;fp=web%2Fcore%2Fmodules%2Fmedia%2Fsrc%2FPlugin%2FField%2FFieldFormatter%2FOEmbedFormatter.php;h=443df18098824ef50e99b07cf5a2a715b980b88a;hp=0000000000000000000000000000000000000000;hb=0bf8d09d2542548982e81a441b1f16e75873a04f;hpb=74df008bdbb3a11eeea356744f39b802369bda3c diff --git a/web/core/modules/media/src/Plugin/Field/FieldFormatter/OEmbedFormatter.php b/web/core/modules/media/src/Plugin/Field/FieldFormatter/OEmbedFormatter.php new file mode 100644 index 000000000..443df1809 --- /dev/null +++ b/web/core/modules/media/src/Plugin/Field/FieldFormatter/OEmbedFormatter.php @@ -0,0 +1,303 @@ +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, + ] + 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).", ['@url' => $value]); + 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' => $max_width ?: $resource->getWidth(), + '#height' => $max_height ?: $resource->getHeight(), + ]; + } + else { + $url = Url::fromRoute('media.oembed_iframe', [], [ + '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(), + 'frameborder' => 0, + 'scrolling' => FALSE, + 'allowtransparency' => TRUE, + 'width' => $max_width ?: $resource->getWidth(), + 'height' => $max_height ?: $resource->getHeight(), + ], + ]; + + CacheableMetadata::createFromObject($resource) + ->addCacheTags($this->config->getCacheTags()) + ->applyTo($element[$delta]); + } + } + return $element; + } + + /** + * {@inheritdoc} + */ + public function settingsForm(array $form, FormStateInterface $form_state) { + return 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, + ], + ]; + } + + /** + * {@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'), + ]); + } + 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; + } + +}