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

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

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