insert-8.x-2.x-dev/modules/insert_media/insert_media.module

modules/insert_media/insert_media.module
<?php

/**
 * @file
 */

use Drupal\Core\Field\WidgetInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\insert\Utility\InsertUtility;
use Drupal\media\Entity\Media;

const INSERT_TYPE_MEDIA = 'media';

const INSERT_MEDIA_DEFAULT_SETTINGS = [
  'view_modes' => [],
  'default' => 'full',
];

/**
 * Implements hook_insert_widgets().
 */
function insert_media_insert_widgets() {
  return [INSERT_TYPE_MEDIA => ['media_library_widget']];
}

/**
 * Implements hook_field_widget_third_party_settings_form().
 */
function insert_media_field_widget_third_party_settings_form(WidgetInterface $plugin) {
  $pluginId = $plugin->getPluginId();

  if (InsertUtility::isSourceWidget($pluginId, INSERT_TYPE_MEDIA)) {
    return _insert_media_settings_form(_insert_media_settings($plugin));
  }

  return [];
}

/**
 * @param \Drupal\Core\Field\WidgetInterface $plugin
 * @return array
 */
function _insert_media_settings($plugin) {
  $settings = array_merge(
    INSERT_MEDIA_DEFAULT_SETTINGS,
    $plugin->getThirdPartySettings('insert_media')
  );

  if (!empty($settings['view_modes']['<all>'])) {
    $viewModeIds = array_keys(_insert_media_get_view_modes());
    $settings['view_modes'] = array_fill_keys($viewModeIds, $viewModeIds);
  }

  return $settings;
}

/**
 * @param array $settings
 * @return array
 */
function _insert_media_settings_form(array $settings) {
  $viewModes = _insert_media_get_view_modes();

  if (count($viewModes) === 0) {
    return [];
  }

  $element = [
    '#type' => 'details',
    '#title' => t('Insert Media'),
    '#weight' => 20,
  ];

  $element['view_modes_heading'] = [
    '#type' => 'markup',
    '#markup' => t('Select which view modes should be available for inserting media. If no view mode is selected, no Insert functionality will be available; If only one view mode is selected, that one is used automatically when inserting. If all view modes are selected, new view modes will be enabled by default.'),
    '#weight' => 21,
  ];

  $element['view_modes'] = [
    '#type' => 'table',
    '#default_value' => $settings['view_modes'],
    '#element_validate' => [[InsertUtility::class, 'validateList']],
    '#weight' => 22,
    '#tableselect' => TRUE,
    '#header' => [t('Select all')],
  ];

  foreach ($viewModes as $viewMode => $viewModeLabel) {
    $element['view_modes'][$viewMode][$viewMode] = [
      '#type' => 'markup',
      '#markup' => $viewModeLabel,
    ];
  }

  $element['default'] = [
    '#title' => t('Default view mode'),
    '#type' => 'select',
    '#options' => array_map(function ($viewModeLabel) {
      return $viewModeLabel;
    }, $viewModes),
    '#default_value' => $settings['default'],
    '#description' => t('Select the view mode which will be selected by default or used if no other view modes are enabled above.'),
    '#weight' => 23,
  ];

  return $element;
}

/**
 * Implements hook_insert_styles().
 */
function insert_media_insert_styles($insertType) {
  if ($insertType !== INSERT_TYPE_MEDIA) {
    return [];
  }

  $insertStyles = [];

  foreach (_insert_media_get_view_modes() as $id => $label) {
    $insertStyles[$id] = [
      'label' => $label,
    ];
  }

  return $insertStyles;
}

/**
 * Implements hook_insert_variables().
 */
function insert_media_insert_variables($insertType, array &$element, $styleName, &$vars) {
  if ($insertType === INSERT_TYPE_MEDIA) {
    $vars['media_entity'] = $element['selection'][0]['rendered_entity']['#media'];
    $element['#name'] = 'media_ ' . $vars['media_entity']->id();
  }
}

/**
 * Implements hook_insert_render().
 */
function insert_media_insert_render($styleName, array $vars, $insertElement) {
  if ($vars['field_type'] === INSERT_TYPE_MEDIA && isset($vars['media_entity'])) {
    /** @var \Drupal\media\MediaInterface $media */
    $media = $insertElement['rendered_entity']['#media'];
    return ['<drupal-media data-entity-type="media" data-view-mode="' . $vars['style_name'] .'" data-entity-uuid="' . $media->uuid() . '"></drupal-media>'];
  }
}

/**
 * Implements hook_insert_process().
 */
function insert_media_insert_process(&$insertType, array &$element) {
  if ($insertType !== INSERT_TYPE_MEDIA) {
    return [];
  }

  $settings = $element['#insert_media']['settings'];
  $element['#insert']['settings']['styles'] = $settings['view_modes'];
  $element['#insert']['settings']['default'] = $settings['default'];

  if (!array_filter($settings['view_modes'])) {
    return FALSE;
  }

  foreach ($element['selection'] as $key => &$selectionElement) {
    if (!is_int($key)) {
      continue;
    }

    $selectionElement['insert'] = $element['insert'];
  }

  $element['#attached']['library'][] = 'insert_media/insert_media';

  return ['selection'];
}

/**
 * Returns all media view modes.
 *
 * @return \Drupal\Core\Entity\EntityViewModeInterface[]
 */
function _insert_media_get_view_modes() {
  $viewModes = \Drupal::entityTypeManager()
    ->getStorage('entity_view_mode')
    ->loadByProperties(['targetEntityType' => 'media']);

  foreach ($viewModes as $id => $viewMode) {
    // Settings cannot be saved with a dot.
    $rekeyedViewModes[str_replace('media.', '', $id)] = $viewMode->label();
  }

  return $rekeyedViewModes;
}

/**
 * Implements hook_field_widget_single_element_form_alter().
 */
function insert_media_field_widget_single_element_form_alter(array &$element, FormStateInterface $form_state, array $context) {
  /** @var \Drupal\Core\Field\WidgetInterface $plugin */
  $plugin = $context['widget'];
  $pluginId = $plugin->getPluginId();

  if (InsertUtility::isSourceWidget($pluginId, INSERT_TYPE_MEDIA)) {
    $element['#insert_media'] = [
      'settings' => _insert_media_settings($plugin),
    ];
  }
}

/**
 * Implements hook_field_widget_settings_summary_alter().
 */
function insert_media_field_widget_settings_summary_alter(array &$summary, array $context) {
  /** @var \Drupal\Core\Field\WidgetInterface $plugin */
  $plugin = $context['widget'];
  $pluginId = $plugin->getPluginId();

  if (InsertUtility::isSourceWidget($pluginId, INSERT_TYPE_MEDIA)) {
    $viewModes = _insert_media_get_view_modes();
    $settings = _insert_media_settings($plugin);
    $activeViewModes = array_intersect_key($viewModes, array_filter($settings['view_modes']));

    $summary[] = t('Insert Media') . ': ' . (count($activeViewModes)
        ? implode(', ', array_map(function ($viewModeLabel) {
          return $viewModeLabel;
        }, $activeViewModes))
        : t('disabled')
      );
  }
}

/**
 * Implements hook_module_implements_alter().
 */
function insert_media_module_implements_alter(array &$implementations, $hook) {
  if ($hook === 'field_widget_third_party_settings_form') {
    // Move hook_field_widget_third_party_settings_form() implementation to the
    // end of the execution list to have it processed after
    // insert_field_widget_third_party_settings_form().
    $group = $implementations['insert_media'];
    unset($implementations['insert_media']);
    $implementations['insert_media'] = $group;
  }
}

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

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