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 }
|