Unverified Commit 9a654bb0 authored by Alex Pott's avatar Alex Pott
Browse files

Issue #3044649 by phenaproxima, seanB, Wim Leers, alexpott: Delegate media...

Issue #3044649 by phenaproxima, seanB, Wim Leers, alexpott: Delegate media library selection handling to the "thing" that opened the library

(cherry picked from commit ca0ac736)
parent 03965a9b
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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
+31 −18
Original line number Diff line number Diff line
@@ -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;

/**
@@ -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.
   *
@@ -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;
  }

  /**
@@ -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')
    );
  }

@@ -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 = [
@@ -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.
+7 −3
Original line number Diff line number Diff line
@@ -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;

/**
@@ -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;
@@ -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')
    );
  }

+7 −3
Original line number Diff line number Diff line
@@ -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;

/**
@@ -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;
  }
@@ -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')
    );
  }

+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