Skip to content
Snippets Groups Projects
Select Git revision
  • 2011-11-14
  • master default
  • issue-752
  • develop
  • issue-677
  • issue-677-original-with-migrate
  • issue-716
  • issue-654
  • issue-732
  • issue-737
  • issue-735
  • issue-707
  • issue-706
  • issue-705
  • issue-703
  • issue-696
  • issue-690
  • issue-675
  • issue-670
  • issue-635
  • issue-404
  • 7.19
  • 2012-04-18
  • 2012-04-03
  • 2012-04-02
  • 2012-03-01
  • 2012-02-07
  • 20120207
  • 2012-01-13
  • 2012-01-12
  • 2011-12-16
  • 2011-12-05
  • 2011-11-17
  • 2011-11-08.2
  • 2011-11-08
  • 2011-11-01
  • 2011-10-27
  • 2011-10-06
  • 2011-10-03
  • 2011-09-19
40 results

toolbar.module

Blame
  • Forked from UNL Information Services / UNL-CMS
    640 commits behind, 1 commit ahead of the upstream repository.
    user avatar
    Tim Steiner authored
    git-svn-id: file:///tmp/wdn_thm_drupal/branches/drupal-7.x/staging@751 20a16fea-79d4-4915-8869-1ea9d5ebf173
    636cbb7e
    History
    toolbar.module 10.40 KiB
    <?php
    
    /**
     * @file
     * Administration toolbar for quick access to top level administration items.
     */
    
    /**
     * Implements hook_help().
     */
    function toolbar_help($path, $arg) {
      switch ($path) {
        case 'admin/help#toolbar':
          $output = '<h3>' . t('About') . '</h3>';
          $output .= '<p>' . t('The Toolbar module displays links to top-level administration menu items and links from other modules at the top of the screen. For more information, see the online handbook entry for <a href="@toolbar">Toolbar module</a>.', array('@toolbar' => 'http://drupal.org/handbook/modules/toolbar/')) . '</p>';
          $output .= '<h3>' . t('Uses') . '</h3>';
          $output .= '<dl>';
          $output .= '<dt>' . t('Displaying administrative links') . '</dt>';
          $output .= '<dd>' . t('The Toolbar module displays a bar containing top-level administrative links across the top of the screen. Below that, the Toolbar module has a <em>drawer</em> section where it displays links provided by other modules, such as the core <a href="@shortcuts-help">Shortcut module</a>. The drawer can be hidden/shown by using the show/hide shortcuts link at the end of the toolbar.', array('@shortcuts-help' => url('admin/help/shortcut'))) . '</dd>';
          $output .= '</dl>';
          return $output;
      }
    }
    
    /**
     * Implements hook_permission().
     */
    function toolbar_permission() {
      return array(
        'access toolbar' => array(
          'title' => t('Use the administration toolbar'),
        ),
      );
    }
    
    /**
     * Implements hook_theme().
     */
    function toolbar_theme($existing, $type, $theme, $path) {
      $items['toolbar'] = array(
        'render element' => 'toolbar',
        'template' => 'toolbar',
        'path' => drupal_get_path('module', 'toolbar'),
      );
      $items['toolbar_toggle'] = array(
        'variables' => array(
          'collapsed' => NULL,
          'attributes' => array(),
        ),
      );
      return $items;
    }
    
    /**
     * Implements hook_menu().
     */
    function toolbar_menu() {
      $items['toolbar/toggle'] = array(
        'title' => 'Toggle drawer visibility',
        'type' => MENU_CALLBACK,
        'page callback' => 'toolbar_toggle_page',
        'access arguments' => array('access toolbar'),
      );
      return $items;
    }
    
    /**
     * Menu callback; toggles the visibility of the toolbar drawer.
     */
    function toolbar_toggle_page() {
      global $base_path;
      // Toggle the value in the cookie.
      setcookie('Drupal.toolbar.collapsed', !_toolbar_is_collapsed(), NULL, $base_path);
      // Redirect the user from where he used the toggle element.
      drupal_goto();
    }
    
    /**
     * Formats an element used to toggle the toolbar drawer's visibility.
     *
     * @param $variables
     *   An associative array containing:
     *   - collapsed: A boolean value representing the toolbar drawer's visibility.
     *   - attributes: An associative array of HTML attributes.
     * @return
     *   An HTML string representing the element for toggling.
     *
     * @ingroup themable
     */
    function theme_toolbar_toggle($variables) {
      if ($variables['collapsed']) {
        $toggle_text = t('Show shortcuts');
      }
      else {
        $toggle_text = t('Hide shortcuts');
        $variables['attributes']['class'][] = 'toggle-active';
      }
      return l($toggle_text, 'toolbar/toggle', array('query' => drupal_get_destination(), 'attributes' => array('title' => $toggle_text) + $variables['attributes']));
    }
    
    /**
     * Determines the current state of the toolbar drawer's visibility.
     *
     * @return
     *   TRUE when drawer is collapsed, FALSE when it is expanded.
     */
    function _toolbar_is_collapsed() {
      // PHP converts dots into underscores in cookie names to avoid problems with
      // its parser, so we use a converted cookie name.
      return isset($_COOKIE['Drupal_toolbar_collapsed']) ? $_COOKIE['Drupal_toolbar_collapsed'] : 0;
    }
    
    /**
     * Implements hook_page_build().
     *
     * Add admin toolbar to the page_top region automatically.
     */
    function toolbar_page_build(&$page) {
      $page['page_top']['toolbar'] = array(
        '#pre_render' => array('toolbar_pre_render'),
        '#access' => user_access('access toolbar'),
        'toolbar_drawer' => array(),
      );
    }
    
    /**
     * Prerender function for the toolbar.
     *
     * Since building the toolbar takes some time, it is done just prior to
     * rendering to ensure that it is built only if it will be displayed.
     */
    function toolbar_pre_render($toolbar) {
      $toolbar = array_merge($toolbar, toolbar_view());
      return $toolbar;
    }
    
    /**
     * Implements hook_preprocess_html().
     *
     * Add some page classes, so global page theming can adjust to the toolbar.
     */
    function toolbar_preprocess_html(&$vars) {
      if (isset($vars['page']['page_top']['toolbar']) && user_access('access toolbar')) {
        $vars['classes_array'][] = 'toolbar';
        if (!_toolbar_is_collapsed()) {
          $vars['classes_array'][] = 'toolbar-drawer';
        }
      }
    }
    
    /**
     * Implements hook_preprocess_toolbar().
     *
     * Adding the 'overlay-displace-top' class to the toolbar pushes the overlay
     * down, so it appears below the toolbar.
     */
    function toolbar_preprocess_toolbar(&$variables) {
      $variables['classes_array'][] = "overlay-displace-top";
    }
    
    /**
     * Implements hook_system_info_alter().
     *
     * Indicate that the 'page_top' region (in which the toolbar will be displayed)
     * is an overlay supplemental region that should be refreshed whenever its
     * content is updated.
     *
     * This information is provided for any module that might need to use it, not
     * just the core Overlay module.
     */
    function toolbar_system_info_alter(&$info, $file, $type) {
      if ($type == 'theme') {
        $info['overlay_supplemental_regions'][] = 'page_top';
      }
    }
    
    /**
     * Build the admin menu as a structured array ready for drupal_render().
     */
    function toolbar_view() {
      global $user;
    
      $module_path = drupal_get_path('module', 'toolbar');
      $build = array(
        '#theme' => 'toolbar',
        '#attached'=> array(
          'js' => array(
            $module_path . '/toolbar.js',
            array(
              'data' => array('tableHeaderOffset' => 'Drupal.toolbar.height'),
              'type' => 'setting'
            ),
          ),
          'css' => array(
            $module_path . '/toolbar.css',
          ),
          'library' => array(array('system', 'jquery.cookie')),
        ),
      );
    
      // Retrieve the admin menu from the database.
      $links = toolbar_menu_navigation_links(toolbar_get_menu_tree());
      $build['toolbar_menu'] = array(
        '#theme' => 'links__toolbar_menu',
        '#links' => $links,
        '#attributes' => array('id' => 'toolbar-menu'),
        '#heading' => array('text' => t('Administrative toolbar'), 'level' => 'h2', 'class' => 'element-invisible'),
      );
    
      // Add logout & user account links or login link.
      if ($user->uid) {
        $links = array(
          'account' => array(
            'title' => t('Hello <strong>@username</strong>', array('@username' => format_username($user))),
            'href' => 'user',
            'html' => TRUE,
            'attributes' => array('title' => t('User account')),
          ),
          'logout' => array(
            'title' => t('Log out'),
            'href' => 'user/logout',
          ),
        );
      }
      else {
         $links = array(
          'login' => array(
            'title' => t('Log in'),
            'href' => 'user',
          ),
        );
      }
      $build['toolbar_user'] = array(
        '#theme' => 'links__toolbar_user',
        '#links' => $links,
        '#attributes' => array('id' => 'toolbar-user'),
      );
    
      // Add a "home" link.
      $link = array(
        'home' => array(
          'title' => '<span class="home-link">Home</span>',
          'href' => '<front>',
          'html' => TRUE,
          'attributes' => array('title' => t('Home')),
        ),
      );
      $build['toolbar_home'] = array(
        '#theme' => 'links',
        '#links' => $link,
        '#attributes' => array('id' => 'toolbar-home'),
      );
    
      // Add an anchor to be able to toggle the visibility of the drawer.
      $build['toolbar_toggle'] = array(
        '#theme' => 'toolbar_toggle',
        '#collapsed' => _toolbar_is_collapsed(),
        '#attributes' => array('class' => array('toggle')),
      );
    
      // Prepare the drawer links CSS classes.
      $toolbar_drawer_classes = array(
        'toolbar-drawer',
        'clearfix',
      );
      if(_toolbar_is_collapsed()) {
        $toolbar_drawer_classes[] = 'collapsed';
      }
      $build['toolbar_drawer_classes'] = implode(' ', $toolbar_drawer_classes);
    
      return $build;
    }
    
    /**
     * Get only the top level items below the 'admin' path.
     */
    function toolbar_get_menu_tree() {
      $tree = array();
      $admin_link = db_query('SELECT * FROM {menu_links} WHERE menu_name = :menu_name AND module = :module AND link_path = :path', array(':menu_name' => 'management', ':module' => 'system', ':path' => 'admin'))->fetchAssoc();
      if ($admin_link) {
        $tree = menu_build_tree('management', array(
          'expanded' => array($admin_link['mlid']),
          'min_depth' => $admin_link['depth'] + 1,
          'max_depth' => $admin_link['depth'] + 1,
        ));
      }
    
      return $tree;
    }
    
    /**
     * Generate a links array from a menu tree array.
     *
     * Based on menu_navigation_links(). Adds path based IDs and icon placeholders
     * to the links.
     */
    function toolbar_menu_navigation_links($tree) {
      $links = array();
      foreach ($tree as $item) {
        if (!$item['link']['hidden'] && $item['link']['access']) {
          // Make sure we have a path specific ID in place, so we can attach icons
          // and behaviors to the items.
          $id = str_replace(array('/', '<', '>'), array('-', '', ''), $item['link']['href']);
    
          $link = $item['link']['localized_options'];
          $link['href'] = $item['link']['href'];
          // Add icon placeholder.
          $link['title'] = '<span class="icon"></span>' . check_plain($item['link']['title']);
          // Add admin link ID.
          $link['attributes'] = array('id' => 'toolbar-link-' . $id);
          if (!empty($item['link']['description'])) {
            $link['title'] .= ' <span class="element-invisible">(' . $item['link']['description'] . ')</span>';
            $link['attributes']['title'] = $item['link']['description'];
          }
          $link['html'] = TRUE;
    
          $class = ' path-' . $id;
          if (toolbar_in_active_trail($item['link']['href'])) {
            $class .= ' active-trail';
          }
          $links['menu-' . $item['link']['mlid'] . $class] = $link;
        }
      }
      return $links;
    }
    
    /**
     * Checks whether an item is in the active trail.
     *
     * Useful when using a menu generated by menu_tree_all_data() which does
     * not set the 'in_active_trail' flag on items.
     *
     * @todo
     *   Look at migrating to a menu system level function.
     */
    function toolbar_in_active_trail($path) {
      $active_paths = &drupal_static(__FUNCTION__);
    
      // Gather active paths.
      if (!isset($active_paths)) {
        $active_paths = array();
        $trail = menu_get_active_trail();
        foreach ($trail as $item) {
          if (!empty($item['href'])) {
            $active_paths[] = $item['href'];
          }
        }
      }
      return in_array($path, $active_paths);
    }