You are here

function page_manager_page_execute in Chaos Tool Suite (ctools) 6

Same name and namespace in other branches
  1. 7 page_manager/plugins/tasks/page.inc \page_manager_page_execute()

Execute a page task.

This is the callback to entries in the Drupal menu system created by the page task.

Parameters

$subtask_id: The name of the page task used.

...: A number of context objects as specified by the user when creating named arguments in the path.

2 string references to 'page_manager_page_execute'
page_manager_page_form_basic_validate in page_manager/plugins/tasks/page.admin.inc
Validate the basic form.
page_manager_page_menu_item in page_manager/plugins/tasks/page.admin.inc
Create a menu item for page manager pages.

File

page_manager/plugins/tasks/page.inc, line 263
Handle the 'page' task, which creates pages with arbitrary tasks and lets handlers decide how they will be rendered.

Code

function page_manager_page_execute($subtask_id) {
  $page = page_manager_page_load($subtask_id);
  $task = page_manager_get_task($page->task);
  $subtask = page_manager_get_task_subtask($task, $subtask_id);

  // Turn the contexts into a properly keyed array.
  $contexts = array();
  $args = array();
  foreach (func_get_args() as $count => $arg) {
    if (is_object($arg) && get_class($arg) == 'ctools_context') {
      $contexts[$arg->id] = $arg;
      $args[] = $arg->original_argument;
    }
    else {
      if ($count) {
        $args[] = $arg;
      }
    }
  }
  $count = 0;
  $names = page_manager_page_get_named_arguments($page->path);
  $bits = explode('/', $page->path);
  if ($page->arguments) {
    foreach ($page->arguments as $name => $argument) {

      // Optional arguments must be converted to contexts too, if they exist.
      if ($bits[$names[$name]][0] == '!') {
        ctools_include('context');
        $argument['keyword'] = $name;
        if (isset($args[$count])) {

          // Hack: use a special argument config variable to learn if we need
          // to use menu_tail style behavior:
          if (empty($argument['settings']['use_tail'])) {
            $value = $args[$count];
          }
          else {
            $value = implode('/', array_slice($args, $count));
          }
          $context = ctools_context_get_context_from_argument($argument, $value);
        }
        else {

          // make sure there is a placeholder context for missing optional contexts.
          $context = ctools_context_get_context_from_argument($argument, NULL, TRUE);

          // Force the title to blank for replacements
        }
        if ($context) {
          $contexts[$context->id] = $context;
        }
      }
      $count++;
    }
  }

  // Add a fake tab for 'View' so that edit tabs can be added.
  if (user_access('administer page manager') && (!isset($page->menu['type']) || in_array($page->menu['type'], array(
    'tab',
    'default tab',
  )))) {
    ctools_include('menu');
    ctools_menu_add_tab(array(
      'title' => t('View'),
      'href' => $_GET['q'],
      'type' => MENU_DEFAULT_LOCAL_TASK,
      'weight' => -10,
    ));
  }
  if ($function = ctools_plugin_get_function($task, 'page callback')) {
    return call_user_func_array($function, array(
      $page,
      $contexts,
      $args,
    ));
  }
  ctools_include('context-task-handler');
  $output = ctools_context_handler_render($task, $subtask, $contexts, $args);
  if ($output === FALSE) {
    return drupal_not_found();
  }
  return $output;
}