function block_update_8001

Update block visibility context mapping.

3 string references to 'block_update_8001'
BlockContextMappingUpdateTest::testUpdateHookN in core/modules/block/tests/src/Functional/Update/BlockContextMappingUpdateTest.php
Tests that block context mapping is updated properly.
block_post_update_disable_blocks_with_missing_contexts in core/modules/block/block.post_update.php
Disable all blocks with missing context IDs in block_update_8001().
hook_post_update_NAME in core/lib/Drupal/Core/Extension/module.api.php
Executes an update which is intended to update data, like entities.

File

core/modules/block/block.install, line 23

Code

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.');
}

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