media_directories_ui.module in Media Directories 3.x
Same filename and directory in other branches
Main module file.
File
modules/media_directories_ui/media_directories_ui.moduleView source
<?php
/**
* @file
* Main module file.
*/
use Drupal\Component\Utility\UrlHelper;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Url;
use Drupal\media\MediaTypeForm;
use Drupal\views\Form\ViewsForm;
use Drupal\views\Plugin\views\cache\CachePluginBase;
use Drupal\views\ViewExecutable;
/**
* Implements hook_theme().
*/
function media_directories_ui_theme($existing, $type, $theme, $path) {
return [
'media_directories_browser' => [
'render element' => 'browser',
],
'media_directories_tree' => [
'render element' => 'content',
],
'media_directories_add' => [
'render element' => 'content',
],
'views_view__media_directories_library' => [
'base hook' => 'views_view',
'template' => 'views-view--media-directories-library',
],
];
}
/**
* Implements hook_preprocess_views_view_fields().
*/
function media_directories_ui_preprocess_views_view_fields(&$variables) {
// Add classes to media rendered entity field so it can be targeted for
// styling and JavaScript mouseover and click events.
if ($variables['view']
->id() === 'media_directories_library' && isset($variables['fields']['rendered_entity'])) {
if (isset($variables['fields']['rendered_entity']->wrapper_attributes)) {
$variables['fields']['rendered_entity']->wrapper_attributes
->addClass('js-click-to-select-trigger media-library-item__click-to-select-trigger');
}
}
}
/**
* Implements hook_form_alter().
*/
function media_directories_ui_form_alter(array &$form, FormStateInterface $form_state, $form_id) {
$form_object = $form_state
->getFormObject();
if ($form_object instanceof ViewsForm && strpos($form_object
->getBaseFormId(), 'views_form_media_directories_library') === 0) {
$form['#attributes']['class'][] = 'media-library-views-form';
if (isset($form['header'])) {
$form['header']['#attributes']['class'][] = 'media-library-views-form__header';
$form['header']['media_bulk_form']['#attributes']['class'][] = 'media-library-views-form__bulk_form';
}
$form['actions']['submit']['#ajax']['url'] = Url::fromRoute('media_directories_library.ui');
}
// Add after build to fix media library views exposed filter's submit button.
if ($form_id === 'views_exposed_form' && strpos($form['#id'], 'views-exposed-form-media-directories-library-widget') === 0) {
$form['#after_build'][] = '_media_library_views_form_media_library_after_build';
}
// Configures media_library displays when a type is submitted.
if ($form_object instanceof MediaTypeForm) {
$form['actions']['submit']['#submit'][] = '_media_library_media_type_form_submit';
}
}
/**
* Implements hook_preprocess_HOOK().
*/
function media_directories_ui_preprocess_views_view__media_directories_library(&$variables) {
/** @var \Drupal\views\ViewExecutable $view */
$view = $variables['view'];
if ($view->current_display === 'widget') {
$state = \Drupal\media_directories_ui\MediaDirectoriesLibraryState::fromRequest($view
->getRequest());
// These could cause issues.
$state
->remove('destination');
$state
->remove('ajax_form');
$state
->remove('_wrapper_format');
// Remove rebuild key from state, this will cause issues.
// If this is present, upload form will ignore form submits.
$state
->remove('_media_library_form_rebuild');
$variables['upload_link'] = [
'#type' => 'link',
'#title' => t('Upload media'),
'#url' => Url::fromRoute('media_directories_ui.media.add', [], [
'query' => $state
->all(),
]),
'#attributes' => [
'class' => [
'button',
'use-ajax',
],
],
];
}
}
/**
* Implements hook_views_post_render().
*/
function media_directories_ui_views_post_render(ViewExecutable $view, &$output, CachePluginBase $cache) {
if ($view
->id() === 'media_directories_library') {
$output['#attached']['library'][] = 'media_library/view';
if (strpos($view->current_display, 'widget') === 0) {
try {
$query = \Drupal\media_directories_ui\MediaDirectoriesLibraryState::fromRequest($view
->getRequest())
->all();
} catch (InvalidArgumentException $e) {
// MediaLibraryState::fromRequest() will throw an exception if the view
// is being previewed, since not all required query parameters will be
// present. In a preview, however, this can be omitted since we're
// merely previewing.
// @todo Use the views API for checking for the preview mode when it
// lands. https://www.drupal.org/project/drupal/issues/3060855
if (empty($view->preview) && empty($view->live_preview)) {
throw $e;
}
}
// If the current query contains any parameters we use to contextually
// filter the view, ensure they persist across AJAX rebuilds.
// The ajax_path is shared for all AJAX views on the page, but our query
// parameters are prefixed and should not interfere with any other views.
// @todo Rework or remove this in https://www.drupal.org/node/2983451
if (!empty($query)) {
$ajax_path =& $output['#attached']['drupalSettings']['views']['ajax_path'];
$parsed_url = UrlHelper::parse($ajax_path);
$query = array_merge($query, $parsed_url['query']);
$ajax_path = $parsed_url['path'] . '?' . UrlHelper::buildQuery($query);
}
}
}
}
Functions
Name![]() |
Description |
---|---|
media_directories_ui_form_alter | Implements hook_form_alter(). |
media_directories_ui_preprocess_views_view_fields | Implements hook_preprocess_views_view_fields(). |
media_directories_ui_preprocess_views_view__media_directories_library | Implements hook_preprocess_HOOK(). |
media_directories_ui_theme | Implements hook_theme(). |
media_directories_ui_views_post_render | Implements hook_views_post_render(). |