class MediaDirectoriesLibraryUiBuilder in Media Directories 3.x
Service which builds the media library.
Hierarchy
- class \Drupal\media_library\MediaLibraryUiBuilder uses StringTranslationTrait
- class \Drupal\media_directories_ui\MediaDirectoriesLibraryUiBuilder
Expanded class hierarchy of MediaDirectoriesLibraryUiBuilder
2 files declare their use of MediaDirectoriesLibraryUiBuilder
- MediaDirectoriesLibraryWidget.php in modules/
media_directories_ui/ src/ Plugin/ Field/ FieldWidget/ MediaDirectoriesLibraryWidget.php - OEmbedForm.php in modules/
media_directories_ui/ src/ Form/ OEmbedForm.php
1 string reference to 'MediaDirectoriesLibraryUiBuilder'
- media_directories_ui.services.yml in modules/
media_directories_ui/ media_directories_ui.services.yml - modules/media_directories_ui/media_directories_ui.services.yml
1 service uses MediaDirectoriesLibraryUiBuilder
- media_directories_ui.ui_builder in modules/
media_directories_ui/ media_directories_ui.services.yml - Drupal\media_directories_ui\MediaDirectoriesLibraryUiBuilder
File
- modules/
media_directories_ui/ src/ MediaDirectoriesLibraryUiBuilder.php, line 18
Namespace
Drupal\media_directories_uiView source
class MediaDirectoriesLibraryUiBuilder extends MediaLibraryUiBuilder {
/**
* {@inheritdoc}
*/
public function buildUi(MediaLibraryState $state = NULL) {
if (!$state) {
$state = MediaDirectoriesLibraryState::fromRequest($this->request);
}
// When navigating to a media type through the vertical tabs, we only want
// to load the changed library content. This is not only more efficient, but
// also provides a more accessible user experience for screen readers.
if ($state
->get('media_library_content') === '1') {
return $this
->buildLibraryContent($state);
}
else {
return [
'#type' => 'html_tag',
'#tag' => 'div',
'#attributes' => [
'id' => 'media-library-wrapper',
'class' => [
'media-library-wrapper',
'media-directories-library-wrapper',
],
],
'tree' => $this
->buildMediaDirectoryTree($state),
'content' => $this
->buildLibraryContent($state),
// Attach the JavaScript for the media library UI. The number of
// available slots needs to be added to make sure users can't select
// more items than allowed.
'#attached' => [
'library' => [
'media_library/ui',
'media_directories_ui/media-ui',
],
'drupalSettings' => [
'media_library' => [
'selection_remaining' => $state
->getAvailableSlots(),
],
'media_directories' => [
'cardinality' => $state
->getAvailableSlots(),
// TODO migrate js code.
'remaining' => $state
->getAvailableSlots(),
'target_bundles' => $state
->getAllowedTypeIds(),
'url' => [
'directory.tree' => Url::fromRoute('media_directories_ui.directory.tree')
->toString(),
'directory.add' => Url::fromRoute('media_directories_ui.directory.add')
->toString(),
'directory.rename' => Url::fromRoute('media_directories_ui.directory.rename')
->toString(),
'directory.delete' => Url::fromRoute('media_directories_ui.directory.delete')
->toString(),
'directory.move' => Url::fromRoute('media_directories_ui.directory.move')
->toString(),
'media.add' => Url::fromRoute('media_directories_ui.media.add')
->toString(),
'media.edit' => Url::fromRoute('media_directories_ui.media.edit')
->toString(),
'media.move' => Url::fromRoute('media_directories_ui.media.move')
->toString(),
'media.delete' => Url::fromRoute('media_directories_ui.media.delete')
->toString(),
],
],
],
],
];
}
}
public function buildUploadUi(MediaLibraryState $state = NULL) {
return $this
->buildLibraryUpload($state);
}
/**
* {@inheritdoc}
*/
protected function buildLibraryContent(MediaLibraryState $state) {
return [
'#type' => 'html_tag',
'#tag' => 'div',
'#attributes' => [
'id' => 'media-library-content',
'class' => [
'media-library-content',
'media-directories-library-content',
],
],
'view' => $this
->buildMediaLibraryView($state),
];
}
protected function buildLibraryUpload(MediaLibraryState $state) {
return [
'#theme' => 'media_directories_add',
'links' => $this
->buildMediaTypeMenu($state),
'form' => $this
->buildMediaTypeAddForm($state),
];
}
/**
* {@inheritdoc}
*/
public function checkAccess(AccountInterface $account, MediaLibraryState $state = NULL) {
if (!$state) {
try {
$state = MediaDirectoriesLibraryState::fromRequest($this->request);
} catch (BadRequestHttpException $e) {
return AccessResult::forbidden($e
->getMessage());
} catch (\InvalidArgumentException $e) {
return AccessResult::forbidden($e
->getMessage());
}
}
// We override state object with our own, other logic can be same.
return parent::checkAccess($account, $state);
}
/**
* Build directory tree container.
*
* @param \Drupal\media_library\MediaLibraryState $state
*
* @return array
*/
protected function buildMediaDirectoryTree(MediaLibraryState $state) {
return [
'#theme' => 'media_directories_tree',
];
}
/**
* {@inheritdoc}
*/
protected function buildMediaTypeMenu(MediaLibraryState $state) {
// Add the menu for each type if we have more than 1 media type enabled for
// the field.
$allowed_type_ids = $state
->getAllowedTypeIds();
if (count($allowed_type_ids) <= 1) {
return [];
}
// @todo: Add a class to the li element.
// https://www.drupal.org/project/drupal/issues/3029227
$menu = [
'#theme' => 'links',
'#links' => [],
'#attributes' => [
'class' => [
'media-library-menu',
'js-media-library-menu',
],
],
];
$allowed_types = $this->entityTypeManager
->getStorage('media_type')
->loadMultiple($allowed_type_ids);
$selected_type_id = $state
->getSelectedTypeId();
foreach ($allowed_types as $allowed_type_id => $allowed_type) {
$link_state = MediaDirectoriesLibraryState::create($state
->getOpenerId(), $state
->getAllowedTypeIds(), $allowed_type_id, $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);
$title = $allowed_type
->label();
$display_title = [
'#markup' => $this
->t('<span class="visually-hidden">Show </span>@title<span class="visually-hidden"> media</span>', [
'@title' => $title,
]),
];
if ($allowed_type_id === $selected_type_id) {
$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-menu-' . $allowed_type_id] = [
'title' => $display_title,
'url' => Url::fromRoute('media_directories_ui.media.add', [], [
'query' => $link_state
->all(),
]),
'attributes' => [
'class' => [
'media-library-menu__link',
],
'role' => 'button',
'data-title' => $title,
],
];
}
// Set the active menu item.
$menu['#links']['media-library-menu-' . $selected_type_id]['attributes']['class'][] = 'active';
return $menu;
}
/**
* {@inheritdoc}
*/
protected function buildMediaTypeAddForm(MediaLibraryState $state) {
$selected_type_id = $state
->getSelectedTypeId();
if (!$this->entityTypeManager
->getAccessControlHandler('media')
->createAccess($selected_type_id)) {
return [];
}
$selected_type = $this->entityTypeManager
->getStorage('media_type')
->load($selected_type_id);
$plugin_definition = $selected_type
->getSource()
->getPluginDefinition();
if (empty($plugin_definition['forms']['media_library_add'])) {
return [];
}
$source_field = $selected_type
->getSource()
->getConfiguration()['source_field'];
$field_config = $this->entityTypeManager
->getStorage('field_config')
->load('media.' . $selected_type
->id() . '.' . $source_field);
// 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);
if (in_array($field_config
->getType(), [
'file',
'image',
])) {
$form = \Drupal::formBuilder()
->buildForm(FileUploadForm::class, $form_state);
}
else {
$form = \Drupal::formBuilder()
->buildForm(OEmbedForm::class, $form_state);
}
return $form;
}
/**
* {@inheritdoc}
*/
protected function buildMediaLibraryView(MediaLibraryState $state) {
// @todo Make the view configurable in
// https://www.drupal.org/project/drupal/issues/2971209
$view = $this->entityTypeManager
->getStorage('view')
->load('media_directories_library');
$view_executable = $this->viewsExecutableFactory
->get($view);
$display_id = 'widget';
// Make sure the state parameters are set in the request so the view can
// pass the parameters along in the pager, filters etc.
$view_request = $view_executable
->getRequest();
$view_request->query
->add($state
->all());
$view_executable
->setRequest($view_request);
$args = [];
// Make sure the state parameters are set in the request so the view can
// pass the parameters along in the pager, filters etc.
$request = $view_executable
->getRequest();
$request->query
->add($state
->all());
$view_executable
->setRequest($request);
$view_executable
->setDisplay($display_id);
$view_executable
->preExecute($args);
$view_executable
->execute($display_id);
$renderable = $view_executable
->buildRenderable($display_id, $args, FALSE);
return $renderable;
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
MediaDirectoriesLibraryUiBuilder:: |
protected | function |
Build the media library content area. Overrides MediaLibraryUiBuilder:: |
|
MediaDirectoriesLibraryUiBuilder:: |
protected | function | ||
MediaDirectoriesLibraryUiBuilder:: |
protected | function | Build directory tree container. | |
MediaDirectoriesLibraryUiBuilder:: |
protected | function |
Get the media library view. Overrides MediaLibraryUiBuilder:: |
|
MediaDirectoriesLibraryUiBuilder:: |
protected | function |
Get the add form for the selected media type. Overrides MediaLibraryUiBuilder:: |
|
MediaDirectoriesLibraryUiBuilder:: |
protected | function |
Get the media type menu for the media library. Overrides MediaLibraryUiBuilder:: |
|
MediaDirectoriesLibraryUiBuilder:: |
public | function |
Build the media library UI. Overrides MediaLibraryUiBuilder:: |
|
MediaDirectoriesLibraryUiBuilder:: |
public | function | ||
MediaDirectoriesLibraryUiBuilder:: |
public | function |
Check access to the media library. Overrides MediaLibraryUiBuilder:: |
|
MediaLibraryUiBuilder:: |
protected | property | The entity type manager. | |
MediaLibraryUiBuilder:: |
protected | property | The form builder. | |
MediaLibraryUiBuilder:: |
protected | property | The media library opener resolver. | |
MediaLibraryUiBuilder:: |
protected | property | The currently active request object. | |
MediaLibraryUiBuilder:: |
protected | property | The views executable factory. | |
MediaLibraryUiBuilder:: |
public static | function | Get media library dialog options. | |
MediaLibraryUiBuilder:: |
public | function | Constructs a MediaLibraryUiBuilder instance. | |
StringTranslationTrait:: |
protected | property | The string translation service. | 4 |
StringTranslationTrait:: |
protected | function | Formats a string containing a count of items. | |
StringTranslationTrait:: |
protected | function | Returns the number of plurals supported by a given language. | |
StringTranslationTrait:: |
protected | function | Gets the string translation service. | |
StringTranslationTrait:: |
public | function | Sets the string translation service to use. | 2 |
StringTranslationTrait:: |
protected | function | Translates a string to the current language or to a given language. |