uid != 1) { // get sorted roles $role_menu = _rootcandy_init_role_menu(); if ($role_menu) { $rootcandy_navigation = theme_get_setting('rootcandy_navigation_source_'. $role_menu); } } else { $rootcandy_navigation = theme_get_setting('rootcandy_navigation_source_admin'); if (!isset($rootcandy_navigation)) { $rootcandy_navigation = '_rootcandy_default_navigation'; } } $menu_tree = array(); if (!$rootcandy_navigation) { if (!$user->uid) { $menu_tree[] = array('href' => 'user/login', 'title' => t('User login')); } } elseif ($rootcandy_navigation == '_rootcandy_default_navigation') { // build default menu $menu_tree[] = array('href' => 'admin', 'title' => t('Dashboard')); $menu_tree[] = array('href' => 'admin/content', 'title' => t('Content')); if (variable_get('node_admin_theme', '0')) { $menu_tree[] = array('href' => 'node/add', 'title' => t('Create content')); } $menu_tree[] = array('href' => 'admin/build', 'title' => t('Building')); $menu_tree[] = array('href' => 'admin/settings', 'title' => t('Configuration')); $menu_tree[] = array('href' => 'admin/user', 'title' => t('Users')); $menu_tree[] = array('href' => 'admin/reports', 'title' => t('Reports')); if (module_exists('help')) { $menu_tree[] = array('href' => 'admin/help', 'title' => t('Help')); } } else { $menu_tree = menu_navigation_links($rootcandy_navigation); } if ($menu_tree) { $size = theme_get_setting('rootcandy_navigation_icons_size'); $icons_disabled = theme_get_setting('rootcandy_navigation_icons'); $list_class = 'i'. $size; $custom_icons = rootcandy_custom_icons(); if (!isset($custom_icons)) { $custom_icons = ''; } $match = _rootcandy_besturlmatch($_GET['q'], $menu_tree); $items = array(); foreach ($menu_tree as $key => $item) { $router_item = menu_get_item($item['href']); if (!$router_item['access']) { continue; } $id = ''; $icon = ''; $class= ''; // icons if (!$icons_disabled) { $size = theme_get_setting('rootcandy_navigation_icons_size'); if (!isset($size)) $size = 24; $arg = explode("/", $item['href']); $icon = _rootcandy_icon($arg, $size, 'admin', $custom_icons); if ($icon) $icon = $icon .'
'; } if ($key == $match) { $id = 'current'; if (!$icons_disabled && $size) { $id = 'current-'. $size; } } // add a class to li $class = ""; if (is_array($arg)) { $class = implode($arg, '-'); } $item['data'] = l($icon . $item['title'], $item['href'], array('html' => TRUE)); if (!empty($id)) $item['id'] = $id; if (!empty($class)) $item['class'] = $class; if (!empty($item['attributes'])) { unset($item['attributes']); } $items[] = $item; } $level = 1; if ($rootcandy_navigation == '_rootcandy_default_navigation') { $rootcandy_navigation = 'navigation'; $level = 2; } return array( 'navigation' => theme('admin_navigation', $items, $list_class), 'menu' => $rootcandy_navigation, 'level' => $level, ); } } function rootcandy_admin_navigation($items, $class) { return theme('item_list', $items); } function _rootcandy_besturlmatch($needle, $menuitems) { $needle = drupal_get_path_alias($needle); $lastmatch = NULL; $lastmatchlen = 0; $urlparts = explode('/', $needle); $partcount = count($urlparts); foreach ($menuitems as $key => $menuitem) { $href = $menuitem['href']; $menuurlparts = explode('/', $href); $matches = _rootcandy_countmatches($urlparts, $menuurlparts); if (($matches > $lastmatchlen) || (($matches == $lastmatchlen) && (($lastmatch && drupal_strlen($menuitems[$lastmatch]['href'])) > drupal_strlen($href)) )) { $lastmatchlen = $matches; $lastmatch = $key; } } return $lastmatch; } /** * Override or insert PHPTemplate variables into the templates. */ function rootcandy_preprocess_page(&$vars) { // get secondary links $vars['tabs2'] = menu_secondary_local_tasks(); // color.module integration if (module_exists('color')) { _color_page_alter($vars); } // notify users that they can change settings in theme settings $admin_theme = variable_get('admin_theme', 'garland'); if (arg(0) == 'admin' AND arg(1) == 'settings' AND arg(2) == 'admin' AND ($admin_theme == 'rootcandy' OR $admin_theme == 'rootcandy_fixed' OR $admin_theme == 'rootcandy_dark')) { $message = t('Thank you for using RootCandy.
Did you know, that Root Candy has advanced settings (Theme-specific settings fieldset)? You can change these settings at theme configuration page.', array('@configure-page' => url('admin/build/themes/settings/'. $admin_theme))); $vars['messages'] .= '
'. $message .'
'; // display a warning message if the theme has not been enabled global $theme_info; if (!$theme_info->status) { $warning_message = t('RootCandy theme has not been enabled. You won\'t be able to see theme updates on update page! Please enable the theme on themes page.', array('@themes-page' => url('admin/build/themes'))); $vars['messages'] .= '
'. $warning_message .'
'; } } if (arg(0) == 'admin' || ((arg(0) == 'node' AND is_numeric(arg(1)) AND arg(2) == 'edit') || (arg(0) == 'node' AND arg(1) == 'add'))) { $vars['go_home'] = ''. t('Go Back to Homepage') .''; } // get theme settings $vars['hide_header'] = theme_get_setting('rootcandy_header_display'); $vars['hide_panel'] = theme_get_setting('rootcandy_hide_panel'); // append legal notice if (!theme_get_setting('rootcandy_hide_author')) { $vars['closure'] .= ''; } $vars['hide_content'] = ''; // check whether help is disabled if (theme_get_setting('rootcandy_help_display')) { unset($vars['help']); } // dashboard if (arg(0) == 'admin' AND !arg(1)) { if (!theme_get_setting('rootcandy_dashboard_display')) { $vars['dashboard'] = 1; // display help and messages in regions switch (theme_get_setting('rootcandy_dashboard_help')) { case 'left': $vars['dashboard_left'] = $vars['help'] . $vars['dashboard_left']; unset($vars['help']); break; case 'right': $vars['dashboard_right'] = $vars['help'] . $vars['dashboard_right']; unset($vars['help']); break; } switch (theme_get_setting('rootcandy_dashboard_messages')) { case 'left': $vars['dashboard_left'] = $vars['messages'] . $vars['dashboard_left']; unset($vars['messages']); break; case 'right': $vars['dashboard_right'] = $vars['messages'] . $vars['dashboard_right']; unset($vars['messages']); break; } } if (theme_get_setting('rootcandy_dashboard_content_display')) { $vars['hide_content'] = theme_get_setting('rootcandy_dashboard_content_display'); } } $vars['panel_navigation'] = ''. t('Open Panel') .''; $vars['panel_navigation'] .= ''; $rootcandy_nav = _rootcandy_admin_navigation(); $vars['rootcandy_navigation'] = $rootcandy_nav['navigation']; // get admin links into the region if (arg(0) == 'admin' AND arg(2)) { $menu = menu_navigation_links($rootcandy_nav['menu'], $rootcandy_nav['level']); $menu_links = _rootcandy_links($menu, array('id' => 'rootcandy-menu')); if ($vars['language']->direction) { $vars['admin_right'] = $menu_links . $vars['admin_right']; } else { $vars['admin_left'] = $menu_links . $vars['admin_left']; } } $vars['body_class'] = rootcandy_body_class($vars['admin_left'], $vars['admin_right']); $icons_disabled = theme_get_setting('rootcandy_navigation_icons'); $rootcandy_navigation_class = array(); if (!$icons_disabled) { $rootcandy_navigation_class[] = 'i'.theme_get_setting('rootcandy_navigation_icons_size'); } if (!$vars['hide_header']) { $rootcandy_navigation_class[] = 'header-on'; } $vars['rootcandy_navigation_class'] = ''; if ($rootcandy_navigation_class) { $vars['rootcandy_navigation_class'] .= ' '. implode(' ', $rootcandy_navigation_class); } global $user; if ($user->uid) { $links[] = ''. $user->name .''; $links[] = ''. t('Logout') .''; $links = implode(' | ', $links); $vars['rootcandy_user_links'] = $links; } } function rootcandy_admin_block_content($content) { if (!$content) { return ''; } if (system_admin_compact_mode()) { drupal_add_js(drupal_get_path('theme', 'rootcandy') .'/compact-icon.js'); drupal_add_css(drupal_get_path('theme', 'rootcandy') .'/compact-icon.css'); $counter = 1; $output = ''; } else { $output = '
'; foreach ($content as $item) { $output .= '
'. l($item['title'], $item['href'], $item['localized_options']) .'
'; $output .= '
'. $item['description'] .'
'; } $output .= '
'; } return $output; } function _rootcandy_menu_icon($href) { $filename = drupal_get_path('theme', 'rootcandy') .'/icons/i32/admin/'. str_replace('/', '-', drupal_strtolower($href)) .'.png'; return theme('image', $filename); } /** * Returns the rendered local tasks. The default implementation renders * them as tabs. Overridden to split the secondary tasks. * * @ingroup themeable */ function rootcandy_menu_local_tasks() { return menu_primary_local_tasks(); } function _rootcandy_icon($name, $size = '16', $subdir = '', $icons = '') { $url = implode("/", $name); $alias = drupal_get_path_alias($url); $name = implode("-", $name); $path = path_to_theme(); if ($subdir) { $subdir = $subdir .'/'; } if (isset($icons[$url])) { $icon = $icons[$url]; } else if (isset($icons[$alias])) { $icon = $icons[$alias]; } else { $icon = $path .'/icons/i'. $size .'/'. $subdir . $name .'.png'; } $output = theme('image', $icon); if (!$output) { $icon = $path .'/icons/i'. $size .'/misc/unknown.png'; $output = theme('image', $icon); } return $output; } function rootcandy_custom_icons() { $custom_icons = theme_get_setting('rootcandy_navigation_custom_icons'); if (isset($custom_icons)) { $list = explode("\n", $custom_icons); $list = array_map('trim', $list); $list = array_filter($list, 'strlen'); foreach ($list as $opt) { // Sanitize the user input with a permissive filter. $opt = rootcandy_filter_xss($opt); if (strpos($opt, '|') !== FALSE) { list($key, $value) = explode('|', $opt); $icons[$key] = $value ? $value : $key; } else { $icons[$opt] = $opt; } } } if (isset($icons)) { return $icons; } } function rootcandy_filter_xss($string) { return filter_xss($string); } /** * Read the theme settings' default values from the .info and save them into the database. * * @param $theme * The actual name of theme that is being checked. */ function rootcandy_settings_init($theme) { $themes = list_themes(); // Get the default values from the .info file. $defaults = (is_array($themes[$theme]->info['settings'])) ? $themes[$theme]->info['settings'] : array(); // Get the theme settings saved in the database. $settings = theme_get_settings($theme); // Don't save the toggle_node_info_ variables. if (module_exists('node')) { foreach (node_get_types() as $type => $name) { unset($settings['toggle_node_info_'. $type]); } } // Save default theme settings. variable_set( str_replace('/', '_', 'theme_'. $theme .'_settings'), array_merge($defaults, $settings) ); // Force refresh of Drupal internals. theme_get_setting('', TRUE); } /* * In addition to initializing the theme settings during HOOK_theme(), init them * when viewing/resetting the admin/build/themes/settings/THEME forms. */ if (arg(0) == 'admin' && arg(2) == 'themes' && arg(4)) { global $theme_key; rootcandy_settings_init($theme_key); } function rootcandy_get_page_classes($path = NULL) { if (!isset($path)) $path = $_GET['q']; if ($path) { $path = ' '. rootcandy_id_safe($path); } return $path; } /** * Converts a string to a suitable html ID attribute. Borrowed from Zen theme * * http://www.w3.org/TR/html4/struct/global.html#h-7.5.2 specifies what makes a * valid ID attribute in HTML. This function: * * - Ensure an ID starts with an alpha character by optionally adding an 'id'. * - Replaces any character except alphanumeric characters with dashes. * - Converts entire string to lowercase. * * @param $string * The string * @return * The converted string */ function rootcandy_id_safe($string) { // Replace with dashes anything that isn't A-Z, numbers, dashes, or underscores. return check_plain(strtolower(preg_replace('/[^a-zA-Z0-9-]+/', '-', $string))); } function rootcandy_breadcrumb($breadcrumb) { if (!empty($breadcrumb)) { /* * Modern browsers (Firefox 1.5 and above, Internet Explorer 5.0 and above, * Safari not checked) would automatically change the double-arrows (») to * the other direction once it detects a right-to-left page. So no need to * reverse the array, and no need to use reversed-direction arrows. */ return ''; } } function _rootcandy_links($links, $attributes = array('class' => 'links')) { $output = ''; if (count($links) > 0) { $output = ''; $num_links = count($links); $i = 1; foreach ($links as $key => $link) { $class = $key; // Add first, last and active classes to the list of links to help out themers. if ($i == 1) { $class .= ' first'; } if ($i == $num_links) { $class .= ' last'; } $check_path = $_GET['q']; $check_path = explode("/", $check_path); $q_path = $check_path[0] .'/'. $check_path[1] .'/'. $check_path[2]; if (isset($link['href']) && ($link['href'] == $q_path || ($link['href'] == '' && drupal_is_front_page()))) { $class .= ' active'; } $output .= ' $class)) .'>'; if (isset($link['href'])) { // Pass in $link as $options, they share the same keys. $output .= l($link['title'], $link['href'], $link); } else if (!empty($link['title'])) { // Some links are actually not links, but we wrap these in for adding title and class attributes if (empty($link['html'])) { $link['title'] = check_plain($link['title']); } $span_attributes = ''; if (isset($link['attributes'])) { $span_attributes = drupal_attributes($link['attributes']); } $output .= ''. $link['title'] .''; } $i++; $output .= "\n"; } $output .= ''; } return $output; } function rootcandy_menu_item_link($link) { if ($link['href'] == 'admin') { $link['title'] = t('Dashboard'); } return theme_menu_item_link($link); } function _rootcandy_countmatches($arrayone, $arraytwo) { $matches = 0; foreach ($arraytwo as $i => $part) { if (!isset($arrayone[$i])) break; if ($arrayone[$i] == $part) $matches = $i+1; } return $matches; } function rootcandy_system_settings_form($form) { $themes = list_themes(); $enabled_theme = arg(4); if ($form['#id'] == 'system-theme-settings' AND ($enabled_theme == 'rootcandy' || $themes[$enabled_theme]->base_theme == 'rootcandy')) { foreach ($form['theme_specific']['rows'] as $rid => $row) { //we are only interested in numeric keys if (intval($rid)) { $this_row = $row['data']['#value']; //Add the weight field to the row $weight = $form['theme_specific']['rows'][$rid]['role-weight-'. $rid]['#value']; $this_row[] = drupal_render($form['theme_specific']['navigation']['nav-by-role']['rootcandy_navigation_source_'. $rid]); $this_row[] = drupal_render($form['theme_specific']['rows'][$rid]['role-weight-'. $rid]); //Add the row to the array of rows $table_rows[$weight] = array('data' => $this_row, 'class' => 'draggable'); } } ksort($table_rows); $header = array( "Role", "Navigation menu", "Order" ); $form['theme_specific']['navigation']['role-weights']['content']['#value'] = theme('table', $header, $table_rows, array('id' => 'rootcandy-settings-table')); $output = drupal_render($form); drupal_add_tabledrag('rootcandy-settings-table', 'order', 'sibling', 'weight'); } else { $output = drupal_render($form); } return $output; } function rootcandy_theme() { return array( 'system_settings_form' => array( 'arguments' => array('form' => NULL), ), 'admin_navigation' => array( 'arguments' => array('items' => NULL, 'class' => NULL), ), ); } function _rootcandy_init_role_menu() { global $theme_key; global $user; $i = 100; $settings = theme_get_settings($theme_key); $menu = array(); $roles = user_roles(FALSE); foreach ($user->roles as $rid => $role) { if (!$weight = $settings['role-weight-'. $rid]) { $settings['role-weight-'. $rid] = $i++; } $menu[$settings['role-weight-'. $rid]] = $rid; } ksort($menu); return $menu[key($menu)]; }