function block_region_permissions_form_block_admin_display_form_alter in Block Region Permissions 8
Implements hook_form_FORM_ID_alter().
File
- ./
block_region_permissions.module, line 17 - Block region permissions module.
Code
function block_region_permissions_form_block_admin_display_form_alter(&$form, FormStateInterface $form_state, $form_id) {
// Get theme name.
$current_path = \Drupal::service('path.current')
->getPath();
if ($current_path == '/admin/structure/block') {
// Get default theme.
$theme_key = \Drupal::config('system.theme')
->get('default');
}
else {
// Get theme from path.
$theme_key = str_replace('/admin/structure/block/list/', '', $current_path);
}
// Get block keys for each region.
// Also get a master list of region select field options.
$region_block_keys = [];
$region_options = [];
$block_elements = Element::children($form['blocks']);
foreach ($block_elements as $block_key) {
// Get region name.
$region_key = '';
if (substr($block_key, 0, 7) == 'region-') {
// Region label or message.
list(, $region_key, ) = explode('-', $block_key);
}
elseif ($block = Block::load($block_key)) {
// Region block.
$region_key = $block
->getRegion();
// Save master list of options one time.
if (empty($region_options)) {
$region_options = $form['blocks'][$block_key]['region-theme']['region']['#options'];
}
}
// Save region names with block keys.
if (!empty($region_key)) {
if ($region_key == -1) {
$region_key = 'disabled';
}
$region_block_keys[$region_key][] = $block_key;
}
}
// Remove blocks for regions the user cannot administer.
foreach ($region_block_keys as $region_key => $block_keys) {
if ($region_key != 'disabled') {
if (!\Drupal::currentUser()
->hasPermission("administer {$theme_key} {$region_key}")) {
// Remove block.
foreach ($block_keys as $block_key) {
unset($form['blocks'][$block_key]);
}
// Update tracking.
unset($region_block_keys[$region_key]);
}
}
}
// Remove region select field options for regions the user cannot administer.
if (!empty($region_block_keys)) {
// Remove options from master list.
foreach ($region_options as $region_key => $options) {
if (!\Drupal::currentUser()
->hasPermission("administer {$theme_key} {$region_key}")) {
unset($region_options[$region_key]);
}
}
// Replace form block options with master list.
foreach ($region_block_keys as $region_key => $block_keys) {
foreach ($block_keys as $block_key) {
if (isset($form['blocks'][$block_key]['region-theme']['region']['#options'])) {
$form['blocks'][$block_key]['region-theme']['region']['#options'] = $region_options;
}
}
}
}
}