drowl_media-8.x-2.0-rc0/modules/drowl_media_types/drowl_media_types.install
modules/drowl_media_types/drowl_media_types.install
<?php
/**
* @file
* Install, update and uninstall functions for the DROWL Media Types module.
*/
use Drupal\field\Entity\FieldConfig;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\field\FieldStorageConfigInterface;
use Symfony\Component\Yaml\Yaml;
/**
* Implements hook_install().
*/
function drowl_media_types_install($is_syncing) {
$configFactory = \Drupal::configFactory();
// The following configs are already defined in core, but ours have further
// adjustments. We need to override the core configs to avoid conflicts.
$modulePath = \Drupal::service('extension.list.module')->getPath('drowl_media_types');
$configIDs = [
'core.entity_form_display.media.document.default',
'core.entity_form_display.media.remote_video.default',
'core.entity_form_display.media.video.default',
'core.entity_view_display.media.document.default',
'core.entity_view_display.media.document.media_library',
'core.entity_view_display.media.image.default',
'core.entity_view_display.media.image.media_library',
'core.entity_view_display.media.remote_video.default',
'core.entity_view_display.media.remote_video.media_library',
'core.entity_view_display.media.video.default',
'core.entity_view_display.media.video.media_library',
'field.field.media.remote_video.field_media_oembed_video',
'field.field.media.video.field_media_video_file',
'field.storage.media.field_media_document',
'field.storage.media.field_media_image',
'field.storage.media.field_media_video_file',
'media.type.remote_video',
'media.type.video',
];
foreach ($configIDs as $configId) {
// Delete old config if it exists.
$config = $configFactory->getEditable($configId);
if (empty($config)) {
continue;
}
$newConfigPath = $modulePath . '/config/override/' . $configId . '.yml';
$data = Yaml::parseFile($newConfigPath);
$config->setData($data);
}
}
/**
* Add bundle field to media_library widget display.
*/
function drowl_media_types_update_8001(&$sandbox) {
// For existing sites we.
$view = \Drupal::entityTypeManager()->getStorage('view')->load('media_library');
if (!empty($view)) {
$viewWidgetDisplay =& $view->getDisplay('widget');
if (empty($viewWidgetDisplay['display_options']['fields']['bundle'])) {
// Definition of the new bundle field:
$bundleField = [
'bundle' => [
'id' => 'bundle',
'table' => 'media_field_data',
'field' => 'bundle',
'relationship' => 'none',
'group_type' => 'group',
'admin_label' => '',
'entity_type' => 'media',
'entity_field' => 'bundle',
'plugin_id' => 'field',
'label' => '',
'exclude' => FALSE,
'alter' => [
'alter_text' => FALSE,
'text' => '',
'make_link' => FALSE,
'path' => '',
'absolute' => FALSE,
'external' => FALSE,
'replace_spaces' => FALSE,
'path_case' => 'none',
'trim_whitespace' => FALSE,
'alt' => '',
'rel' => '',
'link_class' => '',
'prefix' => '',
'suffix' => '',
'target' => '',
'nl2br' => FALSE,
'max_length' => 0,
'word_boundary' => TRUE,
'ellipsis' => TRUE,
'more_link' => FALSE,
'more_link_text' => '',
'more_link_path' => '',
'strip_tags' => FALSE,
'trim' => FALSE,
'preserve_tags' => '',
'html' => FALSE,
],
'element_type' => '',
'element_class' => '',
'element_label_type' => '',
'element_label_class' => '',
'element_label_colon' => FALSE,
'element_wrapper_type' => '',
'element_wrapper_class' => '',
'element_default_classes' => TRUE,
'empty' => '',
'hide_empty' => FALSE,
'empty_zero' => FALSE,
'hide_alter_empty' => TRUE,
'click_sort_column' => 'target_id',
'type' => 'entity_reference_label',
'settings' => [
'link' => FALSE,
],
'group_column' => 'target_id',
'group_columns' => [],
'group_rows' => TRUE,
'delta_limit' => 0,
'delta_offset' => 0,
'delta_reversed' => FALSE,
'delta_first_last' => FALSE,
'multi_type' => 'separator',
'separator' => ', ',
'field_api_classes' => FALSE,
],
];
// Prepend the bundle field associatively:
$viewWidgetDisplay['display_options']['fields'] = $bundleField + $viewWidgetDisplay['display_options']['fields'];
$view->save();
return 'Added "bundle" field successfully to view "media_library" > "widget" display.';
}
else {
return 'Adding "bundle" field to view "media_library" > "widget" display was skipped as the field already exists there.';
}
}
else {
return 'Adding "bundle" field to view "media_library" > "widget" display FAILED. View "media_library" could not be found.';
}
}
/**
* Remove "published" filter from "media_library" > "widget" display.
*/
function drowl_media_types_update_8002(&$sandbox) {
// For existing sites we.
$view = \Drupal::entityTypeManager()->getStorage('view')->load('media_library');
if (!empty($view)) {
// "widget" display:
$viewWidgetDisplay =& $view->getDisplay('widget');
if (!empty($viewWidgetDisplay['display_options']['filters']['status'])) {
// Remove status (published) filter:
unset($viewWidgetDisplay['display_options']['filters']['status']);
$view->save();
return 'Removed "status" (published) filter successfully from view "media_library" > "widget" display.';
}
else {
return 'No "status" (published) filter found in view "media_library" > "widget" display. Skipping.';
}
}
else {
return 'Removing "status" filter from view "media_library" > "widget" display FAILED. View "media_library" could not be found.';
}
}
/**
* Remove "published" filter from "media_library" > "widget_table" display.
*/
function drowl_media_types_update_8003(&$sandbox) {
// For existing sites we.
$view = \Drupal::entityTypeManager()->getStorage('view')->load('media_library');
if (!empty($view)) {
// "widget" display:
$viewWidgetDisplay =& $view->getDisplay('widget_table');
if (!empty($viewWidgetDisplay['display_options']['filters']['status'])) {
// Remove status (published) filter:
unset($viewWidgetDisplay['display_options']['filters']['status']);
$view->save();
return 'Removed "status" (published) filter successfully from view "media_library" > "widget_table" display.';
}
else {
return 'No "status" (published) filter found in view "media_library" > "widget_table" display. Skipping.';
}
}
else {
return 'Removing "status" filter from view "media_library" > "widget_table" display FAILED. View "media_library" could not be found.';
}
}
/**
* Install new media viewmode media_object and document.media_object.
*/
function drowl_media_types_update_8004(&$sandbox) {
$config_ids = [
'core.entity_view_mode.media.media_object',
'core.entity_view_display.media.document.media_object',
];
foreach ($config_ids as $config_id) {
$config_path = \Drupal::service('extension.list.module')->getPath('drowl_media_types') . '/config/install/' . $config_id . '.yml';
$data = Yaml::parseFile($config_path);
\Drupal::configFactory()->getEditable($config_id)->setData($data)->save(TRUE);
}
}
/**
* A mapping constant that maps old field names to new field names.
*
* This const is used for the "drowl_media_types_update_8005()" update hook.
*/
const DROWL_MEDIA_TYPES_UPDATE_8005_FIELD_NAME_MAPPING = [
'field_document' => 'field_media_document',
'field_image' => 'field_media_image',
'field_video_file' => 'field_media_video_file',
];
/**
* Rename the media fields on the schema.
*
* This is done, to conform with the new drupal core naming. IMPORTANT:
* some view and form display configs will not get properly updated through this
* update hook. Please export your config and adjust the following view_display
* settings manually (You can simply search for the old field names
* "field_document", "field_image" and "field_video_file" and replace them with
* the new field names "field_media_document", "field_media_image" and
* "field_media_video_file", but make sure they only contain that word exactly).
*
* Here is the list on what exactly is missing:
*
* hidden -> The hidden section inside both view and form displays still
* contains old field names. You should manually adjust these to the new field.
*
* content (view display only) -> When a content section holds either the
* "field_media_document" or the "field_media_video_file", you need to manually
* adjust the settings "link_title" and / or "link_text" as it both might still
* contain the old field name.
*
* third_party_settings -> The crop settings might still contain the old field
* name. You should manually adjust these settings as well.
*
* Furthermore, you should diff the config before and after update, since Drupal
* seems to unintentionally delete all available "entity_view_display"
* translations. This is a bug in core and should
*/
function drowl_media_types_update_8005(&$sandbox) {
foreach (DROWL_MEDIA_TYPES_UPDATE_8005_FIELD_NAME_MAPPING as $oldFieldName => $newFieldName) {
drowl_media_types_execute_field_rename('media', $oldFieldName, $newFieldName, TRUE);
}
// Load the old configs and media.type configs and update the
// "source_configuration" key.
$mediaTypeConfigs = \Drupal::entityTypeManager()->getStorage('media_type')->loadMultiple();
foreach ($mediaTypeConfigs as $mediaTypeConfig) {
$sourceConfiguration = $mediaTypeConfig->get('source_configuration');
foreach (DROWL_MEDIA_TYPES_UPDATE_8005_FIELD_NAME_MAPPING as $oldFieldName => $newFieldName) {
if ($sourceConfiguration['source_field'] === $oldFieldName) {
$sourceConfiguration['source_field'] = $newFieldName;
$mediaTypeConfig->set('source_configuration', $sourceConfiguration);
$mediaTypeConfig->save();
}
}
}
}
/**
* Set Media Slide field_overlay_position* and field_overlay_sizing* defaults.
*/
function drowl_media_types_update_8006(&$sandbox) {
// field_overlay_position_lg:
FieldConfig::loadByName('media', 'slide', 'field_overlay_position_lg')
->setRequired(TRUE)
->setDefaultValue(['value' => 'disabled'])
->save();
// field_overlay_position_md:
FieldConfig::loadByName('media', 'slide', 'field_overlay_position_md')
->setRequired(TRUE)
->setDefaultValue(['value' => 'disabled'])
->save();
// field_overlay_position:
FieldConfig::loadByName('media', 'slide', 'field_overlay_position')
->setRequired(TRUE)
->setDefaultValue(['value' => 'disabled'])
->save();
// field_overlay_sizing_lg:
FieldConfig::loadByName('media', 'slide', 'field_overlay_sizing_lg')
->setRequired(TRUE)
->setDefaultValue(['value' => 'seperate-box'])
->save();
// field_overlay_sizing_md:
FieldConfig::loadByName('media', 'slide', 'field_overlay_sizing_md')
->setRequired(TRUE)
->setDefaultValue(['value' => 'seperate-box'])
->save();
// field_overlay_sizing:
FieldConfig::loadByName('media', 'slide', 'field_overlay_sizing')
->setRequired(TRUE)
->setDefaultValue(['value' => 'full-size'])
->save();
}
/**
* Make the default value of slide and slideshow fields editable.
*/
function drowl_media_types_update_8007(&$sandbox) {
$configFactory = \Drupal::configFactory();
// Add the default values to the new settings page config storage:
$configFactory->getEditable('drowl_media_types.settings')
->set('defaults.slide.image_animation', 'ken-burns')
->set('defaults.slide.overlay_button_color', 'dark')
->set('defaults.slide.overlay_button_style', 'regular')
->set('defaults.slide.overlay_display', 'light')
->set('defaults.slide.overlay_position_lg', 'disabled')
->set('defaults.slide.overlay_position_md', 'disabled')
->set('defaults.slide.overlay_position', 'disabled')
->set('defaults.slide.overlay_sizing_lg', 'seperate-box')
->set('defaults.slide.overlay_sizing_md', 'seperate-box')
->set('defaults.slide.overlay_sizing', 'full-size')
->set('defaults.slideshow.slide_arrows', 'default')
->set('defaults.slideshow.slide_autoplay', 'default')
->set('defaults.slideshow.slide_dots', 'default')
->set('defaults.slideshow.slide_height', 'auto')
->set('defaults.slideshow.slide_infinite', 'default')
->save();
// Change the value tables and callback functions of existing fields:
$configFactory->getEditable('field.field.media.slide.field_image_animation')
->set('default_value', [])
->set('default_value_callback', '\Drupal\drowl_media_types\DrowlMediaTypesFieldValuesProvider::getImageAnimationDefaultValue')
->save();
$configFactory->getEditable('field.field.media.slide.field_overlay_button_color')
->set('default_value', [])
->set('default_value_callback', '\Drupal\drowl_media_types\DrowlMediaTypesFieldValuesProvider::getOverlayButtonColorDefaultValue')
->save();
$configFactory->getEditable('field.field.media.slide.field_overlay_button_style')
->set('default_value', [])
->set('default_value_callback', '\Drupal\drowl_media_types\DrowlMediaTypesFieldValuesProvider::getOverlayButtonStyleDefaultValue')
->save();
$configFactory->getEditable('field.field.media.slide.field_overlay_display')
->set('default_value', [])
->set('default_value_callback', '\Drupal\drowl_media_types\DrowlMediaTypesFieldValuesProvider::getOverlayDisplayDefaultValue')
->save();
$configFactory->getEditable('field.field.media.slide.field_overlay_position')
->set('default_value', [])
->set('default_value_callback', '\Drupal\drowl_media_types\DrowlMediaTypesFieldValuesProvider::getOverlayPositionDefaultValue')
->save();
$configFactory->getEditable('field.field.media.slide.field_overlay_position_lg')
->set('default_value', [])
->set('default_value_callback', '\Drupal\drowl_media_types\DrowlMediaTypesFieldValuesProvider::getOverlayPositionLgDefaultValue')
->save();
$configFactory->getEditable('field.field.media.slide.field_overlay_position_md')
->set('default_value', [])
->set('default_value_callback', '\Drupal\drowl_media_types\DrowlMediaTypesFieldValuesProvider::getOverlayPositionMdDefaultValue')
->save();
$configFactory->getEditable('field.field.media.slide.field_overlay_sizing')
->set('default_value', [])
->set('default_value_callback', '\Drupal\drowl_media_types\DrowlMediaTypesFieldValuesProvider::getOverlaySizingDefaultValue')
->save();
$configFactory->getEditable('field.field.media.slide.field_overlay_sizing_lg')
->set('default_value', [])
->set('default_value_callback', '\Drupal\drowl_media_types\DrowlMediaTypesFieldValuesProvider::getOverlaySizingLgDefaultValue')
->save();
$configFactory->getEditable('field.field.media.slide.field_overlay_sizing_md')
->set('default_value', [])
->set('default_value_callback', '\Drupal\drowl_media_types\DrowlMediaTypesFieldValuesProvider::getOverlaySizingMdDefaultValue')
->save();
$configFactory->getEditable('field.field.media.slideshow.field_slide_arrows')
->set('default_value', [])
->set('default_value_callback', '\Drupal\drowl_media_types\DrowlMediaTypesFieldValuesProvider::getSlideArrowsDefaultValue')
->save();
$configFactory->getEditable('field.field.media.slideshow.field_slide_autoplay')
->set('default_value', [])
->set('default_value_callback', '\Drupal\drowl_media_types\DrowlMediaTypesFieldValuesProvider::getSlideAutoplayDefaultValue')
->save();
$configFactory->getEditable('field.field.media.slideshow.field_slide_dots')
->set('default_value', [])
->set('default_value_callback', '\Drupal\drowl_media_types\DrowlMediaTypesFieldValuesProvider::getSlideDotsDefaultValue')
->save();
$configFactory->getEditable('field.field.media.slideshow.field_slide_height')
->set('default_value', [])
->set('default_value_callback', '\Drupal\drowl_media_types\DrowlMediaTypesFieldValuesProvider::getSlideHeightDefaultValue')
->save();
$configFactory->getEditable('field.field.media.slideshow.field_slide_infinite')
->set('default_value', [])
->set('default_value_callback', '\Drupal\drowl_media_types\DrowlMediaTypesFieldValuesProvider::getSlideInfiniteDefaultValue')
->save();
$configFactory->getEditable('field.storage.media.field_image_animation')
->set('settings.allowed_values', [])
->set('settings.allowed_values_function', '\Drupal\drowl_media_types\DrowlMediaTypesFieldValuesProvider::getImageAnimationValues')
->save();
$configFactory->getEditable('field.storage.media.field_overlay_button_color')
->set('settings.allowed_values', [])
->set('settings.allowed_values_function', '\Drupal\drowl_media_types\DrowlMediaTypesFieldValuesProvider::getOverlayButtonColorValues')
->save();
$configFactory->getEditable('field.storage.media.field_overlay_button_style')
->set('settings.allowed_values', [])
->set('settings.allowed_values_function', '\Drupal\drowl_media_types\DrowlMediaTypesFieldValuesProvider::getOverlayButtonStyleValues')
->save();
$configFactory->getEditable('field.storage.media.field_overlay_display')
->set('settings.allowed_values', [])
->set('settings.allowed_values_function', '\Drupal\drowl_media_types\DrowlMediaTypesFieldValuesProvider::getOverlayDisplayValues')
->save();
$configFactory->getEditable('field.storage.media.field_overlay_position')
->set('settings.allowed_values', [])
->set('settings.allowed_values_function', '\Drupal\drowl_media_types\DrowlMediaTypesFieldValuesProvider::getOverlayPositionValues')
->save();
$configFactory->getEditable('field.storage.media.field_overlay_position_lg')
->set('settings.allowed_values', [])
->set('settings.allowed_values_function', '\Drupal\drowl_media_types\DrowlMediaTypesFieldValuesProvider::getOverlayPositionValues')
->save();
$configFactory->getEditable('field.storage.media.field_overlay_position_md')
->set('settings.allowed_values', [])
->set('settings.allowed_values_function', '\Drupal\drowl_media_types\DrowlMediaTypesFieldValuesProvider::getOverlayPositionValues')
->save();
$configFactory->getEditable('field.storage.media.field_overlay_sizing')
->set('settings.allowed_values', [])
->set('settings.allowed_values_function', '\Drupal\drowl_media_types\DrowlMediaTypesFieldValuesProvider::getOverlaySizingValues')
->save();
$configFactory->getEditable('field.storage.media.field_overlay_sizing_lg')
->set('settings.allowed_values', [])
->set('settings.allowed_values_function', '\Drupal\drowl_media_types\DrowlMediaTypesFieldValuesProvider::getOverlaySizingValues')
->save();
$configFactory->getEditable('field.storage.media.field_overlay_sizing_md')
->set('settings.allowed_values', [])
->set('settings.allowed_values_function', '\Drupal\drowl_media_types\DrowlMediaTypesFieldValuesProvider::getOverlaySizingValues')
->save();
$configFactory->getEditable('field.storage.media.field_slide_arrows')
->set('settings.allowed_values', [])
->set('settings.allowed_values_function', '\Drupal\drowl_media_types\DrowlMediaTypesFieldValuesProvider::getSlideYesNoValues')
->save();
$configFactory->getEditable('field.storage.media.field_slide_autoplay')
->set('settings.allowed_values', [])
->set('settings.allowed_values_function', '\Drupal\drowl_media_types\DrowlMediaTypesFieldValuesProvider::getSlideYesNoValues')
->save();
$configFactory->getEditable('field.storage.media.field_slide_dots')
->set('settings.allowed_values', [])
->set('settings.allowed_values_function', '\Drupal\drowl_media_types\DrowlMediaTypesFieldValuesProvider::getSlideYesNoValues')
->save();
$configFactory->getEditable('field.storage.media.field_slide_height')
->set('settings.allowed_values', [])
->set('settings.allowed_values_function', '\Drupal\drowl_media_types\DrowlMediaTypesFieldValuesProvider::getSlideHeightValues')
->save();
$configFactory->getEditable('field.storage.media.field_slide_infinite')
->set('settings.allowed_values', [])
->set('settings.allowed_values_function', '\Drupal\drowl_media_types\DrowlMediaTypesFieldValuesProvider::getSlideYesNoValues')
->save();
}
/**
* Executes the field renaming for a field.
*/
function drowl_media_types_execute_field_rename(string $entityTypeId, string $oldFieldName, string $newFieldName, bool $deleteOldFieldData) {
$oldFieldStorageDefinition = FieldStorageConfig::loadByName($entityTypeId, $oldFieldName);
$newFieldStorageDefinition = drowl_media_types_copy_field_storage($oldFieldStorageDefinition, $newFieldName);
// Copy over the field config:
drowl_media_types_copy_field_config($oldFieldStorageDefinition, $oldFieldName, $newFieldName);
// Copy over the field view and form displays:
drowl_media_types_copy_view_and_form_displays($oldFieldStorageDefinition, $oldFieldName, $newFieldName);
// Create the field table mapping array:
$fieldTablesMappingArray = drowl_media_types_create_field_tables_mapping_array($oldFieldStorageDefinition, $newFieldStorageDefinition);
// Convert field table data to be used by the new field:
$convertedFieldTableData = drowl_media_types_convert_field_table_data($fieldTablesMappingArray, $oldFieldName, $newFieldName);
// Update the field storage definition:
\Drupal::entityDefinitionUpdateManager()->updateFieldStorageDefinition($newFieldStorageDefinition);
// Copy the db field data from the old field to the new field:
drowl_media_types_copy_field_table_data($convertedFieldTableData);
// Delete the old field storage. This will automatically remove the field
// config and the database entries as well!
if ($deleteOldFieldData) {
$oldFieldStorageDefinition->delete();
}
}
/**
* Makes a copy of an existing field storage.
*
* @param \Drupal\field\FieldStorageConfigInterface $oldFieldStorage
* The old field storage definition.
* @param string $newFieldName
* The name of the new field name the storage belongs to.
*
* @return \Drupal\field\FieldStorageConfigInterface
* The new field storage definition.
*/
function drowl_media_types_copy_field_storage(FieldStorageConfigInterface $oldFieldStorage, string $newFieldName): FieldStorageConfigInterface {
$newFieldStorageDefintionValues = $oldFieldStorage->toArray();
unset($newFieldStorageDefintionValues['uuid']);
unset($newFieldStorageDefintionValues['_core']);
$newFieldStorageDefintionValues['field_name'] = $newFieldName;
$newFieldStorageDefintionValues['id'] = $oldFieldStorage->getTargetEntityTypeId() . '.' . $newFieldName;
// Create the new field storage with the adjusted values of the old field
// storage:
$newFieldStorageDefinition = FieldStorageConfig::create($newFieldStorageDefintionValues);
$newFieldStorageDefinition->save();
return $newFieldStorageDefinition;
}
/**
* Copy the field config for each given bundle.
*
* @param \Drupal\field\FieldStorageConfigInterface $oldFieldStorage
* The old field storage definition.
* @param string $oldFieldName
* The old field name.
* @param string $newFieldName
* The new field name.
*/
function drowl_media_types_copy_field_config(FieldStorageConfigInterface $oldFieldStorage, string $oldFieldName, string $newFieldName): void {
foreach ($oldFieldStorage->getBundles() as $bundle) {
$oldField = FieldConfig::loadByName($oldFieldStorage->getTargetEntityTypeId(), $bundle, $oldFieldName);
$newFieldValues = $oldField->toArray();
// Remove the old uuid and _core entry and rename the field and field id:
unset($newFieldValues['uuid']);
unset($newFieldValues['_core']);
$newFieldValues['field_name'] = $newFieldName;
$newFieldValues['id'] = $oldFieldStorage->getTargetEntityTypeId() . '.' . $newFieldValues['field_type'] . '.' . $newFieldName;
FieldConfig::create($newFieldValues)->save();
}
}
/**
* Copy old field displays over to the new field.
*
* @param \Drupal\field\FieldStorageConfigInterface $oldFieldStorage
* The old field storage definition.
* @param string $oldFieldName
* The old field name.
* @param string $newFieldName
* The new field name.
*/
function drowl_media_types_copy_view_and_form_displays(FieldStorageConfigInterface $oldFieldStorage, string $oldFieldName, string $newFieldName): void {
foreach ($oldFieldStorage->getBundles() as $bundle) {
// Apply old field view displays on new field:
/** @var \Drupal\Core\Entity\Display\EntityViewDisplayInterface[] $viewDisplays */
$viewDisplays = \Drupal::entityTypeManager()->getStorage('entity_view_display')->loadByProperties([
'targetEntityType' => $oldFieldStorage->getTargetEntityTypeId(),
'bundle' => $bundle,
]);
foreach ($viewDisplays as $viewDisplay) {
$oldFieldComponent = $viewDisplay->getComponent($oldFieldName);
if (!empty($oldFieldComponent)) {
// Rename the old fields inside the "hidden" section:
// @todo This doesn't work for some reason, seems like the
// MediaConfigUpdater is doing some magic in the background.
// $hiddenFields = $viewDisplay->get('hidden');
// if (!empty($hiddenFields) && is_array($hiddenFields)) {
// foreach ($hiddenFields as $hiddenField => $hidden) {
// foreach (DROWL_MEDIA_TYPES_UPDATE_8005_FIELD_NAME_MAPPING as $oldFieldName => $newFieldName) {
// if ($hiddenField === $oldFieldName) {
// $hiddenFields[$newFieldName] = $hidden;
// unset($hiddenField);
// }
// }
// }
// $viewDisplay->set('hidden', $hiddenFields);
// }
// // Adjust the view display field_name in the view display settings:
// $content = $viewDisplay->get('content');
// // Adjust the "field_document" view display settings:
// $fieldDocumentViewDisplay = &$content['field_document'];
// if (!empty($fieldDocumentViewDisplay)) {
// $fieldDocumentViewDisplaySettings = &$fieldDocumentViewDisplay['settings'];
// if (!empty($fieldDocumentViewDisplaySettings)) {
// foreach ($fieldDocumentViewDisplaySettings as &$displaySetting) {
// if (str_contains($displaySetting, $oldFieldName)) {
// $displaySetting = str_replace($oldFieldName, $newFieldName, $displaySetting);
// }
// }
// }
// }
// // Do the same with the field_video_file view display settings:
// $fieldDocumentViewDisplay = &$content['field_video_file'];
// if (!empty($fieldDocumentViewDisplay)) {
// $fieldDocumentViewDisplaySettings = &$fieldDocumentViewDisplay['settings'];
// if (!empty($fieldDocumentViewDisplaySettings)) {
// foreach ($fieldDocumentViewDisplaySettings as &$displaySetting) {
// if (str_contains($displaySetting, $oldFieldName)) {
// $displaySetting = str_replace($oldFieldName, $newFieldName, $displaySetting);
// }
// }
// }
// }
// // Save the modified content:
// $viewDisplay->set('content', $content);
// // Adjust the crop settings, if they exist:
// $thirdPartySettings = &$content['third_party_settings'];
// if (!empty($thirdPartySettings)) {
// $thirdPartySettingsCrop = &$thirdPartySettings['crop'];
// if (!empty($thirdPartySettingsCrop)) {
// foreach ($thirdPartySettingsCrop as &$cropSetting) {
// if (str_contains($cropSetting, $oldFieldName)) {
// $cropSetting = str_replace($oldFieldName, $newFieldName, $cropSetting);
// }
// }
// }
// }
$viewDisplay->removeComponent($oldFieldName);
$viewDisplay->setComponent($newFieldName, $oldFieldComponent)
->save();
}
}
// Apply old field form displays on new field:
/** @var \Drupal\Core\Entity\Display\EntityFormDisplayInterface[] $formDisplays*/
$formDisplays = \Drupal::entityTypeManager()->getStorage('entity_form_display')->loadByProperties([
'targetEntityType' => $oldFieldStorage->getTargetEntityTypeId(),
'bundle' => $bundle,
]);
foreach ($formDisplays as $formDisplay) {
$oldFieldComponent = $formDisplay->getComponent($oldFieldName);
if (!empty($oldFieldComponent)) {
// Rename the old fields inside the "hidden" section:
// @todo This doesn't work for some reason, seems like the
// MediaConfigUpdater is doing some magic in the background.
// $hiddenFields = $formDisplay->get('hidden');
// if (!empty($hiddenFields)) {
// foreach ($hiddenFields as $hiddenField => &$hidden) {
// if (empty($hidden)) {
// continue;
// }
// foreach (DROWL_MEDIA_TYPES_UPDATE_8005_FIELD_NAME_MAPPING as $oldFieldName => $newFieldName) {
// if ($hiddenField === $oldFieldName) {
// $hiddenFields[$newFieldName] = $hidden;
// unset($hiddenField);
// }
// }
// }
// $formDisplay->set('hidden', $hiddenFields);
// }
$formDisplay->removeComponent($oldFieldName);
$formDisplay->setComponent($newFieldName, $oldFieldComponent)
->save();
}
}
}
}
/**
* Create a field tables mapping array.
*
* This method creates an array that maps the field tables from the old field
* storage definition to the new field storage definition. The array contains
* the old table names as keys and the corresponding new table names as
* values.
*
* @param \Drupal\field\Entity\FieldStorageConfig $oldFieldStorageDefinition
* The old field storage definition.
* @param \Drupal\field\Entity\FieldStorageConfig $newFieldStorageDefinition
* The new field storage definition.
*
* @return array
* An array that maps the field table names from the old field storage
* definition to the new field storage definition.
*/
function drowl_media_types_create_field_tables_mapping_array(FieldStorageConfig $oldFieldStorageDefinition, FieldStorageConfig $newFieldStorageDefinition): array {
$tableMapping = \Drupal::entityTypeManager()
->getStorage($oldFieldStorageDefinition->getTargetEntityTypeId())
->getTableMapping();
$fieldTablesMappingArray = [];
// Get new and old field table names:
$oldFieldTable = $tableMapping->getFieldTableName($oldFieldStorageDefinition->getName());
$newFieldTable = $tableMapping->getFieldTableName($newFieldStorageDefinition->getName());
// Add the field table names in our mapping array:
$fieldTablesMappingArray[$oldFieldTable] = $newFieldTable;
// See if the field has a revision table.
$entityType = \Drupal::entityTypeManager()->getDefinition($oldFieldStorageDefinition->getTargetEntityTypeId());
if ($entityType->isRevisionable() && $oldFieldStorageDefinition->isRevisionable()) {
if ($tableMapping->requiresDedicatedTableStorage($oldFieldStorageDefinition)) {
$oldFieldRevisionTable = $tableMapping->getDedicatedRevisionTableName($oldFieldStorageDefinition);
$newFieldRevisionTable = $tableMapping->getDedicatedRevisionTableName($newFieldStorageDefinition);
$fieldTablesMappingArray[$oldFieldRevisionTable] = $newFieldRevisionTable;
}
elseif ($tableMapping->allowsSharedTableStorage($oldFieldStorageDefinition)) {
$revision_table = $entityType->getRevisionDataTable() ?: $entityType->getRevisionTable();
// If shared table storage is allowed, we simply use the same table name
// as key and value:
$fieldTablesMappingArray[$revision_table] = $revision_table;
}
}
return $fieldTablesMappingArray;
}
/**
* Converts field table data to be used by the new field.
*
* @param array $fieldTablesMappingArray
* The mapping array that defines the relationship between field tables.
* @param string $oldFieldName
* The name of the old field.
* @param string $newFieldName
* The name of the new field.
*/
function drowl_media_types_convert_field_table_data($fieldTablesMappingArray, $oldFieldName, $newFieldName) {
$oldFieldTableData = [];
foreach ($fieldTablesMappingArray as $oldFieldTable => $newFieldTable) {
// Get the old data.
$oldFieldTableData[$oldFieldTable] = \Drupal::database()->select($oldFieldTable)
->fields($oldFieldTable)
->execute()
->fetchAll(\PDO::FETCH_ASSOC);
}
// Adjust old field table data to conform with the new field name:
$convertedFieldTableData = [];
foreach ($oldFieldTableData as $oldFieldTable => $fieldTableContents) {
$convertedFieldTableContents = [];
foreach ($fieldTableContents as $rowKey => $rowData) {
foreach ($rowData as $tableColumnKey => $tableValue) {
// If a table column contains the old field name, replace it with the
// new field name, otherwise, use the column name as is:
if (str_contains($tableColumnKey, $oldFieldName)) {
$newTableColumnKey = str_replace($oldFieldName, $newFieldName, $tableColumnKey);
$convertedFieldTableContents[$rowKey][$newTableColumnKey] = $tableValue;
}
else {
$convertedFieldTableContents[$rowKey][$tableColumnKey] = $tableValue;
}
}
}
// The old field table names are resolved to the new field table
// names through our "$fieldTablesMappingArray" variable here. Meaning
// "$fieldTablesMappingArray[$oldFieldTable]" will resolve to the new
// field table name:
$convertedFieldTableData[$fieldTablesMappingArray[$oldFieldTable]] = $convertedFieldTableContents;
}
return $convertedFieldTableData;
}
/**
* Copies the converted field table data to the new field table.
*
* @param array $convertedFieldTableData
* The converted field table data.
*/
function drowl_media_types_copy_field_table_data(array $convertedFieldTableData) {
foreach ($convertedFieldTableData as $newFieldTableName => $tableData) {
if (!empty($tableData)) {
$insertQuery = \Drupal::database()
->insert($newFieldTableName)
// Define the columns to insert values into:
->fields(array_keys(end($tableData)));
foreach ($tableData as $row) {
// Insert each table row:
$insertQuery->values(array_values($row));
}
$insertQuery->execute();
}
}
}
