public function PathPluginBase::executeHookMenu

Overrides \Drupal\views\Plugin\views\display\DisplayPluginBase::executeHookMenu().

Overrides DisplayPluginBase::executeHookMenu

File

drupal/core/modules/views/lib/Drupal/views/Plugin/views/display/PathPluginBase.php, line 136
Contains \Drupal\views\Plugin\views\display\PathPluginBase.

Class

PathPluginBase
The base display plugin for path/callbacks. This is used for pages and feeds.

Namespace

Drupal\views\Plugin\views\display

Code

public function executeHookMenu($callbacks) {
  $items = array();

  // Replace % with the link to our standard views argument loader
  // views_arg_load -- which lives in views.module.
  $bits = explode('/', $this
    ->getOption('path'));
  $page_arguments = array(
    $this->view->storage
      ->id(),
    $this->display['id'],
  );
  $this->view
    ->initHandlers();
  $view_arguments = $this->view->argument;

  // Replace % with %views_arg for menu autoloading and add to the
  // page arguments so the argument actually comes through.
  foreach ($bits as $pos => $bit) {
    if ($bit == '%') {
      $argument = array_shift($view_arguments);
      if (!empty($argument->options['specify_validation']) && $argument->options['validate']['type'] != 'none') {
        $bits[$pos] = '%views_arg';
      }
      $page_arguments[] = $pos;
    }
  }
  $path = implode('/', $bits);
  if ($path) {
    $items[$path] = array(
      'route_name' => "view.{$this->view->storage->id()}.{$this->display['id']}",
      // Identify URL embedded arguments and correlate them to a handler.
      'load arguments' => array(
        $this->view->storage
          ->id(),
        $this->display['id'],
        '%index',
      ),
    );
    $menu = $this
      ->getOption('menu');
    if (empty($menu)) {
      $menu = array(
        'type' => 'none',
      );
    }

    // Set the title and description if we have one.
    if ($menu['type'] != 'none') {
      $items[$path]['title'] = $menu['title'];
      $items[$path]['description'] = $menu['description'];
    }
    if (isset($menu['weight'])) {
      $items[$path]['weight'] = intval($menu['weight']);
    }
    switch ($menu['type']) {
      case 'none':
      default:
        $items[$path]['type'] = MENU_CALLBACK;
        break;
      case 'normal':
        $items[$path]['type'] = MENU_NORMAL_ITEM;

        // Insert item into the proper menu.
        $items[$path]['menu_name'] = $menu['name'];
        break;
      case 'tab':
        $items[$path]['type'] = MENU_LOCAL_TASK;
        break;
      case 'default tab':
        $items[$path]['type'] = MENU_DEFAULT_LOCAL_TASK;
        break;
    }

    // Add context for contextual links.
    // @see menu_contextual_links()
    if (!empty($menu['context'])) {
      $items[$path]['context'] = MENU_CONTEXT_INLINE;
    }

    // If this is a 'default' tab, check to see if we have to create the
    // parent menu item.
    if ($this
      ->isDefaultTabPath()) {
      $tab_options = $this
        ->getOption('tab_options');
      $bits = explode('/', $path);

      // Remove the last piece.
      $bit = array_pop($bits);

      // we can't do this if they tried to make the last path bit variable.
      // @todo: We can validate this.
      if ($bit != '%views_arg' && !empty($bits)) {

        // Assign the route name to the parent route, not the default tab.
        $default_route_name = $items[$path]['route_name'];
        unset($items[$path]['route_name']);
        $default_path = implode('/', $bits);
        $items[$default_path] = array(
          // Default views page entry.
          // Identify URL embedded arguments and correlate them to a
          // handler.
          'load arguments' => array(
            $this->view->storage
              ->id(),
            $this->display['id'],
            '%index',
          ),
          'title' => $tab_options['title'],
          'description' => $tab_options['description'],
          'menu_name' => $tab_options['name'],
          'route_name' => $default_route_name,
        );
        switch ($tab_options['type']) {
          default:
          case 'normal':
            $items[$default_path]['type'] = MENU_NORMAL_ITEM;
            break;
          case 'tab':
            $items[$default_path]['type'] = MENU_LOCAL_TASK;
            break;
        }
        if (isset($tab_options['weight'])) {
          $items[$default_path]['weight'] = intval($tab_options['weight']);
        }
      }
    }
  }
  return $items;
}