''); $options['menu'] = array( 'contains' => array( 'type' => array('default' => 'none'), // Do not translate menu and title as menu system will. 'title' => array('default' => '', 'translatable' => FALSE), 'description' => array('default' => '', 'translatable' => FALSE), 'weight' => array('default' => 0), 'name' => array('default' => variable_get('menu_default_node_menu', 'navigation')), 'context' => array('default' => ''), 'context_only_inline' => array('default' => FALSE), ), ); $options['tab_options'] = array( 'contains' => array( 'type' => array('default' => 'none'), // Do not translate menu and title as menu system will. 'title' => array('default' => '', 'translatable' => FALSE), 'description' => array('default' => '', 'translatable' => FALSE), 'weight' => array('default' => 0), 'name' => array('default' => 'navigation'), ), ); return $options; } /** * Add this display's path information to Drupal's menu system. */ function execute_hook_menu($callbacks) { $items = array(); // Replace % with the link to our standard views argument loader // views_arg_load -- which lives in views.module $bits = explode('/', $this->get_option('path')); $page_arguments = array($this->view->name, $this->display->id); $this->view->init_handlers(); $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); $access_plugin = $this->get_plugin('access'); if (!isset($access_plugin)) { $access_plugin = views_get_plugin('access', 'none'); } // Get access callback might return an array of the callback + the dynamic arguments. $access_plugin_callback = $access_plugin->get_access_callback(); if (is_array($access_plugin_callback)) { $access_arguments = array(); // Find the plugin arguments. $access_plugin_method = array_shift($access_plugin_callback); $access_plugin_arguments = array_shift($access_plugin_callback); if (!is_array($access_plugin_arguments)) { $access_plugin_arguments = array(); } $access_arguments[0] = array($access_plugin_method, &$access_plugin_arguments); // Move the plugin arguments to the access arguments array. $i = 1; foreach ($access_plugin_arguments as $key => $value) { if (is_int($value)) { $access_arguments[$i] = $value; $access_plugin_arguments[$key] = $i; $i++; } } } else { $access_arguments = array($access_plugin_callback); } if ($path) { $items[$path] = array( // default views page entry 'page callback' => 'views_page', 'page arguments' => $page_arguments, // Default access check (per display) 'access callback' => 'views_access', 'access arguments' => $access_arguments, // Identify URL embedded arguments and correlate them to a handler 'load arguments' => array($this->view->name, $this->display->id, '%index'), ); $menu = $this->get_option('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'] = !empty($menu['context_only_inline']) ? MENU_CONTEXT_INLINE : (MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE); } // If this is a 'default' tab, check to see if we have to create teh // parent menu item. if ($menu['type'] == 'default tab') { $tab_options = $this->get_option('tab_options'); if (!empty($tab_options['type']) && $tab_options['type'] != 'none') { $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)) { $default_path = implode('/', $bits); $items[$default_path] = array( // default views page entry 'page callback' => 'views_page', 'page arguments' => $page_arguments, // Default access check (per display) 'access callback' => 'views_access', 'access arguments' => $access_arguments, // Identify URL embedded arguments and correlate them to a handler 'load arguments' => array($this->view->name, $this->display->id, '%index'), 'title' => $tab_options['title'], 'description' => $tab_options['description'], 'menu_name' => $tab_options['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; } /** * The display page handler returns a normal view, but it also does * a drupal_set_title for the page, and does a views_set_page_view * on the view. */ function execute() { // Let the world know that this is the page view we're using. views_set_page_view($this->view); // Prior to this being called, the $view should already be set to this // display, and arguments should be set on the view. $this->view->build(); if (!empty($this->view->build_info['fail'])) { return MENU_NOT_FOUND; } if (!empty($this->view->build_info['denied'])) { return MENU_ACCESS_DENIED; } $this->view->get_breadcrumb(TRUE); // And now render the view. $render = $this->view->render(); // First execute the view so it's possible to get tokens for the title. // And the title, which is much easier. drupal_set_title(filter_xss_admin($this->view->get_title()), PASS_THROUGH); return $render; } /** * Provide the summary for page options in the views UI. * * This output is returned as an array. */ function options_summary(&$categories, &$options) { // It is very important to call the parent function here: parent::options_summary($categories, $options); $categories['page'] = array( 'title' => t('Page settings'), 'column' => 'second', 'build' => array( '#weight' => -10, ), ); $path = strip_tags($this->get_option('path')); if (empty($path)) { $path = t('No path is set'); } else { $path = '/' . $path; } $options['path'] = array( 'category' => 'page', 'title' => t('Path'), 'value' => views_ui_truncate($path, 24), ); $menu = $this->get_option('menu'); if (!is_array($menu)) { $menu = array('type' => 'none'); } switch($menu['type']) { case 'none': default: $menu_str = t('No menu'); break; case 'normal': $menu_str = t('Normal: @title', array('@title' => $menu['title'])); break; case 'tab': case 'default tab': $menu_str = t('Tab: @title', array('@title' => $menu['title'])); break; } $options['menu'] = array( 'category' => 'page', 'title' => t('Menu'), 'value' => views_ui_truncate($menu_str, 24), ); // This adds a 'Settings' link to the style_options setting if the style has options. if ($menu['type'] == 'default tab') { $options['menu']['setting'] = t('Parent menu item'); $options['menu']['links']['tab_options'] = t('Change settings for the parent menu'); } } /** * Provide the default form for setting options. */ function options_form(&$form, &$form_state) { // It is very important to call the parent function here: parent::options_form($form, $form_state); switch ($form_state['section']) { case 'path': $form['#title'] .= t('The menu path or URL of this view'); $form['#help_topic'] = 'path'; $form['path'] = array( '#type' => 'textfield', '#description' => t('This view will be displayed by visiting this path on your site. You may use "%" in your URL to represent values that will be used for contextual filters: For example, "node/%/feed".'), '#default_value' => $this->get_option('path'), '#field_prefix' => '' . url(NULL, array('absolute' => TRUE)) . (variable_get('clean_url', 0) ? '' : '?q='), '#field_suffix' => '', '#attributes' => array('dir'=>'ltr'), ); break; case 'menu': $form['#title'] .= t('Menu item entry'); $form['#help_topic'] = 'menu'; $form['menu'] = array( '#prefix' => '