$task_name, 'task' => $task, 'subtask' => $subtask, 'contexts' => $contexts, 'arguments' => $args, 'handler' => $handler, )); if (!empty($info['response code']) && $info['response code'] != 200) { switch ($info['response code']) { case 403: return MENU_ACCESS_DENIED; case 404: return MENU_NOT_FOUND; case 301: case 302: case 303: case 304: case 305: case 307: $info += array( 'query' => '', 'fragment' => '', ); return drupal_goto($info['destination'], $info['query'], $info['fragment'], $info['response code']); // @todo -- should other response codes be supported here? } } /* // Only do this if something hasn't already changed the active menu, // such as a book. if (menu_get_active_menu_name() == 'navigation') { $item = menu_get_item(); $mlink = db_fetch_object(db_query("SELECT * FROM {menu_links} WHERE link_path = '%s'", $item['href'])); if ($mlink && isset($mlink->menu_name)) { menu_set_active_menu_name($mlink->menu_name); } } */ foreach (ctools_context_handler_get_task_arguments($task, $subtask) as $id => $argument) { $plugin = ctools_get_argument($argument['name']); $cid = ctools_context_id($argument, 'argument'); if (!empty($contexts[$cid]) && ($function = ctools_plugin_get_function($plugin, 'breadcrumb'))) { $function($argument['settings'], $contexts[$cid]); } } if (isset($info['title'])) { drupal_set_title($info['title']); } // Only directly output if $page was set to true. if (!empty($info['no_blocks'])) { print theme('page', $info['content'], FALSE); return; } else { return $info['content']; } } } } return FALSE; } /** * Called to execute actions that should happen before a handler is rendered. */ function ctools_context_handler_pre_render($handler, $contexts, $args) { $plugin = page_manager_get_task_handler($handler->handler); if (user_access('administer page manager') && isset($handler->task)) { // Provide a tab to edit this context: ctools_include('menu'); $task = page_manager_get_task($handler->task); $title = !empty($task['tab title']) ? $task['tab title'] : t('Edit @type', array('@type' => $plugin['title'])); $trail = array(); if (!empty($plugin['tab operation'])) { if (is_array($plugin['tab operation'])) { $trail = $plugin['tab operation']; } else if (function_exists($plugin['tab operation'])) { $trail = $plugin['tab operation']($handler, $contexts, $args); } } ctools_menu_add_tab(array( 'title' => $title, 'href' => page_manager_edit_url(page_manager_make_task_name($handler->task, $handler->subtask), $trail), )); } } /** * Compare arguments to contexts for selection purposes. * * @param $handler * The handler in question. * @param $contexts * The context objects provided by the task. * * @return * TRUE if these contexts match the selection rules. NULL or FALSE * otherwise. */ function ctools_context_handler_select($handler, $contexts) { if (empty($handler->conf['access'])) { return TRUE; } ctools_include('context'); return ctools_access($handler->conf['access'], $contexts); } /** * Get the array of summary strings for the arguments. * * These summary strings are used to communicate to the user what * arguments the task handlers are selecting. * * @param $task * The loaded task plugin. * @param $subtask * The subtask id. * @param $handler * The handler to be checked. */ function ctools_context_handler_summary($task, $subtask, $handler) { if (empty($handler->conf['access']['plugins'])) { return array(); } ctools_include('context'); $strings = array(); $contexts = ctools_context_handler_get_all_contexts($task, $subtask, $handler); foreach ($handler->conf['access']['plugins'] as $test) { $plugin = ctools_get_access_plugin($test['name']); if ($string = ctools_access_summary($plugin, $contexts, $test)) { $strings[] = $string; } } return $strings; } // -------------------------------------------------------------------------- // Tasks and Task handlers can both have their own sources of contexts. // Sometimes we need all of these contexts at once (when editing // the task handler, for example) but sometimes we need them separately // (when a task has contexts loaded and is trying out the task handlers, // for example). Therefore there are two paths we can take to getting contexts. /** * Load the contexts for a task, using arguments. * * This creates the base array of contexts, loaded from arguments, suitable * for use in rendering. */ function ctools_context_handler_get_task_contexts($task, $subtask, $args) { $contexts = ctools_context_handler_get_base_contexts($task, $subtask); $arguments = ctools_context_handler_get_task_arguments($task, $subtask); ctools_context_get_context_from_arguments($arguments, $contexts, $args); return $contexts; } /** * Load the contexts for a task handler. * * This expands a base set of contexts passed in from a task with the * contexts defined on the task handler. The contexts from the task * must already have been loaded. */ function ctools_context_handler_get_handler_contexts($contexts, $handler) { $object = ctools_context_handler_get_handler_object($handler); return ctools_context_load_contexts($object, FALSE, $contexts); } /** * Load the contexts for a task and task handler together. * * This pulls the arguments from a task and everything else from a task * handler and loads them as a group. Since there is no data, this loads * the contexts as placeholders. */ function ctools_context_handler_get_all_contexts($task, $subtask, $handler) { $contexts = array(); $object = ctools_context_handler_get_task_object($task, $subtask, $handler); $contexts = ctools_context_load_contexts($object, TRUE, $contexts); ctools_context_handler_set_access_restrictions($task, $subtask, $handler, $contexts); return $contexts; } /** * Create an object suitable for use with the context system that kind of * expects things in a certain, kind of clunky format. */ function ctools_context_handler_get_handler_object($handler) { $object = new stdClass; $object->name = $handler->name; $object->contexts = isset($handler->conf['contexts']) ? $handler->conf['contexts'] : array(); $object->relationships = isset($handler->conf['relationships']) ? $handler->conf['relationships'] : array(); return $object; } /** * Create an object suitable for use with the context system that kind of * expects things in a certain, kind of clunky format. This one adds in * arguments from the task. */ function ctools_context_handler_get_task_object($task, $subtask, $handler) { $object = new stdClass; $object->name = !empty($handler->name) ? $handler->name : 'temp'; $object->base_contexts = ctools_context_handler_get_base_contexts($task, $subtask, TRUE); $object->arguments = ctools_context_handler_get_task_arguments($task, $subtask); $object->contexts = isset($handler->conf['contexts']) ? $handler->conf['contexts'] : array(); $object->relationships = isset($handler->conf['relationships']) ? $handler->conf['relationships'] : array(); return $object; } /** * Get base contexts from a task, if it has any. * * Tasks can get their contexts either from base contexts or arguments; base * contexts extract their information from the environment. */ function ctools_context_handler_get_base_contexts($task, $subtask, $placeholders = FALSE) { if ($function = ctools_plugin_get_function($task, 'get base contexts')) { return $function($task, $subtask, $placeholders); } return array(); } /** * Get the arguments from a task that are used to load contexts. */ function ctools_context_handler_get_task_arguments($task, $subtask) { if ($function = ctools_plugin_get_function($task, 'get arguments')) { return $function($task, $subtask); } return array(); } /** * Set any access restrictions on the contexts for a handler. * * Both the task and the handler could add restrictions to the contexts * based upon the access control. These restrictions might be useful * to limit what kind of content appears in the add content dialog; * for example, if we have an access item that limits a node context * to only 'story' and 'page' types, there is no need for content that * only applies to the 'poll' type to appear. */ function ctools_context_handler_set_access_restrictions($task, $subtask, $handler, &$contexts) { // First, for the task: if ($function = ctools_plugin_get_function($task, 'access restrictions')) { $function($task, $subtask, $contexts); } // Then for the handler: if (isset($handler->conf['access'])) { ctools_access_add_restrictions($handler->conf['access'], $contexts); } } /** * Form to choose context based selection rules for a task handler. * * The configuration will be assumed to go simply in $handler->conf and * will be keyed by the argument ID. */ function ctools_context_handler_edit_criteria(&$form, &$form_state) { if (!isset($form_state['handler']->conf['access'])) { $form_state['handler']->conf['access'] = array(); } ctools_include('context'); ctools_include('modal'); ctools_include('ajax'); ctools_modal_add_plugin_js(ctools_get_access_plugins()); ctools_include('context-access-admin'); $form_state['module'] = 'page_manager_task_handler'; // Encode a bunch of info into the argument so we can get our cache later $form_state['callback argument'] = $form_state['task_name'] . '*' . $form_state['handler']->name; $form_state['access'] = $form_state['handler']->conf['access']; $form_state['no buttons'] = TRUE; $form_state['contexts'] = ctools_context_handler_get_all_contexts($form_state['task'], $form_state['subtask'], $form_state['handler']); $form['markup'] = array( '#value' => '