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