function block_update_8001 in Drupal 8
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 - Contains install and update functions for Block.
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.');
}