Loading core/modules/media_library/media_library.services.yml +6 −0 Original line number Diff line number Diff line Loading @@ -6,3 +6,9 @@ services: class: Drupal\media_library\Routing\RouteSubscriber tags: - { name: event_subscriber } media_library.opener_resolver: class: Drupal\media_library\OpenerResolver calls: - [setContainer, ['@service_container']] media_library.opener.field_widget: class: Drupal\media_library\MediaLibraryFieldWidgetOpener core/modules/media_library/src/Form/AddFormBase.php +31 −18 Original line number Diff line number Diff line Loading @@ -16,7 +16,7 @@ use Drupal\media\MediaTypeInterface; use Drupal\media_library\Ajax\UpdateSelectionCommand; use Drupal\media_library\MediaLibraryUiBuilder; use Drupal\media_library\Plugin\Field\FieldWidget\MediaLibraryWidget; use Drupal\media_library\OpenerResolverInterface; use Symfony\Component\DependencyInjection\ContainerInterface; /** Loading Loading @@ -57,6 +57,13 @@ abstract class AddFormBase extends FormBase { */ protected $viewBuilder; /** * The opener resolver. * * @var \Drupal\media_library\OpenerResolverInterface */ protected $openerResolver; /** * Constructs a AddFormBase object. * Loading @@ -64,11 +71,18 @@ abstract class AddFormBase extends FormBase { * The entity type manager. * @param \Drupal\media_library\MediaLibraryUiBuilder $library_ui_builder * The media library UI builder. * @param \Drupal\media_library\OpenerResolverInterface $opener_resolver * The opener resolver. */ public function __construct(EntityTypeManagerInterface $entity_type_manager, MediaLibraryUiBuilder $library_ui_builder) { public function __construct(EntityTypeManagerInterface $entity_type_manager, MediaLibraryUiBuilder $library_ui_builder, OpenerResolverInterface $opener_resolver = NULL) { $this->entityTypeManager = $entity_type_manager; $this->libraryUiBuilder = $library_ui_builder; $this->viewBuilder = $this->entityTypeManager->getViewBuilder('media'); if (!$opener_resolver) { @trigger_error('The media_library.opener_resolver service must be passed to AddFormBase::__construct(), it is required before Drupal 9.0.0.', E_USER_DEPRECATED); $opener_resolver = \Drupal::service('media_library.opener_resolver'); } $this->openerResolver = $opener_resolver; } /** Loading @@ -77,7 +91,8 @@ public function __construct(EntityTypeManagerInterface $entity_type_manager, Med public static function create(ContainerInterface $container) { return new static( $container->get('entity_type.manager'), $container->get('media_library.ui_builder') $container->get('media_library.ui_builder'), $container->get('media_library.opener_resolver') ); } Loading Loading @@ -247,7 +262,7 @@ protected function buildEntityFormElement(MediaInterface $media, array $form, Fo // triggering element is not set correctly and the wrong media item is // removed. // @see ::removeButtonSubmit() $parents = $form['#parents']; $parents = isset($form['#parents']) ? $form['#parents'] : []; $id_suffix = $parents ? '-' . implode('-', $parents) : ''; $element = [ Loading Loading @@ -724,21 +739,19 @@ public function updateWidget(array &$form, FormStateInterface $form_state) { return $form; } // Pass the selection to the field widget based on the current widget ID. $opener_id = $this->getMediaLibraryState($form_state)->getOpenerId(); if ($field_id = MediaLibraryWidget::getOpenerFieldId($opener_id)) { // The added media items get an ID when they are saved in ::submitForm(). // For that reason the added media items are keyed by delta in the form // state and we have to do an array map to get each media ID. $current_media_ids = array_map(function (MediaInterface $media) { return $media->id(); }, $this->getCurrentMediaItems($form_state)); return (new AjaxResponse()) ->addCommand(new InvokeCommand("[data-media-library-widget-value=\"$field_id\"]", 'val', [implode(',', $current_media_ids)])) ->addCommand(new InvokeCommand("[data-media-library-widget-update=\"$field_id\"]", 'trigger', ['mousedown'])) // Allow the opener service to respond to the selection. $state = $this->getMediaLibraryState($form_state); return $this->openerResolver->get($state) ->getSelectionResponse($state, $current_media_ids) ->addCommand(new CloseDialogCommand()); } } /** * Get the media library state from the form state. Loading core/modules/media_library/src/Form/FileUploadForm.php +7 −3 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ use Drupal\media\MediaInterface; use Drupal\media\MediaTypeInterface; use Drupal\media_library\MediaLibraryUiBuilder; use Drupal\media_library\OpenerResolverInterface; use Symfony\Component\DependencyInjection\ContainerInterface; /** Loading Loading @@ -65,9 +66,11 @@ class FileUploadForm extends AddFormBase { * The renderer service. * @param \Drupal\Core\File\FileSystemInterface $file_system * The file system service. * @param \Drupal\media_library\OpenerResolverInterface $opener_resolver * The opener resolver. */ public function __construct(EntityTypeManagerInterface $entity_type_manager, MediaLibraryUiBuilder $library_ui_builder, ElementInfoManagerInterface $element_info, RendererInterface $renderer, FileSystemInterface $file_system) { parent::__construct($entity_type_manager, $library_ui_builder); public function __construct(EntityTypeManagerInterface $entity_type_manager, MediaLibraryUiBuilder $library_ui_builder, ElementInfoManagerInterface $element_info, RendererInterface $renderer, FileSystemInterface $file_system, OpenerResolverInterface $opener_resolver = NULL) { parent::__construct($entity_type_manager, $library_ui_builder, $opener_resolver); $this->elementInfo = $element_info; $this->renderer = $renderer; $this->fileSystem = $file_system; Loading @@ -82,7 +85,8 @@ public static function create(ContainerInterface $container) { $container->get('media_library.ui_builder'), $container->get('element_info'), $container->get('renderer'), $container->get('file_system') $container->get('file_system'), $container->get('media_library.opener_resolver') ); } Loading core/modules/media_library/src/Form/OEmbedForm.php +7 −3 Original line number Diff line number Diff line Loading @@ -11,6 +11,7 @@ use Drupal\media\OEmbed\UrlResolverInterface; use Drupal\media\Plugin\media\Source\OEmbedInterface; use Drupal\media_library\MediaLibraryUiBuilder; use Drupal\media_library\OpenerResolverInterface; use Symfony\Component\DependencyInjection\ContainerInterface; /** Loading Loading @@ -48,9 +49,11 @@ class OEmbedForm extends AddFormBase { * The oEmbed URL resolver service. * @param \Drupal\media\OEmbed\ResourceFetcherInterface $resource_fetcher * The oEmbed resource fetcher service. * @param \Drupal\media_library\OpenerResolverInterface $opener_resolver * The opener resolver. */ public function __construct(EntityTypeManagerInterface $entity_type_manager, MediaLibraryUiBuilder $library_ui_builder, UrlResolverInterface $url_resolver, ResourceFetcherInterface $resource_fetcher) { parent::__construct($entity_type_manager, $library_ui_builder); public function __construct(EntityTypeManagerInterface $entity_type_manager, MediaLibraryUiBuilder $library_ui_builder, UrlResolverInterface $url_resolver, ResourceFetcherInterface $resource_fetcher, OpenerResolverInterface $opener_resolver = NULL) { parent::__construct($entity_type_manager, $library_ui_builder, $opener_resolver); $this->urlResolver = $url_resolver; $this->resourceFetcher = $resource_fetcher; } Loading @@ -63,7 +66,8 @@ public static function create(ContainerInterface $container) { $container->get('entity_type.manager'), $container->get('media_library.ui_builder'), $container->get('media.oembed.url_resolver'), $container->get('media.oembed.resource_fetcher') $container->get('media.oembed.resource_fetcher'), $container->get('media_library.opener_resolver') ); } Loading core/modules/media_library/src/MediaLibraryFieldWidgetOpener.php 0 → 100644 +44 −0 Original line number Diff line number Diff line <?php namespace Drupal\media_library; use Drupal\Core\Ajax\AjaxResponse; use Drupal\Core\Ajax\InvokeCommand; use Drupal\Core\Session\AccountInterface; /** * The media library opener for field widgets. */ class MediaLibraryFieldWidgetOpener implements MediaLibraryOpenerInterface { /** * {@inheritdoc} */ public function checkAccess(MediaLibraryState $state, AccountInterface $account) { throw new \Exception('Not yet implemented, see https://www.drupal.org/project/drupal/issues/3038254.'); } /** * {@inheritdoc} */ public function getSelectionResponse(MediaLibraryState $state, array $selected_ids) { $response = new AjaxResponse(); $parameters = $state->getOpenerParameters(); if (empty($parameters['field_widget_id'])) { throw new \InvalidArgumentException('field_widget_id parameter is missing.'); } // Create a comma-separated list of media IDs, insert them in the hidden // field of the widget, and trigger the field update via the hidden submit // button. $widget_id = $parameters['field_widget_id']; $ids = implode(',', $selected_ids); $response ->addCommand(new InvokeCommand("[data-media-library-widget-value=\"$widget_id\"]", 'val', [$ids])) ->addCommand(new InvokeCommand("[data-media-library-widget-update=\"$widget_id\"]", 'trigger', ['mousedown'])); return $response; } } Loading
core/modules/media_library/media_library.services.yml +6 −0 Original line number Diff line number Diff line Loading @@ -6,3 +6,9 @@ services: class: Drupal\media_library\Routing\RouteSubscriber tags: - { name: event_subscriber } media_library.opener_resolver: class: Drupal\media_library\OpenerResolver calls: - [setContainer, ['@service_container']] media_library.opener.field_widget: class: Drupal\media_library\MediaLibraryFieldWidgetOpener
core/modules/media_library/src/Form/AddFormBase.php +31 −18 Original line number Diff line number Diff line Loading @@ -16,7 +16,7 @@ use Drupal\media\MediaTypeInterface; use Drupal\media_library\Ajax\UpdateSelectionCommand; use Drupal\media_library\MediaLibraryUiBuilder; use Drupal\media_library\Plugin\Field\FieldWidget\MediaLibraryWidget; use Drupal\media_library\OpenerResolverInterface; use Symfony\Component\DependencyInjection\ContainerInterface; /** Loading Loading @@ -57,6 +57,13 @@ abstract class AddFormBase extends FormBase { */ protected $viewBuilder; /** * The opener resolver. * * @var \Drupal\media_library\OpenerResolverInterface */ protected $openerResolver; /** * Constructs a AddFormBase object. * Loading @@ -64,11 +71,18 @@ abstract class AddFormBase extends FormBase { * The entity type manager. * @param \Drupal\media_library\MediaLibraryUiBuilder $library_ui_builder * The media library UI builder. * @param \Drupal\media_library\OpenerResolverInterface $opener_resolver * The opener resolver. */ public function __construct(EntityTypeManagerInterface $entity_type_manager, MediaLibraryUiBuilder $library_ui_builder) { public function __construct(EntityTypeManagerInterface $entity_type_manager, MediaLibraryUiBuilder $library_ui_builder, OpenerResolverInterface $opener_resolver = NULL) { $this->entityTypeManager = $entity_type_manager; $this->libraryUiBuilder = $library_ui_builder; $this->viewBuilder = $this->entityTypeManager->getViewBuilder('media'); if (!$opener_resolver) { @trigger_error('The media_library.opener_resolver service must be passed to AddFormBase::__construct(), it is required before Drupal 9.0.0.', E_USER_DEPRECATED); $opener_resolver = \Drupal::service('media_library.opener_resolver'); } $this->openerResolver = $opener_resolver; } /** Loading @@ -77,7 +91,8 @@ public function __construct(EntityTypeManagerInterface $entity_type_manager, Med public static function create(ContainerInterface $container) { return new static( $container->get('entity_type.manager'), $container->get('media_library.ui_builder') $container->get('media_library.ui_builder'), $container->get('media_library.opener_resolver') ); } Loading Loading @@ -247,7 +262,7 @@ protected function buildEntityFormElement(MediaInterface $media, array $form, Fo // triggering element is not set correctly and the wrong media item is // removed. // @see ::removeButtonSubmit() $parents = $form['#parents']; $parents = isset($form['#parents']) ? $form['#parents'] : []; $id_suffix = $parents ? '-' . implode('-', $parents) : ''; $element = [ Loading Loading @@ -724,21 +739,19 @@ public function updateWidget(array &$form, FormStateInterface $form_state) { return $form; } // Pass the selection to the field widget based on the current widget ID. $opener_id = $this->getMediaLibraryState($form_state)->getOpenerId(); if ($field_id = MediaLibraryWidget::getOpenerFieldId($opener_id)) { // The added media items get an ID when they are saved in ::submitForm(). // For that reason the added media items are keyed by delta in the form // state and we have to do an array map to get each media ID. $current_media_ids = array_map(function (MediaInterface $media) { return $media->id(); }, $this->getCurrentMediaItems($form_state)); return (new AjaxResponse()) ->addCommand(new InvokeCommand("[data-media-library-widget-value=\"$field_id\"]", 'val', [implode(',', $current_media_ids)])) ->addCommand(new InvokeCommand("[data-media-library-widget-update=\"$field_id\"]", 'trigger', ['mousedown'])) // Allow the opener service to respond to the selection. $state = $this->getMediaLibraryState($form_state); return $this->openerResolver->get($state) ->getSelectionResponse($state, $current_media_ids) ->addCommand(new CloseDialogCommand()); } } /** * Get the media library state from the form state. Loading
core/modules/media_library/src/Form/FileUploadForm.php +7 −3 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ use Drupal\media\MediaInterface; use Drupal\media\MediaTypeInterface; use Drupal\media_library\MediaLibraryUiBuilder; use Drupal\media_library\OpenerResolverInterface; use Symfony\Component\DependencyInjection\ContainerInterface; /** Loading Loading @@ -65,9 +66,11 @@ class FileUploadForm extends AddFormBase { * The renderer service. * @param \Drupal\Core\File\FileSystemInterface $file_system * The file system service. * @param \Drupal\media_library\OpenerResolverInterface $opener_resolver * The opener resolver. */ public function __construct(EntityTypeManagerInterface $entity_type_manager, MediaLibraryUiBuilder $library_ui_builder, ElementInfoManagerInterface $element_info, RendererInterface $renderer, FileSystemInterface $file_system) { parent::__construct($entity_type_manager, $library_ui_builder); public function __construct(EntityTypeManagerInterface $entity_type_manager, MediaLibraryUiBuilder $library_ui_builder, ElementInfoManagerInterface $element_info, RendererInterface $renderer, FileSystemInterface $file_system, OpenerResolverInterface $opener_resolver = NULL) { parent::__construct($entity_type_manager, $library_ui_builder, $opener_resolver); $this->elementInfo = $element_info; $this->renderer = $renderer; $this->fileSystem = $file_system; Loading @@ -82,7 +85,8 @@ public static function create(ContainerInterface $container) { $container->get('media_library.ui_builder'), $container->get('element_info'), $container->get('renderer'), $container->get('file_system') $container->get('file_system'), $container->get('media_library.opener_resolver') ); } Loading
core/modules/media_library/src/Form/OEmbedForm.php +7 −3 Original line number Diff line number Diff line Loading @@ -11,6 +11,7 @@ use Drupal\media\OEmbed\UrlResolverInterface; use Drupal\media\Plugin\media\Source\OEmbedInterface; use Drupal\media_library\MediaLibraryUiBuilder; use Drupal\media_library\OpenerResolverInterface; use Symfony\Component\DependencyInjection\ContainerInterface; /** Loading Loading @@ -48,9 +49,11 @@ class OEmbedForm extends AddFormBase { * The oEmbed URL resolver service. * @param \Drupal\media\OEmbed\ResourceFetcherInterface $resource_fetcher * The oEmbed resource fetcher service. * @param \Drupal\media_library\OpenerResolverInterface $opener_resolver * The opener resolver. */ public function __construct(EntityTypeManagerInterface $entity_type_manager, MediaLibraryUiBuilder $library_ui_builder, UrlResolverInterface $url_resolver, ResourceFetcherInterface $resource_fetcher) { parent::__construct($entity_type_manager, $library_ui_builder); public function __construct(EntityTypeManagerInterface $entity_type_manager, MediaLibraryUiBuilder $library_ui_builder, UrlResolverInterface $url_resolver, ResourceFetcherInterface $resource_fetcher, OpenerResolverInterface $opener_resolver = NULL) { parent::__construct($entity_type_manager, $library_ui_builder, $opener_resolver); $this->urlResolver = $url_resolver; $this->resourceFetcher = $resource_fetcher; } Loading @@ -63,7 +66,8 @@ public static function create(ContainerInterface $container) { $container->get('entity_type.manager'), $container->get('media_library.ui_builder'), $container->get('media.oembed.url_resolver'), $container->get('media.oembed.resource_fetcher') $container->get('media.oembed.resource_fetcher'), $container->get('media_library.opener_resolver') ); } Loading
core/modules/media_library/src/MediaLibraryFieldWidgetOpener.php 0 → 100644 +44 −0 Original line number Diff line number Diff line <?php namespace Drupal\media_library; use Drupal\Core\Ajax\AjaxResponse; use Drupal\Core\Ajax\InvokeCommand; use Drupal\Core\Session\AccountInterface; /** * The media library opener for field widgets. */ class MediaLibraryFieldWidgetOpener implements MediaLibraryOpenerInterface { /** * {@inheritdoc} */ public function checkAccess(MediaLibraryState $state, AccountInterface $account) { throw new \Exception('Not yet implemented, see https://www.drupal.org/project/drupal/issues/3038254.'); } /** * {@inheritdoc} */ public function getSelectionResponse(MediaLibraryState $state, array $selected_ids) { $response = new AjaxResponse(); $parameters = $state->getOpenerParameters(); if (empty($parameters['field_widget_id'])) { throw new \InvalidArgumentException('field_widget_id parameter is missing.'); } // Create a comma-separated list of media IDs, insert them in the hidden // field of the widget, and trigger the field update via the hidden submit // button. $widget_id = $parameters['field_widget_id']; $ids = implode(',', $selected_ids); $response ->addCommand(new InvokeCommand("[data-media-library-widget-value=\"$widget_id\"]", 'val', [$ids])) ->addCommand(new InvokeCommand("[data-media-library-widget-update=\"$widget_id\"]", 'trigger', ['mousedown'])); return $response; } }