array( 'title' => t('Access administration toolbar'), 'description' => t('Access the persistent administration toolbar displayed on all pages.'), ), ); } /** * Implement hook_theme(). */ function toolbar_theme($existing, $type, $theme, $path) { $items['toolbar'] = array( 'render element' => 'toolbar', 'template' => 'toolbar', 'path' => drupal_get_path('module', 'toolbar'), ); return $items; } /** * Implement 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' => isset($page['toolbar_drawer']) ? $page['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_build()); return $toolbar; } /** * Implement hook_preprocess_html(). * * Add some page classes, so global page theming can adjust to the toolbar. */ function toolbar_preprocess_html(&$vars) { if (user_access('access toolbar')) { $vars['classes_array'][] = 'toolbar toolbar-drawer'; } } /** * Build the admin menu as a structured array ready for drupal_render(). */ function toolbar_build() { global $user; $module_path = drupal_get_path('module', 'toolbar'); $build = array( '#theme' => 'toolbar', '#attached'=> array( 'js' => array( $module_path . '/toolbar.js', array('data' => 'misc/jquery.cookie.js', 'weight' => JS_LIBRARY + 2), array( 'data' => array('tableHeaderOffset' => 'Drupal.admin.toolbar.height'), 'type' => 'setting' ), ), 'css' => array( $module_path . '/toolbar.css', ), ), ); // Retrieve the admin menu from the database. $links = toolbar_menu_navigation_links(toolbar_get_menu_tree()); $build['toolbar_menu'] = array( '#theme' => 'links', '#links' => $links, '#attributes' => array('id' => 'toolbar-menu'), ); // Add logout & user account links or login link if ($user->uid) { $links = array( 'account' => array( 'title' => t('Hello @username', array('@username' => format_username($user))), 'href' => 'user', 'html' => TRUE, ), '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', '#links' => $links, '#attributes' => array('id' => 'toolbar-user'), ); 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 = 'management' AND module = 'system' AND link_path = 'admin'")->fetchAssoc(); if ($admin_link) { // @todo Use a function like book_menu_subtree_data(). $tree = menu_tree_all_data('management', $admin_link, $admin_link['depth'] + 1); // The tree will be a sub-tree with the admin link as a single root item. // @todo It is wrong to assume it's the last. $admin_link = array_pop($tree); $tree = $admin_link['below'] ? $admin_link['below'] : array(); } return $tree; } /** * Generate a links array from a menu tree array. * * Based on menu_navigation_links(). Adds in path based IDs, icon placeholders * and overlay classes for the links. */ function toolbar_menu_navigation_links($tree) { $links = array(); foreach ($tree as $item) { if (!$item['link']['hidden'] && $item['link']['access']) { $class = ''; // 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'] = '' . $item['link']['title']; // Add admin link ID and to-overlay class for the overlay. $link['attributes'] = array('id' => 'toolbar-link-' . $id, 'class' => array('to-overlay')); $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); }