X-Git-Url: https://yaffs.net/gitweb/?a=blobdiff_plain;f=web%2Fmodules%2Fcontrib%2Fvideo_embed_field%2Fsrc%2FPlugin%2FField%2FFieldFormatter%2FVideo.php;fp=web%2Fmodules%2Fcontrib%2Fvideo_embed_field%2Fsrc%2FPlugin%2FField%2FFieldFormatter%2FVideo.php;h=152b524fb9e9ba29b5e63cf9fbd0c5d7b41fe492;hb=a2bd1bf0c2c1f1a17d188f4dc0726a45494cefae;hp=0000000000000000000000000000000000000000;hpb=57c063afa3f66b07c4bbddc2d6129a96d90f0aad;p=yaffs-website diff --git a/web/modules/contrib/video_embed_field/src/Plugin/Field/FieldFormatter/Video.php b/web/modules/contrib/video_embed_field/src/Plugin/Field/FieldFormatter/Video.php new file mode 100644 index 000000000..152b524fb --- /dev/null +++ b/web/modules/contrib/video_embed_field/src/Plugin/Field/FieldFormatter/Video.php @@ -0,0 +1,219 @@ +providerManager = $provider_manager; + $this->currentUser = $current_user; + } + + /** + * {@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('current_user') + ); + } + + /** + * {@inheritdoc} + */ + public function viewElements(FieldItemListInterface $items, $langcode) { + $element = []; + foreach ($items as $delta => $item) { + $provider = $this->providerManager->loadProviderFromInput($item->value); + + if (!$provider) { + $element[$delta] = ['#theme' => 'video_embed_field_missing_provider']; + } + else { + $autoplay = $this->currentUser->hasPermission('never autoplay videos') ? FALSE : $this->getSetting('autoplay'); + $element[$delta] = $provider->renderEmbedCode($this->getSetting('width'), $this->getSetting('height'), $autoplay); + $element[$delta]['#cache']['contexts'][] = 'user.permissions'; + + // For responsive videos, wrap each field item in it's own container. + if ($this->getSetting('responsive')) { + $element[$delta] = [ + '#type' => 'container', + '#attached' => ['library' => ['video_embed_field/responsive-video']], + '#attributes' => ['class' => ['video-embed-field-responsive-video']], + 'children' => $element[$delta], + ]; + } + } + + } + return $element; + } + + /** + * {@inheritdoc} + */ + public static function defaultSettings() { + return [ + 'responsive' => TRUE, + 'width' => '854', + 'height' => '480', + 'autoplay' => TRUE, + ]; + } + + /** + * {@inheritdoc} + */ + public function settingsForm(array $form, FormStateInterface $form_state) { + $elements = parent::settingsForm($form, $form_state); + $elements['autoplay'] = [ + '#title' => $this->t('Autoplay'), + '#type' => 'checkbox', + '#description' => $this->t('Autoplay the videos for users without the "never autoplay videos" permission. Roles with this permission will bypass this setting.'), + '#default_value' => $this->getSetting('autoplay'), + ]; + $elements['responsive'] = [ + '#title' => $this->t('Responsive Video'), + '#type' => 'checkbox', + '#description' => $this->t("Make the video fill the width of it's container, adjusting to the size of the user's screen."), + '#default_value' => $this->getSetting('responsive'), + ]; + // Loosely match the name attribute so forms which don't have a field + // formatter structure (such as the WYSIWYG settings form) are also matched. + $responsive_checked_state = [ + 'visible' => [ + [ + ':input[name*="responsive"]' => ['checked' => FALSE], + ], + ], + ]; + $elements['width'] = [ + '#title' => $this->t('Width'), + '#type' => 'number', + '#field_suffix' => 'px', + '#default_value' => $this->getSetting('width'), + '#required' => TRUE, + '#size' => 20, + '#states' => $responsive_checked_state, + ]; + $elements['height'] = [ + '#title' => $this->t('Height'), + '#type' => 'number', + '#field_suffix' => 'px', + '#default_value' => $this->getSetting('height'), + '#required' => TRUE, + '#size' => 20, + '#states' => $responsive_checked_state, + ]; + return $elements; + } + + /** + * {@inheritdoc} + */ + public function settingsSummary() { + $dimensions = $this->getSetting('responsive') ? $this->t('Responsive') : $this->t('@widthx@height', ['@width' => $this->getSetting('width'), '@height' => $this->getSetting('height')]); + $summary[] = $this->t('Embedded Video (@dimensions@autoplay).', [ + '@dimensions' => $dimensions, + '@autoplay' => $this->getSetting('autoplay') ? $this->t(', autoplaying') : '', + ]); + return $summary; + } + + /** + * Get an instance of the Video field formatter plugin. + * + * This is useful because there is a lot of overlap to the configuration and + * display of a video in a WYSIWYG and configuring a field formatter. We + * get an instance of the plugin with our own WYSIWYG settings shimmed in, + * as well as a fake field_definition because one in this context doesn't + * exist. This allows us to reuse aspects such as the form and settings + * summary for the WYSIWYG integration. + * + * @param array $settings + * The settings to pass to the plugin. + * + * @return static + * The formatter plugin. + */ + public static function mockInstance($settings) { + return \Drupal::service('plugin.manager.field.formatter')->createInstance('video_embed_field_video', [ + 'settings' => !empty($settings) ? $settings : [], + 'third_party_settings' => [], + 'field_definition' => new FieldConfig([ + 'field_name' => 'mock', + 'entity_type' => 'mock', + 'bundle' => 'mock', + ]), + 'label' => '', + 'view_mode' => '', + ]); + } + +}