media_library_extended-1.x-dev/src/MediaLibraryExtendUiBuilder.php

src/MediaLibraryExtendUiBuilder.php
<?php

namespace Drupal\media_library_extended;

use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Form\FormBuilderInterface;
use Drupal\Core\Form\FormState;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Url;
use Drupal\media_library\MediaLibraryState;
use Drupal\media_library\MediaLibraryUiBuilder;
use Drupal\media_library\OpenerResolverInterface;
use Drupal\views\ViewExecutableFactory;
use Symfony\Component\HttpFoundation\RequestStack;

/**
 * Service decorator which builds the media library with extension support.
 */
class MediaLibraryExtendUiBuilder extends MediaLibraryUiBuilder {

  /**
   * Constructs a MediaLibraryExtendUiBuilder instance.
   *
   * @param \Drupal\media_library\MediaLibraryUiBuilder $inner_service
   *   The media library ui builder.
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
   *   The entity type manager.
   * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
   *   The request stack.
   * @param \Drupal\views\ViewExecutableFactory $views_executable_factory
   *   The views executable factory.
   * @param \Drupal\Core\Form\FormBuilderInterface $form_builder
   *   The currently active request object.
   * @param \Drupal\media_library\OpenerResolverInterface|null $opener_resolver
   *   The opener resolver.
   */
  public function __construct(MediaLibraryUiBuilder $inner_service, EntityTypeManagerInterface $entity_type_manager, RequestStack $request_stack, ViewExecutableFactory $views_executable_factory, FormBuilderInterface $form_builder, OpenerResolverInterface $opener_resolver = NULL) {
    // @todo Add class attributes.
    $this->innerService = $inner_service;
    parent::__construct($entity_type_manager, $request_stack, $views_executable_factory, $form_builder, $opener_resolver);
  }

  /**
   * {@inheritdoc}
   */
  public static function dialogOptions() {
    return $this->innerService->dialogOptions();
  }

  /**
   * {@inheritdoc}
   */
  protected function buildLibraryContent(MediaLibraryState $state) {
    if ($state->get('media_library_extended') !== '1') {
      return parent::buildLibraryContent($state);
    }

    // After the form to add new media is submitted, we need to rebuild the
    // media library with a new instance of the media add form. The form API
    // allows us to do that by forcing empty user input.
    // @see \Drupal\Core\Form\FormBuilder::doBuildForm()
    $form_state = new FormState();
    if ($state->get('_media_library_form_rebuild')) {
      $form_state->setUserInput([]);
      $state->remove('_media_library_form_rebuild');
    }
    $form_state->set('media_library_state', $state);
    $pane = $this->entityTypeManager->getStorage('media_library_pane')
      ->load($state->get('pane_id'));
    $form_state->set('pane', $pane);
    $form_state->set('source_plugin', $pane->getPlugin());

    $form = $this->formBuilder->buildForm('\Drupal\media_library_extended\Form\PaneSelectForm', $form_state);

    return [
      '#type' => 'html_tag',
      '#tag' => 'div',
      '#attributes' => [
        'id' => 'media-library-content',
        'class' => ['media-library-content'],
        'tabindex' => -1,
      ],
      'view' => $form,
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function checkAccess(AccountInterface $account, MediaLibraryState $state = NULL) {
    return $this->innerService->checkAccess($account, $state);
  }

  /**
   * {@inheritdoc}
   */
  protected function buildMediaTypeMenu(MediaLibraryState $state) {
    $allowed_types = $state->getAllowedTypeIds();
    if (count($allowed_types) === 1) {
      // @todo Exit early if no panes are configured.
      // @todo Propose refactor of buildMediaTypeMenu upstream to make this
      // less hacky.
      $allowed_type = key($allowed_types);
      $forced_tabs_types = $allowed_types + ['' => $allowed_type];
      $state->set('media_library_allowed_types', $forced_tabs_types);
      $menu = $this->innerService->buildMediaTypeMenu($state);
      $state->set('media_library_allowed_types', $allowed_types);
    }
    else {
      $menu = $this->innerService->buildMediaTypeMenu($state);
    }

    $panes = $this->entityTypeManager->getStorage('media_library_pane')
      ->loadByProperties(['bundle' => $allowed_types]);
    foreach ($panes as $pane_id => $pane) {
      $bundle = $pane->getTargetBundle();
      $plugin = $pane->getPlugin();
      $link_state = MediaLibraryState::create($state->getOpenerId(), $allowed_types, $pane->getTargetBundle(), $state->getAvailableSlots(), $state->getOpenerParameters());
      // Add the 'media_library_content' parameter so the response will
      // contain only the updated content for the tab.
      // @see self::buildUi()
      $link_state->set('media_library_content', 1);

      // Add the 'media_library_extend' parameter so the response will contain
      // the alternative media listing.
      $link_state->set('media_library_extended', 1);
      // @todo Set pane instead.
      $link_state->set('pane_id', $pane_id);

      $title = $pane->label();
      $display_title = [
        '#markup' => $this->t('<span class="visually-hidden">Show </span>@title<span class="visually-hidden"> media</span>', [
          '@title' => $title,
        ]),
      ];
      if ($state->get('media_library_extended') === '1') {
        $display_title = [
          '#markup' => $this->t('<span class="visually-hidden">Show </span>@title<span class="visually-hidden"> media</span><span class="active-tab visually-hidden"> (selected)</span>', [
            '@title' => $title,
          ]),
        ];
      }

      $menu['#links']['media-library-extend-' . $pane_id] = [
        'title' => $display_title,
        'url' => Url::fromRoute('media_library.ui', [], [
          'query' => $link_state->all(),
        ]),
        'attributes' => [
          'class' => ['media-library-menu__link'],
          'role' => 'button',
          'data-title' => $title,
        ],
      ];
    }

    // @todo Rewrite active class on existing menu item.
    return $menu;
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc