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