You are here

function page_manager_page_menu in Chaos Tool Suite (ctools) 7

Same name and namespace in other branches
  1. 6 page_manager/plugins/tasks/page.admin.inc \page_manager_page_menu()

Delegated implementation of hook_menu().

1 string reference to 'page_manager_page_menu'
page_manager_page_page_manager_tasks in page_manager/plugins/tasks/page.inc
Specialized implementation of hook_page_manager_task_tasks(). See api-task.html for more information.

File

page_manager/plugins/tasks/page.admin.inc, line 15
Administrative functions for the page subtasks.

Code

function page_manager_page_menu(&$items, $task) {

  // Set up access permissions.
  $access_callback = isset($task['admin access callback']) ? $task['admin access callback'] : 'user_access';
  $access_arguments = isset($task['admin access arguments']) ? $task['admin access arguments'] : array(
    'administer page manager',
  );
  $base = array(
    'access callback' => $access_callback,
    'access arguments' => $access_arguments,
    'file' => 'plugins/tasks/page.admin.inc',
  );
  $items['admin/structure/pages/add'] = array(
    'title' => 'Add custom page',
    'page callback' => 'page_manager_page_add_subtask',
    'page arguments' => array(),
    'type' => MENU_LOCAL_ACTION,
  ) + $base;
  $items['admin/structure/pages/import'] = array(
    'title' => 'Import page',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'page_manager_page_import_subtask',
      'page',
    ),
    'type' => MENU_LOCAL_ACTION,
  ) + $base;
  if ($access_callback == 'user_access') {
    $items['admin/structure/pages/import']['access callback'] = 'ctools_access_multiperm';
    $items['admin/structure/pages/import']['access arguments'][] = 'use ctools import';
  }

  // AJAX callbacks for argument modal.
  $items['admin/structure/pages/argument'] = array(
    'page callback' => 'page_manager_page_subtask_argument_ajax',
    'type' => MENU_CALLBACK,
  ) + $base;

  // Add menu entries for each subtask.
  foreach (page_manager_page_load_all() as $subtask_id => $subtask) {
    if (!empty($subtask->disabled)) {
      continue;
    }
    if (!isset($subtask->access['type'])) {
      $subtask->access['type'] = 'none';
    }
    if (!isset($subtask->access['settings'])) {
      $subtask->access['settings'] = NULL;
    }
    $path = array();
    $page_arguments = array(
      (string) $subtask_id,
    );
    $access_arguments = array(
      $subtask->access,
    );
    $load_arguments = array(
      $subtask_id,
      '%index',
      '%map',
    );

    // Replace named placeholders with our own placeholder to load contexts.
    $position = 0;
    foreach (explode('/', $subtask->path) as $bit) {

      // Remove things like double slashes completely.
      if (!isset($bit) || $bit === '') {
        continue;
      }
      if ($bit[0] == '%' && $bit != '%') {
        $placeholder = '%pm_arg';

        // Chop off that %.
        $name = substr($bit, 1);

        // Check to see if the argument plugin wants to use a different
        // placholder. This will allow to_args.
        if (!empty($subtask->arguments[$name])) {
          ctools_include('context');
          if (!empty($subtask->arguments[$name]['name'])) {
            $plugin = ctools_get_argument($subtask->arguments[$name]['name']);
            if (isset($plugin['path placeholder'])) {
              if (function_exists($plugin['path placeholder'])) {
                $placeholder = $plugin['path placeholder']($subtask->arguments[$name]);
              }
              else {
                $placeholder = $plugin['path placeholder'];
              }
            }
          }
        }

        // If an argument, swap it out with our argument loader and make sure
        // the argument gets passed through to the page callback.
        $path[] = $placeholder;
        $page_arguments[] = $position;
        $access_arguments[] = $position;
      }
      elseif ($bit[0] != '!') {
        $path[] = $bit;
      }

      // Increment position. We do it like this to skip empty items that
      // could happen from erroneous paths like: this///that.
      $position++;
    }
    $menu_path = implode('/', $path);
    $items[$menu_path] = page_manager_page_menu_item($task, $subtask->menu, $access_arguments, $page_arguments, $load_arguments);

    // Add a parent menu item if one is configured.
    if (isset($subtask->menu['type']) && $subtask->menu['type'] == 'default tab') {
      array_pop($path);
      $parent_path = implode('/', $path);
      $items[$parent_path] = page_manager_page_menu_item($task, $subtask->menu['parent'], $access_arguments, $page_arguments, $load_arguments);
    }
  }
}