You are here

public function PanelizerEntityDefault::add_admin_links in Panelizer 7.3

Same name and namespace in other branches
  1. 7.2 plugins/entity/PanelizerEntityDefault.class.php \PanelizerEntityDefault::add_admin_links()

Helper function to add administrative menu items into an entity's already existing structure.

While this very closely follows the administrative items placed into the menu in admin.inc, it is a little bit different because of how bundles are placed into the URL. So the code is close but not QUITE reusable without going through some hoops.

Parameters

$root: The root path. This will be something like 'admin/structure/types/manage/%'. Everything will be placed at $root/panelizer/*.

$bundle: This is either the numeric position of the bundle or, for entity types that do not support bundles, a hard coded bundle string.

&$items: The array of menu items this is being added to.

1 call to PanelizerEntityDefault::add_admin_links()
PanelizerEntityDefault::hook_menu in plugins/entity/PanelizerEntityDefault.class.php
Implements a delegated hook_menu.

File

plugins/entity/PanelizerEntityDefault.class.php, line 535
Base class for the Panelizer Entity plugin.

Class

PanelizerEntityDefault
Base class for the Panelizer Entity plugin.

Code

public function add_admin_links($root, $bundle, &$items) {

  // Node $root = 'admin/structure/types/manage/%
  // Taxonomy $root = 'admin/structure/taxonomy/%'
  // User $root = 'admin/config/people/accounts'
  $parts = explode('/', $root);
  $base_count = count($parts);

  // Configure settings pages.
  $settings_base = array(
    'access callback' => 'panelizer_is_panelized',
    'access arguments' => array(
      $this->entity_type,
      $bundle,
    ),
    'file' => 'includes/admin.inc',
  );

  // This is the base tab that will be added. The weight is set
  // to try and make sure it stays to the right of manage fields
  // and manage display.
  $items[$root . '/panelizer'] = array(
    'title' => 'Panelizer',
    'page callback' => 'panelizer_allowed_content_page',
    'page arguments' => array(
      $this->entity_type,
      $bundle,
    ),
    'type' => MENU_LOCAL_TASK,
    'weight' => 5,
  ) + $settings_base;
  $items[$root . '/panelizer/allowed'] = array(
    'title' => 'Allowed content',
    'page callback' => 'panelizer_allowed_content_page',
    'page arguments' => array(
      $this->entity_type,
      $bundle,
    ),
    'type' => MENU_DEFAULT_LOCAL_TASK,
    'weight' => -10,
  ) + $settings_base;
  $weight = 1;
  foreach ($this->plugin['view modes'] as $view_mode => $view_mode_info) {
    $tabs_base = array(
      'access callback' => 'panelizer_has_no_choice_callback',
      'access arguments' => array(
        $this->entity_type,
        $bundle,
        $view_mode,
      ),
      'page arguments' => array(
        $this->entity_type,
        $bundle,
        'default',
        $view_mode,
      ),
      'type' => MENU_LOCAL_TASK,
      'file' => 'includes/admin.inc',
      'weight' => $weight++,
    );
    $items[$root . '/panelizer/' . $view_mode] = array(
      'access callback' => 'panelizer_is_panelized',
      'title' => $view_mode_info['label'],
      'page callback' => 'panelizer_default_list_or_settings_page',
    ) + $tabs_base;
    $index = 0;
    foreach (panelizer_operations() as $path => $operation) {
      $items[$root . '/panelizer/' . $view_mode . '/' . $path] = array(
        'title' => $operation['menu title'],
        'page callback' => $operation['admin callback'],
        // Use the index to keep them in the proper order.
        'weight' => $index - 4,
        'type' => $index === 0 ? MENU_DEFAULT_LOCAL_TASK : MENU_LOCAL_TASK,
      ) + $tabs_base;
      if (isset($operation['file'])) {
        $items[$root . '/panelizer/' . $view_mode . '/' . $path]['file'] = $operation['file'];
      }
      if (isset($operation['file path'])) {
        $items[$root . '/panelizer/' . $view_mode . '/' . $path]['file path'] = $operation['file path'];
      }
      $index++;
    }
    $subtabs_base = array(
      'access callback' => 'panelizer_administer_panelizer_default',
      'access arguments' => array(
        $this->entity_type,
        $bundle,
        $base_count + 2,
        $base_count + 1,
      ),
      'page arguments' => array(
        $this->entity_type,
        $bundle,
        $base_count + 2,
        $base_count + 1,
      ),
      'type' => MENU_LOCAL_TASK,
      'file' => 'includes/admin.inc',
    );
    $items[$root . '/panelizer/' . $view_mode . '/%'] = array(
      'title' => 'Settings',
      'page callback' => 'panelizer_default_settings_page',
      'title callback' => 'panelizer_default_name_title_callback',
      'type' => MENU_CALLBACK,
    ) + $subtabs_base;
    $index = 0;
    foreach (panelizer_operations() as $path => $operation) {
      $items[$root . '/panelizer/' . $view_mode . '/%/' . $path] = array(
        'title' => $operation['menu title'],
        'page callback' => $operation['admin callback'],
        // Use the index to keep them in the proper order.
        'weight' => $index - 4,
      ) + $subtabs_base;
      if (isset($operation['file'])) {
        $items[$root . '/panelizer/' . $view_mode . '/%/' . $path]['file'] = $operation['file'];
      }
      if (isset($operation['file path'])) {
        $items[$root . '/panelizer/' . $view_mode . '/%/' . $path]['file path'] = $operation['file path'];
      }
      $index++;
    }

    // This special tab isn't a normal operation because appears only
    // in the admin menu.
    $items[$root . '/panelizer/' . $view_mode . '/%/access'] = array(
      'title' => 'Access',
      'page callback' => 'panelizer_default_access_page',
      'weight' => -2,
    ) + $subtabs_base;

    // Also make clones of all the export UI menu items. Again there is some
    // duplicated code here because of subtle differences.
    // Load the $plugin information.
    ctools_include('export-ui');
    $plugin = ctools_get_export_ui('panelizer_defaults');
    $ui_items = $plugin['menu']['items'];

    // Change the item to a tab.
    $ui_items['list']['type'] = MENU_LOCAL_TASK;
    $ui_items['list']['weight'] = -6;
    $ui_items['list']['title'] = 'List';

    // Menu local actions are weird.
    if (isset($ui_items['add']['path'])) {
      $ui_items['add']['path'] = 'list/add';
    }
    if (isset($ui_items['import']['path'])) {
      $ui_items['import']['path'] = 'list/import';
    }

    // Edit is being handled elsewhere.
    unset($ui_items['edit callback']);
    unset($ui_items['access']);
    unset($ui_items['list callback']);
    foreach (panelizer_operations() as $path => $operation) {
      $location = isset($operation['ui path']) ? $operation['ui path'] : $path;
      if (isset($ui_items[$location])) {
        unset($ui_items[$location]);
      }
    }

    // Change the callbacks for everything.
    foreach ($ui_items as $key => $item) {

      // originally admin/config/content/panelizer/%panelizer_handler
      $ui_items[$key]['access callback'] = 'panelizer_has_choice_callback_view_mode';
      $ui_items[$key]['access arguments'] = array(
        $this->entity_type,
        $bundle,
        $view_mode,
      );
      $ui_items[$key]['page callback'] = 'panelizer_default_list_or_settings_page';
      $ui_items[$key]['page arguments'][0] = $view_mode;
      array_unshift($ui_items[$key]['page arguments'], '');
      array_unshift($ui_items[$key]['page arguments'], $bundle);
      array_unshift($ui_items[$key]['page arguments'], $this->entity_type);
      $ui_items[$key]['path'] = str_replace('list/', '', $ui_items[$key]['path']);

      // Some of the page arguments attempt to pass the eight argument (item
      // #7, starting at 0) to the callback in order to work on the display
      // object. However, for some entities this will end up being the $op
      // instead of the object name, e.g. 'clone' instead of
      // 'taxonomy_term:tags:default'.
      if (!empty($ui_items[$key]['page arguments'][5]) && is_numeric($bundle)) {
        $ui_items[$key]['page arguments'][5] = $bundle + 3;
      }
    }
    foreach ($ui_items as $item) {

      // Add menu item defaults.
      $item += array(
        'file' => 'export-ui.inc',
        'file path' => drupal_get_path('module', 'ctools') . '/includes',
      );
      $path = !empty($item['path']) ? $root . '/panelizer/' . $view_mode . '/' . $item['path'] : $root . '/panelizer/' . $view_mode;
      unset($item['path']);
      $items[$path] = $item;
    }
  }
}