block.install

Same filename in other branches
  1. 7.x modules/block/block.install
  2. 9 core/modules/block/block.install
  3. 10 core/modules/block/block.install
  4. 11.x core/modules/block/block.install

Contains install and update functions for Block.

File

core/modules/block/block.install

View source
<?php


/**
 * @file
 * Contains install and update functions for Block.
 */
use Drupal\Core\Cache\Cache;

/**
 * Implements hook_install().
 */
function block_install() {
    // Because the Block module upon installation unconditionally overrides all
    // HTML output by selecting a different page display variant, we must
    // invalidate all cached HTML output.
    Cache::invalidateTags([
        'rendered',
    ]);
}

/**
 * Update block visibility context mapping.
 */
function block_update_8001() {
    // This update function updates blocks for the change from
    // https://www.drupal.org/node/2354889.
    // Core visibility context plugins are updated automatically; blocks with
    // unknown plugins are disabled and their previous visibility settings are
    // saved in key value storage; see change record
    // https://www.drupal.org/node/2527840 for more explanation.
    // These are all the contexts that Drupal core provides.
    $context_service_id_map = [
        'node.node' => '@node.node_route_context:node',
        'user.current_user' => '@user.current_user_context:current_user',
    ];
    foreach (array_keys(\Drupal::languageManager()->getDefinedLanguageTypesInfo()) as $language_type_id) {
        $context_service_id_map['language.' . $language_type_id] = '@language.current_language_context:' . $language_type_id;
    }
    // Contributed modules should leverage hook_update_dependencies() in order to
    // be executed after block_update_8001(). The blocks are then disabled if the
    // contexts are still missing via
    // block_post_update_disable_blocks_with_missing_contexts().
    $config_factory = \Drupal::configFactory();
    $backup_values = $update_backup = [];
    foreach ($config_factory->listAll('block.block.') as $block_config_name) {
        $block = $config_factory->getEditable($block_config_name);
        if ($visibility = $block->get('visibility')) {
            foreach ($visibility as $condition_plugin_id => &$condition) {
                foreach ($condition['context_mapping'] as $key => $context) {
                    if (!isset($context_service_id_map[$context])) {
                        // Remove the visibility condition for unknown context mapping
                        // entries, so the update process itself runs through and users can
                        // fix their block placements manually OR alternatively contributed
                        // modules can run their own update functions to update mappings
                        // that they provide.
                        $backup_values[$context][] = $condition_plugin_id;
                        unset($visibility[$condition_plugin_id]);
                        continue;
                    }
                    // Replace the context ID based on the defined mapping.
                    $condition['context_mapping'][$key] = $context_service_id_map[$context];
                }
            }
            $block->set('visibility', $visibility);
            if ($backup_values) {
                // We not only store the missing context mappings but also the previous
                // block status, in order to allow contributed and custom modules to do
                // their own updates.
                $update_backup[$block->get('id')] = [
                    'missing_context_ids' => $backup_values,
                    'status' => $block->get('status'),
                ];
            }
        }
        // Mark the resulting configuration as trusted data. This avoids issues with
        // future schema changes.
        $block->save(TRUE);
    }
    if ($update_backup) {
        \Drupal::keyValue('update_backup')->set('block_update_8001', $update_backup);
    }
    return t('Block context IDs updated.');
}

/**
 * Placeholder for the previous 8002 update.
 */
function block_update_8002() {
    \Drupal::state()->set('block_update_8002_placeholder', TRUE);
}

/**
 * Remove 'cache' setting.
 */
function block_update_8003() {
    $config_factory = \Drupal::configFactory();
    foreach ($config_factory->listAll('block.block.') as $block_config_name) {
        $block = $config_factory->getEditable($block_config_name);
        // Remove the 'cache' setting.
        $settings = $block->get('settings');
        unset($settings['cache']);
        $block->set('settings', $settings);
        // Mark the resulting configuration as trusted data. This avoids issues with
        // future schema changes.
        $block->save(TRUE);
    }
    return t('Block settings updated.');
}

Functions

Title Deprecated Summary
block_install Implements hook_install().
block_update_8001 Update block visibility context mapping.
block_update_8002 Placeholder for the previous 8002 update.
block_update_8003 Remove 'cache' setting.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.