annotate core/modules/block/block.install @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 129ea1e6d783
children
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 /**
Chris@0 4 * @file
Chris@0 5 * Contains install and update functions for Block.
Chris@0 6 */
Chris@0 7
Chris@0 8 use Drupal\Core\Cache\Cache;
Chris@0 9
Chris@0 10 /**
Chris@0 11 * Implements hook_install().
Chris@0 12 */
Chris@0 13 function block_install() {
Chris@0 14 // Because the Block module upon installation unconditionally overrides all
Chris@0 15 // HTML output by selecting a different page display variant, we must
Chris@0 16 // invalidate all cached HTML output.
Chris@0 17 Cache::invalidateTags(['rendered']);
Chris@0 18 }
Chris@0 19
Chris@0 20 /**
Chris@0 21 * Update block visibility context mapping.
Chris@0 22 */
Chris@0 23 function block_update_8001() {
Chris@0 24 // This update function updates blocks for the change from
Chris@0 25 // https://www.drupal.org/node/2354889.
Chris@0 26
Chris@0 27 // Core visibility context plugins are updated automatically; blocks with
Chris@0 28 // unknown plugins are disabled and their previous visibility settings are
Chris@0 29 // saved in key value storage; see change record
Chris@0 30 // https://www.drupal.org/node/2527840 for more explanation.
Chris@0 31
Chris@0 32 // These are all the contexts that Drupal core provides.
Chris@0 33 $context_service_id_map = [
Chris@0 34 'node.node' => '@node.node_route_context:node',
Chris@0 35 'user.current_user' => '@user.current_user_context:current_user',
Chris@0 36 ];
Chris@0 37
Chris@0 38 foreach (array_keys(\Drupal::languageManager()->getDefinedLanguageTypesInfo()) as $language_type_id) {
Chris@0 39 $context_service_id_map['language.' . $language_type_id] = '@language.current_language_context:' . $language_type_id;
Chris@0 40 }
Chris@0 41
Chris@0 42 // Contributed modules should leverage hook_update_dependencies() in order to
Chris@0 43 // be executed after block_update_8001(). The blocks are then disabled if the
Chris@0 44 // contexts are still missing via
Chris@0 45 // block_post_update_disable_blocks_with_missing_contexts().
Chris@0 46 $config_factory = \Drupal::configFactory();
Chris@0 47 $backup_values = $update_backup = [];
Chris@0 48
Chris@0 49 foreach ($config_factory->listAll('block.block.') as $block_config_name) {
Chris@0 50 $block = $config_factory->getEditable($block_config_name);
Chris@0 51 if ($visibility = $block->get('visibility')) {
Chris@0 52 foreach ($visibility as $condition_plugin_id => &$condition) {
Chris@0 53 foreach ($condition['context_mapping'] as $key => $context) {
Chris@0 54 if (!isset($context_service_id_map[$context])) {
Chris@0 55 // Remove the visibility condition for unknown context mapping
Chris@0 56 // entries, so the update process itself runs through and users can
Chris@0 57 // fix their block placements manually OR alternatively contributed
Chris@0 58 // modules can run their own update functions to update mappings
Chris@0 59 // that they provide.
Chris@0 60 $backup_values[$context][] = $condition_plugin_id;
Chris@0 61 unset($visibility[$condition_plugin_id]);
Chris@0 62 continue;
Chris@0 63 }
Chris@0 64 // Replace the context ID based on the defined mapping.
Chris@0 65 $condition['context_mapping'][$key] = $context_service_id_map[$context];
Chris@0 66 }
Chris@0 67 }
Chris@0 68 $block->set('visibility', $visibility);
Chris@0 69
Chris@0 70 if ($backup_values) {
Chris@0 71 // We not only store the missing context mappings but also the previous
Chris@0 72 // block status, in order to allow contributed and custom modules to do
Chris@0 73 // their own updates.
Chris@0 74 $update_backup[$block->get('id')] = [
Chris@0 75 'missing_context_ids' => $backup_values,
Chris@17 76 'status' => $block->get('status'),
Chris@0 77 ];
Chris@0 78 }
Chris@0 79 }
Chris@0 80
Chris@0 81 // Mark the resulting configuration as trusted data. This avoids issues with
Chris@0 82 // future schema changes.
Chris@0 83 $block->save(TRUE);
Chris@0 84 }
Chris@0 85
Chris@0 86 if ($update_backup) {
Chris@0 87 \Drupal::keyValue('update_backup')->set('block_update_8001', $update_backup);
Chris@0 88 }
Chris@0 89
Chris@0 90 return t('Block context IDs updated.');
Chris@0 91 }
Chris@0 92
Chris@0 93 /**
Chris@0 94 * Placeholder for the previous 8002 update.
Chris@0 95 */
Chris@0 96 function block_update_8002() {
Chris@0 97 \Drupal::state()->set('block_update_8002_placeholder', TRUE);
Chris@0 98 }
Chris@0 99
Chris@0 100 /**
Chris@0 101 * Remove 'cache' setting.
Chris@0 102 */
Chris@0 103 function block_update_8003() {
Chris@0 104 $config_factory = \Drupal::configFactory();
Chris@0 105 foreach ($config_factory->listAll('block.block.') as $block_config_name) {
Chris@0 106 $block = $config_factory->getEditable($block_config_name);
Chris@0 107
Chris@0 108 // Remove the 'cache' setting.
Chris@0 109 $settings = $block->get('settings');
Chris@0 110 unset($settings['cache']);
Chris@0 111 $block->set('settings', $settings);
Chris@0 112
Chris@0 113 // Mark the resulting configuration as trusted data. This avoids issues with
Chris@0 114 // future schema changes.
Chris@0 115 $block->save(TRUE);
Chris@0 116 }
Chris@0 117
Chris@0 118 return t('Block settings updated.');
Chris@0 119 }