You are here

block_visibility.module in Block Visibility 7

File

block_visibility.module
View source
<?php

/**
 * Implements hook_theme_registry_alter()
 *
 * Switch out the template file so we can add the visibility column.
 *
 * @param <type> $theme_registry
 */
function block_visibility_theme_registry_alter(&$theme_registry) {
  $theme_registry['block_admin_display_form']['template'] = 'block-visibility-admin-display-form';
  $theme_registry['block_admin_display_form']['path'] = drupal_get_path('module', 'block_visibility');
}

/**
 * Implements hook_theme()
 */
function block_visibility_theme() {
  return array(
    'block_visibility' => array(
      'render element' => 'element',
    ),
  );
}

/**
 * Get a pretty printable list of block visibilities.
 */
function block_visibility_get_visibilities($block) {
  return module_invoke_all('block_visibility', $block);
}

/**
 * Implements hook_preprocess_block_admin_display_form()
 */
function block_visibility_preprocess_block_admin_display_form(&$variables) {
  foreach (element_children($variables['form']['blocks']) as $i) {
    $block =& $variables['form']['blocks'][$i];

    // Fetch the region for the current block.
    $region = isset($block['region']['#default_value']) ? $block['region']['#default_value'] : BLOCK_REGION_NONE;

    // Force it to rerender and
    // Let theme function know to render for real this time.
    unset($block['visibility']['#printed']);
    $block['visibility']['#do_render'] = TRUE;
    $variables['block_listing'][$region][$i]->visibility = drupal_render($block['visibility']);
  }
}

/**
 * Form alter for block_admin_display_form()
 */
function block_visibility_form_block_admin_display_form_alter(&$form, &$form_state, $form_id) {
  drupal_add_css(drupal_get_path('module', 'block_visibility') . '/block_visibility.css');
  foreach ($form['blocks'] as $id => $block) {
    $loaded_block = block_load($block['module']['#value'], $block['delta']['#value']);
    $form['blocks'][$id]['visibility'] = array(
      '#theme' => 'block_visibility',
      '#visibles' => block_visibility_get_visibilities($loaded_block),
    );
  }
}

/**
 * Implements hook_block_visibility()
 */
function block_visibility_block_visibility($block) {

  // Only load block_roles once.
  static $block_roles = array();
  if (empty($block_roles)) {
    $role_options = array_map('check_plain', user_roles());
    $result = db_query("SELECT * FROM {block_role}");
    foreach ($result as $record) {
      $block_roles[$record->module][$record->delta][$record->rid] = $role_options[$record->rid];
    }
  }

  // Only load block_node_type once.
  static $block_node_type = array();
  if (empty($block_node_type)) {
    $node_types = node_type_get_names();
    $result = db_query("SELECT * FROM {block_node_type}");
    foreach ($result as $record) {
      $block_node_type[$record->module][$record->delta][$record->type] = $node_types[$record->type];
    }
  }
  $visibilities = array();

  // If the pages column is set then there is a visibility setting for the block.
  if ($block->pages) {
    if ($block->visibility == 2) {
      $visibilities['page'] = array(
        '#title' => t('PHP'),
        '#description' => '<code>' . str_replace(array(
          '<',
          '>',
          "\r\n",
          " ",
        ), array(
          '&lt;',
          '&gt;',
          '<br>',
          '&nbsp;',
        ), $block->pages) . '</code>',
      );
    }
    else {

      // Rewrite pages to include aliases, if applicable.
      $final_pages = array();
      $pages = explode("\n", $block->pages);
      foreach ($pages as $url) {
        $url = trim($url);
        $path_alias = path_load(array(
          'alias' => $url,
        ));
        if ($url == '<front>') {
          $final_pages[] = '&lt;front&gt;';
        }
        elseif (strpos($url, '*') !== FALSE) {
          $final_pages[] = $url;
        }
        elseif (url($url) != '/' . $url) {
          $final_pages[] = substr(url($url), 1) . ' (' . $url . ')';
        }
        elseif ($path_alias) {
          $final_pages[] = $url . ' (' . $path_alias['source'] . ')';
        }
        else {
          $final_pages[] = $url;
        }
      }
      $visibilities['page'] = array(
        '#title' => $block->visibility ? t('Only the listed pages') : t('All pages except those listed'),
        '#description' => implode('<br>', $final_pages),
      );
    }
  }
  if (isset($block_node_type[$block->module][$block->delta])) {
    $visibilities['node_type'] = array(
      '#title' => t('By Content Type'),
      '#description' => implode('<br>', $block_node_type[$block->module][$block->delta]),
    );
  }
  if (isset($block_roles[$block->module][$block->delta])) {
    $visibilities['role'] = array(
      '#title' => t('By Role'),
      '#description' => implode('<br>', $block_roles[$block->module][$block->delta]),
    );
  }
  if ($block->custom) {
    $visibilities['custom'] = array(
      '#title' => ($block->custom = 1) ? t('Customizable, visible by default') : t('Customizable, hidden by default'),
      '#description' => '',
    );
  }

  // TODO: Add context
  return $visibilities;
}

/**
 * Theme function for block visibility
 */
function theme_block_visibility($variables) {
  if (isset($variables['element']['#do_render']) && $variables['element']['#do_render']) {
    $output = '';
    foreach ($variables['element']['#visibles'] as $visible) {
      $output .= '<div class="block_visibility_title">' . $visible['#title'] . ($visible['#description'] ? '<div class="block_visibility_description">' . $visible['#description'] . '</div>' : '') . '</div>';
    }
    return $output;
  }
  else {

    // We get here the initial time in template_preprocess_block_admin_display_form which
    // isn't smart enough to know where to place this column. Render nothing this time and
    // fix it when we come back the second time.
    return '';
  }
}

Functions

Namesort descending Description
block_visibility_block_visibility Implements hook_block_visibility()
block_visibility_form_block_admin_display_form_alter Form alter for block_admin_display_form()
block_visibility_get_visibilities Get a pretty printable list of block visibilities.
block_visibility_preprocess_block_admin_display_form Implements hook_preprocess_block_admin_display_form()
block_visibility_theme Implements hook_theme()
block_visibility_theme_registry_alter Implements hook_theme_registry_alter()
theme_block_visibility Theme function for block visibility