View source
<?php
function context_theme() {
$items = array();
$items['context_links'] = array(
'arguments' => array(),
);
return $items;
}
function context_theme_registry_alter(&$theme_registry) {
if (!in_array('context_preprocess_page', $theme_registry['page']['preprocess functions'])) {
$theme_registry['page']['preprocess functions'][] = 'context_preprocess_page';
}
unset($theme_registry['blocks']['preprocess functions']);
$theme_registry['blocks']['function'] = 'context_blocks';
}
function context_context_conditions() {
$items = array();
$nodetypes = array();
foreach (node_get_types() as $type) {
$nodetypes[$type->type] = t(drupal_ucfirst($type->name));
}
$items['node'] = array(
'#title' => t('Node pages'),
'#description' => t('Set this context when viewing a node page or using the add/edit form of one of these content types.'),
'#options' => $nodetypes,
'#type' => 'checkboxes',
);
$items['user'] = array(
'#title' => t('User pages'),
'#description' => t('Set this context when a user with selected role(s) is viewed'),
'#options' => user_roles(true),
'#type' => 'checkboxes',
);
if (module_exists('book')) {
$options = array();
foreach (book_get_books() as $book) {
$options[$book['menu_name']] = $book['title'];
}
$items['book'] = array(
'#title' => t('Book'),
'#description' => t('Set this context when a node in the selected book is viewed.'),
'#options' => $options,
'#type' => 'checkboxes',
);
}
$items['sitewide'] = array(
'#title' => t('Sitewide context'),
'#type' => 'radios',
'#options' => array(
0 => t('False'),
1 => t('True'),
),
'#description' => t('Should this context always be set? If <strong>true</strong>, this context will be active across your entire site.'),
);
$items['path'] = array(
'#title' => t('Path'),
'#description' => t('Set this context when any of the paths above match the beginning or all of the page path. Put each path on a separate line.'),
'#type' => 'textarea',
'#element_validate' => array(
'context_condition_text_validate',
),
);
return $items;
}
function context_condition_text_validate($element, &$form_state) {
if (!empty($element['#value']) && in_array($element['#type'], array(
'textfield',
'textarea',
))) {
switch ($element['#type']) {
case 'textfield':
$delimiter = ',';
break;
case 'textarea':
$delimiter = "\n";
break;
}
$items = $element['#value'];
$items = explode($delimiter, $items);
if (!empty($items)) {
$values = array();
foreach ($items as $k => $v) {
$v = trim($v);
if (!empty($v)) {
$values[$v] = TRUE;
}
}
$id = end($element['#parents']);
$form_state['values']['items'][$id] = $values;
}
}
}
function context_context_reactions() {
$items = array();
if (module_exists('menu')) {
$menus = menu_parent_options(array_reverse(menu_get_menus()), NULL);
$root_menus = array();
foreach ($menus as $key => $name) {
$id = explode(':', $key);
if ($id[1] == '0') {
$root_menus[$id[0]] = check_plain($name);
}
else {
$link = menu_link_load($id[1]);
$root_menu = $root_menus[$id[0]];
$menus[$root_menu][$link['link_path']] = $name;
}
unset($menus[$key]);
}
array_unshift($menus, "-- " . t('None') . " --");
$items['menu'] = array(
'#title' => t('Active menu'),
'#description' => t('Display the selected menu item as active when this context is set. To use this feature, you must use <strong>theme_context_links()</strong> to theme your links. Please see README.txt for more information.'),
'#options' => $menus,
'#type' => 'select',
);
}
$items['theme_section'] = array(
'#tree' => true,
'#title' => t('Theme variables'),
'title' => array(
'#title' => t('Section title'),
'#description' => t('Provides this text as a <strong>$section_title</strong> variable for display in page.tpl.php when this context is active.'),
'#type' => 'textfield',
'#maxlength' => 255,
),
'subtitle' => array(
'#title' => t('Section subtitle'),
'#description' => t('Provides this text as a <strong>$section_subtitle</strong> variable for display in page.tpl.php when this context is active.'),
'#type' => 'textfield',
'#maxlength' => 255,
),
'class' => array(
'#title' => t('Section class'),
'#description' => t('Provides this text as an additional body class (in <strong>$body_classes</strong> in page.tpl.php) when this section is active. Note that there may only be <strong>one</strong> active section class at once.'),
'#type' => 'textfield',
'#maxlength' => 64,
),
);
$theme_key = variable_get('theme_default', 'garland');
$regions = system_region_list($theme_key);
$items['theme_regiontoggle'] = array(
'#title' => t('Disabled regions'),
'#type' => 'checkboxes',
'#options' => $regions,
);
return $items;
}
function context_nodeapi(&$node, $op, $teaser, $page) {
if ($op == 'view' && $page && menu_get_object() === $node) {
context_set_by_condition('node', $node->type);
if (module_exists('book') && isset($node->book)) {
if ($node->book['menu_name']) {
context_set_by_condition('book', $node->book['menu_name']);
}
}
}
}
function context_form_alter(&$form, $form_state, $form_id) {
if (isset($form['#node']) && arg(0) != 'admin') {
context_set_by_condition('node', $form['#node']->type);
}
if ($form_id == 'system_modules') {
context_invalidate_cache();
}
}
function context_form_comment_form_alter(&$form, $form_state) {
if ($nid = $form['nid']['#value']) {
$node = node_load($nid);
context_set_by_condition('node', $node->type);
}
}
function context_user($op, &$edit, &$account, $category = NULL) {
if ($op == 'view' && !empty($account->roles)) {
foreach (array_keys($account->roles) as $rid) {
context_set_by_condition('user', $rid);
}
}
}
function context_blocks($region) {
$output = "";
if ($list = context_block_list($region)) {
foreach ($list as $key => $block) {
$output .= theme("block", $block);
}
}
$output .= drupal_get_content($region);
return $output;
}
function context_block_list($region) {
static $blocks;
static $context_blocks;
static $disabled_regions;
if (!isset($context_blocks)) {
$blocks = array();
$context_blocks = array();
$disabled_regions = array();
$context_blocks = array();
foreach (context_active_values('block') as $block) {
$block = (object) $block;
$context_blocks["{$block->module}-{$block->delta}"] = $block;
}
$disabled_regions = context_active_values('theme_regiontoggle');
global $user, $theme_key;
$rids = array_keys($user->roles);
$result = db_query(db_rewrite_sql("SELECT DISTINCT b.* FROM {blocks} b LEFT JOIN {blocks_roles} r ON b.module = r.module AND b.delta = r.delta WHERE b.theme = '%s' AND (r.rid IN (" . db_placeholders($rids) . ") OR r.rid IS NULL) ORDER BY b.region, b.weight, b.module", 'b', 'bid'), array_merge(array(
$theme_key,
), $rids));
while ($block = db_fetch_object($result)) {
$bid = "{$block->module}-{$block->delta}";
if (!empty($context_blocks[$bid])) {
$block->region = $context_blocks[$bid]->region;
$block->weight = $context_blocks[$bid]->weight;
$enabled = TRUE;
}
else {
if (!$block->status) {
continue;
}
}
if (!isset($blocks[$block->region])) {
$blocks[$block->region] = array();
}
if ($block->custom != 0) {
if ($user->uid && isset($user->block[$block->module][$block->delta])) {
$enabled = $user->block[$block->module][$block->delta];
}
else {
$enabled = $block->custom == 1;
}
}
else {
$enabled = TRUE;
}
if ($block->pages) {
if ($block->visibility < 2) {
$path = drupal_get_path_alias($_GET['q']);
$page_match = drupal_match_path($path, $block->pages);
if ($path != $_GET['q']) {
$page_match = $page_match || drupal_match_path($_GET['q'], $block->pages);
}
$page_match = !($block->visibility xor $page_match);
}
else {
$page_match = drupal_eval($block->pages);
}
}
else {
$page_match = TRUE;
}
$block->enabled = $enabled;
$block->page_match = $page_match;
$blocks[$block->region]["{$block->module}_{$block->delta}"] = $block;
}
foreach ($blocks as $r => $dummy) {
uasort($blocks[$r], '_context_block_sort');
}
}
foreach (array_keys($disabled_regions) as $r) {
unset($blocks[$r]);
}
if (!isset($blocks[$region])) {
$blocks[$region] = array();
}
foreach ($blocks[$region] as $key => $block) {
if (!isset($block->content)) {
unset($blocks[$region][$key]);
if ($block->enabled && $block->page_match) {
if (!($block->throttle && module_invoke('throttle', 'status') > 0)) {
if (!count(module_implements('node_grants')) && $_SERVER['REQUEST_METHOD'] == 'GET' && ($cid = _block_get_cache_id($block)) && ($cache = cache_get($cid, 'cache_block'))) {
$array = $cache->data;
}
else {
$array = module_invoke($block->module, 'block', 'view', $block->delta);
if (isset($cid)) {
cache_set($cid, $array, 'cache_block', CACHE_TEMPORARY);
}
}
if (isset($array) && is_array($array)) {
foreach ($array as $k => $v) {
$block->{$k} = $v;
}
}
}
if (isset($block->content) && $block->content) {
if ($block->title) {
$block->subject = $block->title == '<none>' ? '' : check_plain($block->title);
}
if (!isset($block->subject)) {
$block->subject = '';
}
$blocks[$block->region]["{$block->module}_{$block->delta}"] = $block;
}
}
}
}
return $blocks[$region];
}
function _context_block_sort($a, $b) {
return $a->weight - $b->weight;
}
function theme_context_links($links) {
$output = '';
foreach ($links as $link) {
$options = array_merge($link, array(
'attributes' => array(
'class' => 'button',
),
));
if (!empty($link['custom'])) {
$output .= l($link['title'], $link['href'], $options);
}
else {
$output .= l('+ ' . t('Add !type', array(
'!type' => $link['title'],
)), $link['href'], $options);
}
}
return $output;
}
function context_links($reset = false) {
static $links;
if (!$links || $reset) {
$links = array();
$active_types = context_active_values('node');
if (!empty($active_types)) {
$types = node_get_types();
foreach ($active_types as $type) {
$type_url = str_replace('_', '-', $type);
$add_url = 'node/add/' . $type_url;
if (isset($types[$type]) && strpos($_GET['q'], $add_url) === FALSE && node_access('create', $type)) {
$links[$type_url] = array(
'title' => $types[$type]->name,
'href' => $add_url,
);
}
}
}
drupal_alter('context_links', $links);
}
return $links;
}
function context_preprocess_page(&$vars) {
$info = context_active_values('theme_section');
$vars['section_title'] = !empty($info['title']) ? $info['title'] : '';
$vars['section_subtitle'] = !empty($info['subtitle']) ? $info['subtitle'] : '';
$vars['body_classes'] .= !empty($info['class']) ? ' ' . $info['class'] : '';
if (variable_get('menu_primary_links_source', 'primary-links') == variable_get('menu_secondary_links_source', 'secondary-links')) {
$vars['primary_links'] = context_menu_navigation_links(variable_get('menu_primary_links_source', 'primary-links'));
$vars['secondary_links'] = context_menu_navigation_links(variable_get('menu_secondary_links_source', 'secondary-links'), 1);
}
$vars['primary_links'] = context_menu_set_active($vars['primary_links']);
$vars['secondary_links'] = context_menu_set_active($vars['secondary_links']);
if ($context_links = context_links()) {
$vars['context_links'] = theme('context_links', $context_links);
}
}
function context_menu_set_active($links = array(), $reset = FALSE) {
$active_paths = context_active_values('menu');
$new_links = array();
if (!empty($links)) {
foreach ($links as $key => $link) {
if (!empty($link['href']) && in_array($link['href'], $active_paths)) {
if (isset($links['attributes']['class'])) {
$link['attributes']['class'] .= ' active';
}
else {
$link['attributes']['class'] = 'active';
}
if (strpos(' active', $key) === FALSE) {
$new_links[$key . ' active'] = $link;
}
}
else {
$new_links[$key] = $link;
}
}
}
return $new_links;
}
function context_menu_navigation_links($menu_name, $level = 0) {
$original_path = $_GET['q'];
$active_paths = context_active_values('menu');
if (!empty($active_paths)) {
$path = current($active_paths);
if (menu_get_item($path)) {
menu_set_active_item($path);
}
}
$links = menu_navigation_links($menu_name, $level);
menu_set_active_item($original_path);
return $links;
}