View source
<?php
require 'context.core.inc';
define('CONTEXT_GET', 0);
define('CONTEXT_SET', 1);
define('CONTEXT_ISSET', 2);
define('CONTEXT_CLEAR', 3);
define('CONTEXT_CONDITION_MODE_OR', 0);
define('CONTEXT_CONDITION_MODE_AND', 1);
function context_context($op = CONTEXT_GET, $namespace = NULL, $attribute = NULL, $value = NULL) {
static $context;
$context = !$context ? array() : $context;
switch ($op) {
case CONTEXT_GET:
if (!$namespace) {
return $context;
}
else {
if (isset($context[(string) $namespace])) {
if (is_array($context[(string) $namespace]) && isset($context[(string) $namespace][(string) $attribute])) {
return $context[(string) $namespace][(string) $attribute];
}
elseif (!$attribute) {
return $context[(string) $namespace];
}
}
}
break;
case CONTEXT_SET:
if (is_string($namespace) || is_int($namespace)) {
if (!$attribute) {
$context[(string) $namespace] = array();
return TRUE;
}
if ($value === NULL) {
if (is_string($attribute) || is_int($attribute)) {
$context[(string) $namespace][(string) $attribute] = TRUE;
return TRUE;
}
elseif (is_array($attribute) || is_object($attribute)) {
$context[(string) $namespace] = $attribute;
return TRUE;
}
}
if ((is_string($attribute) || is_int($attribute)) && $value !== NULL) {
$context[$namespace][$attribute] = $value;
return TRUE;
}
}
break;
case CONTEXT_ISSET:
if (!$namespace) {
return FALSE;
}
if (!$attribute) {
return isset($context[$namespace]);
}
return isset($context[$namespace][$attribute]);
case CONTEXT_CLEAR:
$context = array();
return TRUE;
}
return FALSE;
}
function context_set($namespace, $attribute = NULL, $value = NULL) {
return context_context(CONTEXT_SET, $namespace, $attribute, $value);
}
function context_get($namespace = NULL, $attribute = NULL) {
return context_context(CONTEXT_GET, $namespace, $attribute, NULL);
}
function context_isset($namespace = NULL, $attribute = NULL) {
return context_context(CONTEXT_ISSET, $namespace, $attribute, NULL);
}
function context_exists($namespace = NULL, $attribute = NULL) {
return context_context(CONTEXT_ISSET, $namespace, $attribute, NULL);
}
function context_clear() {
return context_context(CONTEXT_CLEAR);
}
function context_ctools_plugin_plugins() {
return array(
'cache' => TRUE,
'use hooks' => TRUE,
);
}
function context_context_plugins() {
module_load_include('inc', 'context', 'context.plugins');
return _context_context_plugins();
}
function context_context_registry() {
module_load_include('inc', 'context', 'context.plugins');
return _context_context_registry();
}
function context_init() {
if ($plugin = context_get_plugin('condition', 'path')) {
$plugin
->execute();
}
if ($plugin = context_get_plugin('condition', 'language')) {
global $language;
$plugin
->execute($language->language);
}
if ($plugin = context_get_plugin('condition', 'user')) {
global $user;
$plugin
->execute($user);
}
}
function context_load($name = NULL, $reset = FALSE) {
ctools_include('export');
static $contexts;
static $altered;
if (!isset($contexts) || $reset) {
$contexts = $altered = array();
if (!$reset && ($contexts = context_cache_get('context'))) {
}
else {
if ($reset) {
ctools_export_load_object_reset('context');
}
$contexts = ctools_export_load_object('context', 'all');
context_cache_set('context', $contexts);
}
}
if (isset($name)) {
if (isset($contexts[$name]) && !isset($altered[$name])) {
$altered[$name] = TRUE;
drupal_alter('context_load', $contexts[$name]);
}
return isset($contexts[$name]) ? $contexts[$name] : FALSE;
}
return $contexts;
}
function context_save($context) {
$existing = context_load($context->name, TRUE);
if ($existing && $existing->export_type & EXPORT_IN_DATABASE) {
drupal_write_record('context', $context, 'name');
}
else {
drupal_write_record('context', $context);
}
context_load(NULL, TRUE);
context_invalidate_cache();
return TRUE;
}
function context_delete($context) {
if (isset($context->name) && $context->export_type & EXPORT_IN_DATABASE) {
db_query("DELETE FROM {context} WHERE name = '%s'", $context->name);
context_invalidate_cache();
return TRUE;
}
return FALSE;
}
function context_export($context, $indent = '') {
$output = ctools_export_object('context', $context, $indent);
$translatables = array();
foreach (array(
'description',
'tag',
) as $key) {
if (!empty($context->{$key})) {
$translatables[] = $context->{$key};
}
}
$translatables = array_filter(array_unique($translatables));
if (!empty($translatables)) {
$output .= "\n";
$output .= "{$indent}// Translatables\n";
$output .= "{$indent}// Included for use with string extractors like potx.\n";
sort($translatables);
foreach ($translatables as $string) {
$output .= "{$indent}t(" . ctools_var_export($string) . ");\n";
}
}
return $output;
}
function context_context_list() {
$contexts = context_load(NULL, TRUE);
$list = array();
foreach ($contexts as $context) {
$list[$context->name] = $context->name;
}
return $list;
}
function context_cache_get($key, $reset = FALSE) {
static $cache;
if (!isset($cache) || $reset) {
$cache = cache_get('context', 'cache');
$cache = $cache ? $cache->data : array();
}
return !empty($cache[$key]) ? $cache[$key] : FALSE;
}
function context_cache_set($key, $value) {
$cache = cache_get('context', 'cache');
$cache = $cache ? $cache->data : array();
$cache[$key] = $value;
cache_set('context', $cache);
}
function context_enabled_contexts($reset = FALSE) {
$enabled = array();
foreach (context_load(NULL, $reset) as $context) {
if (empty($context->disabled)) {
$enabled[$context->name] = $context;
}
}
return $enabled;
}
function context_condition_met($context, $condition, $reset = FALSE) {
static $queue;
if (!isset($queue) || $reset) {
$queue = array();
}
if (!context_isset('context', $context->name)) {
if (isset($context->condition_mode) && $context->condition_mode == CONTEXT_CONDITION_MODE_AND) {
$queue[$context->name][$condition] = $condition;
if (!array_diff(array_keys($context->conditions), $queue[$context->name])) {
context_set('context', $context->name, $context);
}
}
else {
context_set('context', $context->name, $context);
}
}
}
function context_active_contexts() {
$contexts = context_get('context');
return !empty($contexts) && is_array($contexts) ? $contexts : array();
}
function context_condition_map($reset = FALSE) {
static $condition_map;
if (!isset($condition_map) || $reset) {
if (!$reset && ($cache = context_cache_get('condition_map'))) {
$condition_map = $cache;
}
else {
$condition_map = array();
foreach (array_keys(context_conditions()) as $condition) {
if ($plugin = context_get_plugin('condition', $condition)) {
foreach (context_enabled_contexts() as $context) {
$values = $plugin
->fetch_from_context($context, 'values');
foreach ($values as $value) {
if (!isset($condition_map[$condition][$value])) {
$condition_map[$condition][$value] = array();
}
$condition_map[$condition][$value][] = $context->name;
}
}
}
}
context_cache_set('condition_map', $condition_map);
}
}
return $condition_map;
}
function context_invalidate_cache() {
cache_clear_all('context', 'cache', TRUE);
cache_clear_all('plugins:context', 'cache', TRUE);
}
function context_flush_caches() {
context_invalidate_cache();
}
function context_empty($element) {
$empty = TRUE;
if (is_array($element)) {
foreach ($element as $child) {
$empty = $empty && context_empty($child);
}
}
else {
$empty = $empty && empty($element);
}
return $empty;
}
function context_get_plugin($type = 'condition', $key, $reset = FALSE) {
static $cache = array();
if (!isset($cache[$type][$key]) || $reset) {
switch ($type) {
case 'condition':
$registry = context_conditions();
break;
case 'reaction':
$registry = context_reactions();
break;
}
if (isset($registry[$key], $registry[$key]['plugin'])) {
ctools_include('plugins');
$info = $registry[$key];
$plugins = ctools_get_plugins('context', 'plugins');
if (isset($plugins[$info['plugin']]) && ($class = ctools_plugin_get_class($plugins[$info['plugin']], 'handler'))) {
$cache[$type][$key] = new $class($key, $info);
}
}
}
return isset($cache[$type][$key]) ? $cache[$type][$key] : FALSE;
}
function context_get_info($type = NULL, $name = NULL, $reset = FALSE) {
static $info;
if (!isset($info) || $reset) {
$result = db_query("SELECT name,type,info FROM {system}");
while ($row = db_fetch_object($result)) {
$info[$row->type][$row->name] = unserialize($row->info);
}
}
if (isset($type, $name)) {
return isset($info[$type][$name]) ? $info[$type][$name] : FALSE;
}
else {
if (isset($type)) {
return isset($info[$type]) ? $info[$type] : FALSE;
}
}
return $info;
}
function context_conditions($reset = FALSE) {
return _context_registry('conditions', $reset);
}
function context_reactions($reset = FALSE) {
return _context_registry('reactions', $reset);
}
function _context_registry($key = NULL, $reset = FALSE) {
static $registry;
if (!isset($registry) || $reset) {
if (!$reset && ($cache = context_cache_get('registry'))) {
$registry = $cache;
}
else {
$registry = module_invoke_all('context_registry');
drupal_alter('context_registry', $registry);
context_cache_set('registry', $registry);
}
}
if (isset($key)) {
return isset($registry[$key]) ? $registry[$key] : array();
}
return $registry;
}