You are here

redirect.install in Redirect 8

Same filename and directory in other branches
  1. 7.2 redirect.install
  2. 7 redirect.install

Update hooks for the Redirect module.

File

redirect.install
View source
<?php

/**
 * @file
 * Update hooks for the Redirect module.
 */
use Drupal\Core\Config\FileStorage;
use Drupal\Core\Config\InstallStorage;
use Drupal\Core\Database\Database;
use Drupal\redirect\Entity\Redirect;
use Drupal\system\Entity\Action;
use Drupal\user\Entity\Role;
use Drupal\views\Entity\View;
use Symfony\Component\Yaml\Yaml;

/**
 * Rehash redirects to account for case insensitivity.
 */
function redirect_update_8100(&$sandbox) {

  // Loop through 100 redirects at a time.
  if (!isset($sandbox['progress'])) {
    $sandbox['progress'] = 0;
    $sandbox['current_rid'] = 0;

    // Note, because MySQL can treat `foo = LOWER(foo)`, all records must be checked.
    $sandbox['max'] = Database::getConnection()
      ->query('SELECT COUNT(1) FROM {redirect}')
      ->fetchField();
  }
  $result = \Drupal::database()
    ->select('redirect', 'r')
    ->fields('r', [
    'rid',
    'redirect_source__path',
    'redirect_source__query',
    'language',
    'hash',
  ])
    ->condition('rid', $sandbox['current_rid'], '>')
    ->range(0, 100)
    ->orderBy('rid', 'ASC')
    ->execute();
  foreach ($result as $row) {
    $query = !empty($row->redirect_source__query) ? unserialize($row->redirect_source__query) : [];
    $new_hash = Redirect::generateHash($row->redirect_source__path, (array) $query, $row->language);
    if ($row->hash != $new_hash) {

      // Do a direct query to speed things up.
      $query = \Drupal::database();
      $query
        ->update('redirect')
        ->fields([
        'hash' => $new_hash,
      ])
        ->condition('rid', $row->rid)
        ->execute();
    }
    $sandbox['progress']++;
    $sandbox['current_rid'] = $row->rid;
  }

  // Reset caches.
  $sandbox['#finished'] = empty($sandbox['max']) ? 1 : $sandbox['progress'] / $sandbox['max'];
}

/**
 * Update the {redirect} table.
 */
function redirect_update_8101() {

  // Get the current schema, change the length.
  $key_value_store_schema = \Drupal::keyValue('entity.storage_schema.sql');
  $schema = $key_value_store_schema
    ->get('redirect.field_schema_data.hash');
  $schema['redirect']['fields']['hash']['length'] = 64;

  // Set the max_length of the hash column to 64 characters.
  Database::getConnection()
    ->schema()
    ->changeField('redirect', 'hash', 'hash', $schema['redirect']['fields']['hash']);

  // Update the last installed field definition and field schema.

  /** @var \Drupal\Core\KeyValueStore\KeyValueStoreInterface $key_value_store */
  \Drupal::service('entity_field.manager')
    ->clearCachedFieldDefinitions();
  $key_value_store_definition = \Drupal::keyValue('entity.definitions.installed');
  $storage_definitions = $key_value_store_definition
    ->get('redirect.field_storage_definitions');
  $storage_definitions['hash'] = $storage_definition = \Drupal::service('entity_field.manager')
    ->getFieldStorageDefinitions('redirect')['hash'];
  $key_value_store_definition
    ->set('redirect.field_storage_definitions', $storage_definitions);

  // Update the stored schema.
  $key_value_store_schema
    ->set('redirect.field_schema_data.hash', $schema);
}

/**
 * Update settings based on existing settings and Globalredirect settings.
 */
function redirect_update_8102() {

  // Load default configuration.
  $redirect_settings = \Drupal::config('redirect.settings');
  $globalredirect_settings = \Drupal::config('globalredirect.settings');
  $config_factory = \Drupal::configFactory();
  $redirect = $config_factory
    ->getEditable('redirect.settings');
  $nonclean_to_clean = $redirect_settings
    ->get('global_clean');
  $admin_path = $redirect_settings
    ->get('global_admin_paths');
  $frontpage_redirect = $redirect_settings
    ->get('global_home');
  $deslash = $redirect_settings
    ->get('global_deslash');
  $message = NULL;

  // If Globalredirect configuration exists, use those settings.
  if (!$globalredirect_settings
    ->isNew()) {
    $access_check = $globalredirect_settings
      ->get('access_check');
    $normalize_aliases = $globalredirect_settings
      ->get('normalize_aliases');
    $content_location_header = $globalredirect_settings
      ->get('content_location_header');
    $term_path_handler = $globalredirect_settings
      ->get('term_path_handler');
    $deslash = $globalredirect_settings
      ->get('deslash');
    $frontpage_redirect = $globalredirect_settings
      ->get('frontpage_redirect');
    $nonclean_to_clean = $globalredirect_settings
      ->get('nonclean_to_clean');
    $redirect
      ->set('access_check', $access_check);
    $redirect
      ->set('normalize_aliases', $normalize_aliases);
    $redirect
      ->set('content_location_header', $content_location_header);
    $redirect
      ->set('term_path_handler', $term_path_handler);
    $message = 'The Globalredirect module functionality has been merged into redirect, it should be uninstalled now.';
  }
  else {
    $redirect
      ->set('access_check', FALSE);
    $redirect
      ->set('normalize_aliases', TRUE);
    $redirect
      ->set('content_location_header', FALSE);
    $redirect
      ->set('term_path_handler', TRUE);
  }

  // Update  new redirect settings names.
  $redirect
    ->set('nonclean_to_clean', $nonclean_to_clean);
  $redirect
    ->set('admin_path', $admin_path);
  $redirect
    ->set('frontpage_redirect', $frontpage_redirect);
  $redirect
    ->set('deslash', $deslash);

  // Remove old names of  redirect settings.
  $redirect
    ->clear('global_clean');
  $redirect
    ->clear('global_admin_paths');
  $redirect
    ->clear('global_home');
  $redirect
    ->clear('global_deslash');
  $redirect
    ->save();
  return $message;
}

/**
 * Creates the new default redirect view.
 */
function redirect_update_8103() {
  $message = NULL;

  // Only create if the redirect view doesn't exist and views is enabled.
  if (!View::load('redirect') && \Drupal::moduleHandler()
    ->moduleExists('views')) {
    $config_path = drupal_get_path('module', 'redirect') . '/config/install/views.view.redirect.yml';
    $data = Yaml::parse(file_get_contents($config_path));
    \Drupal::configFactory()
      ->getEditable('views.view.redirect')
      ->setData($data)
      ->save(TRUE);
    $message = 'The new redirect view has been created.';
  }
  else {
    $message = 'Not creating a redirect view since it already exists.';
  }
  return $message;
}

/**
 * Save the bulk delete action to config.
 */
function redirect_update_8104() {
  if (!Action::load('redirect_delete_action')) {
    $entity_type_manager = \Drupal::entityTypeManager();
    $module_handler = \Drupal::moduleHandler();

    // Save the bulk delete action to config.
    $config_install_path = $module_handler
      ->getModule('redirect')
      ->getPath() . '/' . InstallStorage::CONFIG_INSTALL_DIRECTORY;
    $storage = new FileStorage($config_install_path);
    $entity_type_manager
      ->getStorage('action')
      ->create($storage
      ->read('system.action.redirect_delete_action'))
      ->trustData()
      ->save();
  }
}

/**
 * Ensure to use the redirect_404 submodule.
 */
function redirect_update_8105() {
  \Drupal::service('module_installer')
    ->install([
    'redirect_404',
  ]);
}

/**
 * Removes unnecessary settings from storage.
 */
function redirect_update_8106() {
  $config = \Drupal::configFactory()
    ->getEditable('redirect.settings');
  $config
    ->set('route_normalizer_enabled', $config
    ->get('normalize_aliases'));
  $config
    ->clear('term_path_handler');
  $config
    ->clear('normalize_aliases');
  $config
    ->clear('deslash');
  $config
    ->clear('frontpage_redirect');
  $config
    ->clear('nonclean_to_clean');
  $config
    ->save();
}

/**
 * Update permissions.
 *
 * When splitting the permission for settings from the permission to view
 * the list of redirects, maintain the current permissions for sites which
 * already have this module installed.
 */
function redirect_update_8107() {
  if ($roles = Role::loadMultiple()) {
    foreach ($roles as $role) {
      if ($role
        ->hasPermission('administer redirects')) {
        $role
          ->grantPermission('administer redirect settings');
        $role
          ->save();
      }
    }
  }
}

/**
 * Removes unnecessary settings.
 */
function redirect_update_8108() {
  $config = \Drupal::configFactory()
    ->getEditable('redirect.settings');
  $config
    ->clear('canonical');
  $config
    ->clear('content_location_header');
  $config
    ->save();
}

Functions

Namesort descending Description
redirect_update_8100 Rehash redirects to account for case insensitivity.
redirect_update_8101 Update the {redirect} table.
redirect_update_8102 Update settings based on existing settings and Globalredirect settings.
redirect_update_8103 Creates the new default redirect view.
redirect_update_8104 Save the bulk delete action to config.
redirect_update_8105 Ensure to use the redirect_404 submodule.
redirect_update_8106 Removes unnecessary settings from storage.
redirect_update_8107 Update permissions.
redirect_update_8108 Removes unnecessary settings.