date_ap_style-8.x-1.x-dev/date_ap_style.post_update.php

date_ap_style.post_update.php
<?php

/**
 * @file
 * Post update functions for Date AP Style module.
 */

/**
 * Migrate configuration and fix data types for existing installations.
 *
 * This comprehensive post-update function handles:
 * - Migration from old config name (date_ap_style.dateapstylesettings)
 *   to new (date_ap_style.settings)
 * - Cleanup of invalid configuration keys
 * - Conversion of string/integer values to proper boolean types in main config
 * - Conversion of string/integer values to proper boolean types in
 *   entity view display configs
 * - Handles both fresh installations and existing sites.
 */
function date_ap_style_post_update_migrate_and_cleanup_config() {
  $config_factory = \Drupal::configFactory();
  $config_storage = \Drupal::service('config.storage');
  $messages = [];

  // Step 1: Migrate from old config name if it exists.
  $old_config = $config_factory->getEditable('date_ap_style.dateapstylesettings');
  if (!$old_config->isNew()) {
    $old_data = $old_config->getRawData();
    $new_config = $config_factory->getEditable('date_ap_style.settings');

    // Boolean fields that need type conversion.
    $boolean_fields = [
      'always_display_year',
      'use_today',
      'cap_today',
      'display_day',
      'display_time',
      'hide_date',
      'time_before_date',
      'display_noon_and_midnight',
      'capitalize_noon_and_midnight',
      'use_all_day',
      'month_only',
    ];

    // Convert values to proper types.
    foreach ($old_data as $key => $value) {
      if (in_array($key, $boolean_fields)) {
        $new_config->set($key, (bool) $value);
      }
      else {
        $new_config->set($key, $value);
      }
    }

    $new_config->save();
    $old_config->delete();
    $messages[] = 'Migrated configuration from date_ap_style.dateapstylesettings to date_ap_style.settings';
  }

  // Step 2: Clean up the main configuration
  // (handles both migrated and existing configs)
  $main_config = $config_factory->getEditable('date_ap_style.settings');
  if (!$main_config->isNew()) {
    $raw_data = $main_config->getRawData();
    $main_changed = FALSE;

    // Remove invalid keys.
    if (array_key_exists('_core', $raw_data)) {
      $main_config->clear('_core');
      $main_changed = TRUE;
    }
    if (array_key_exists('date_ap_style_settings', $raw_data)) {
      $main_config->clear('date_ap_style_settings');
      $main_changed = TRUE;
    }

    // Convert any remaining string/integer boolean values to proper booleans.
    $boolean_fields = [
      'always_display_year',
      'use_today',
      'cap_today',
      'display_day',
      'display_time',
      'hide_date',
      'time_before_date',
      'display_noon_and_midnight',
      'capitalize_noon_and_midnight',
      'use_all_day',
      'month_only',
    ];

    foreach ($boolean_fields as $field) {
      $value = $main_config->get($field);
      if ($value === '1' || $value === 1) {
        $main_config->set($field, TRUE);
        $main_changed = TRUE;
      }
      elseif ($value === '0' || $value === 0) {
        $main_config->set($field, FALSE);
        $main_changed = TRUE;
      }
    }

    if ($main_changed) {
      $main_config->save();
      $messages[] = 'Cleaned up main configuration and fixed data types';
    }
  }

  // Step 3: Fix entity view display field formatter settings.
  $view_display_configs = $config_storage->listAll('core.entity_view_display.');
  $boolean_fields = [
    'always_display_year',
    'use_today',
    'cap_today',
    'display_day',
    'display_time',
    'hide_date',
    'time_before_date',
    'display_noon_and_midnight',
    'capitalize_noon_and_midnight',
    'use_all_day',
    'month_only',
  ];

  $updated_displays = [];

  foreach ($view_display_configs as $config_name) {
    $config = $config_factory->getEditable($config_name);
    $content = $config->get('content');
    $changed = FALSE;

    if (!empty($content)) {
      foreach ($content as $field_name => $field_config) {
        // Check if this field uses one of our AP style formatters.
        if (isset($field_config['type']) &&
            in_array($field_config['type'], [
              'timestamp_ap_style',
              'daterange_ap_style',
            ])) {
          $settings = $field_config['settings'] ?? [];
          $settings_changed = FALSE;

          // Convert string/integer values to proper booleans.
          foreach ($boolean_fields as $boolean_field) {
            if (isset($settings[$boolean_field])) {
              $current_value = $settings[$boolean_field];

              if ($current_value === '1' || $current_value === 1) {
                $settings[$boolean_field] = TRUE;
                $settings_changed = TRUE;
              }
              elseif ($current_value === '0' || $current_value === 0) {
                $settings[$boolean_field] = FALSE;
                $settings_changed = TRUE;
              }
            }
          }

          if ($settings_changed) {
            $config->set("content.{$field_name}.settings", $settings);
            $changed = TRUE;
          }
        }
      }
    }

    if ($changed) {
      $config->save();
      $updated_displays[] = $config_name;
    }
  }

  if (!empty($updated_displays)) {
    $messages[] = t('Fixed data types in @count entity view display configurations', [
      '@count' => count($updated_displays),
    ]);
  }

  // Return combined message.
  if (!empty($messages)) {
    return implode('. ', $messages) . '.';
  }

  return t('No configuration updates needed - site is already up to date.');
}

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

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