Code Coverage  | 
     ||||||||||
Classes and Traits  | 
      Functions and Methods  | 
      Lines  | 
     ||||||||
| Total |         | 
      0 / 0  | 
              | 
      100.00%  | 
      0 / 0  | 
      CRAP |         | 
      0.00%  | 
      0 / 32  | 
     |
| block_post_update_disable_blocks_with_missing_contexts |         | 
      0.00%  | 
      0 / 1  | 
      0 |         | 
      0.00%  | 
      0 / 32  | 
     |||
| <?php | |
| /** | |
| * @file | |
| * Post update functions for Block. | |
| */ | |
| /** | |
| * @addtogroup updates-8.0.0-beta | |
| * @{ | |
| */ | |
| /** | |
| * Disable all blocks with missing context IDs in block_update_8001(). | |
| */ | |
| function block_post_update_disable_blocks_with_missing_contexts() { | |
| // Don't execute the function if block_update_8002() got executed already, | |
| // which used to do the same. Note: Its okay to check here, because | |
| // update_do_one() does not update the installed schema version until the | |
| // batch is finished. | |
| $module_schema = drupal_get_installed_schema_version('block'); | |
| // The state entry 'block_update_8002_placeholder' is used in order to | |
| // indicate that the placeholder block_update_8002() function has been | |
| // executed, so this function needs to be executed as well. If the non | |
| // placeholder version of block_update_8002() got executed already, the state | |
| // won't be set and we skip this update. | |
| if ($module_schema >= 8002 && !\Drupal::state()->get('block_update_8002_placeholder', FALSE)) { | |
| return; | |
| } | |
| // Cleanup the state entry as its no longer needed. | |
| \Drupal::state()->delete('block_update_8002'); | |
| $block_update_8001 = \Drupal::keyValue('update_backup')->get('block_update_8001', []); | |
| $block_ids = array_keys($block_update_8001); | |
| $block_storage = \Drupal::entityManager()->getStorage('block'); | |
| $blocks = $block_storage->loadMultiple($block_ids); | |
| /** @var $blocks \Drupal\block\BlockInterface[] */ | |
| foreach ($blocks as $block) { | |
| // This block has had conditions removed due to an inability to resolve | |
| // contexts in block_update_8001() so disable it. | |
| // Disable currently enabled blocks. | |
| if ($block_update_8001[$block->id()]['status']) { | |
| $block->setStatus(FALSE); | |
| $block->save(); | |
| } | |
| } | |
| // Provides a list of plugin labels, keyed by plugin ID. | |
| $condition_plugin_id_label_map = array_column(\Drupal::service('plugin.manager.condition')->getDefinitions(), 'label', 'id'); | |
| // Override with the UI labels we are aware of. Sadly they are not machine | |
| // accessible, see | |
| // \Drupal\node\Plugin\Condition\NodeType::buildConfigurationForm(). | |
| $condition_plugin_id_label_map['node_type'] = t('Content types'); | |
| $condition_plugin_id_label_map['request_path'] = t('Pages'); | |
| $condition_plugin_id_label_map['user_role'] = t('Roles'); | |
| if (count($block_ids) > 0) { | |
| $message = t('Encountered an unknown context mapping key coming probably from a contributed or custom module: One or more mappings could not be updated. Please manually review your visibility settings for the following blocks, which are disabled now:'); | |
| $message .= '<ul>'; | |
| foreach ($blocks as $disabled_block_id => $disabled_block) { | |
| $message .= '<li>' . t('@label (Visibility: @plugin_ids)', array( | |
| '@label' => $disabled_block->get('settings')['label'], | |
| '@plugin_ids' => implode(', ', array_intersect_key($condition_plugin_id_label_map, array_flip(array_keys($block_update_8001[$disabled_block_id]['missing_context_ids'])))) | |
| )) . '</li>'; | |
| } | |
| $message .= '</ul>'; | |
| return $message; | |
| } | |
| } | |
| /** | |
| * @} End of "addtogroup updates-8.0.0-beta". | |
| */ |