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;
}
}
