View source
<?php
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');
}
function block_visibility_theme() {
return array(
'block_visibility' => array(
'render element' => 'element',
),
);
}
function block_visibility_get_visibilities($block) {
return module_invoke_all('block_visibility', $block);
}
function block_visibility_preprocess_block_admin_display_form(&$variables) {
foreach (element_children($variables['form']['blocks']) as $i) {
$block =& $variables['form']['blocks'][$i];
$region = isset($block['region']['#default_value']) ? $block['region']['#default_value'] : BLOCK_REGION_NONE;
unset($block['visibility']['#printed']);
$block['visibility']['#do_render'] = TRUE;
$variables['block_listing'][$region][$i]->visibility = drupal_render($block['visibility']);
}
}
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),
);
}
}
function block_visibility_block_visibility($block) {
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];
}
}
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 ($block->pages) {
if ($block->visibility == 2) {
$visibilities['page'] = array(
'#title' => t('PHP'),
'#description' => '<code>' . str_replace(array(
'<',
'>',
"\r\n",
" ",
), array(
'<',
'>',
'<br>',
' ',
), $block->pages) . '</code>',
);
}
else {
$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[] = '<front>';
}
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' => '',
);
}
return $visibilities;
}
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 {
return '';
}
}