'Tabs', 'description' => 'Configuration for tabs', 'page callback' => 'drupal_get_form', 'page arguments' => array('tabs_admin_settings'), 'access arguments' => array('administer site configuration'), 'file' => 'tabs.admin.inc', ); return $items; } /** * Implementation of hook_theme() */ function tabs_theme() { return array( 'tabset' => array( 'arguments' => array('element' => NULL), 'file' => 'tabs.theme.inc', ), 'tabpage' => array( 'arguments' => array('element' => NULL), 'file' => 'tabs.theme.inc', ), ); } /** * Process a tabset prior to rendering. */ function tabs_pre_render_tabset($element) { tabs_load(); // Assign a name, reading from the first parent (the key of this tabset element). $name = $element['#tabset_name'] = form_clean_id(isset($element['#tabset_name']) && $element['#tabset_name'] ? $element['#tabset_name'] : (isset($element['#parents']) && count($element['#parents']) ? $element['#parents'][0] : 'tabset')); // Add class. if (!isset($element['#attributes'])) { $element['#attributes'] = array(); } $element['#attributes']['class'] = (isset($element['#attributes']['class']) ? $element['#attributes']['class'] .' ' : '') .'drupal-tabs js-hide'. (isset($element['#tabs_navigation']) && $element['#tabs_navigation'] ? ' tabs-navigation' : ''); $children = element_children($element); $num_items = count($children); foreach ($children as $index => $key) { if (isset($element[$key]['#type']) && $element[$key]['#type'] == 'tabpage') { if (!isset($element[$key]['#content'])) { $element[$key]['#content'] = ''; } $is_ajax = isset($element[$key]['#ajax_url']) && $element[$key]['#ajax_url']; // Unset any empty tabs. $content = trim($element[$key]['#content']); if (!$is_ajax && empty($content) && !element_children($element[$key])) { unset($element[$key]); continue; } // Display any #description before the #content. $element[$key]['#content'] = (isset($element[$key]['#description']) && $element[$key]['#description'] ? '
'. $element[$key]['#description'] .'
' : '') . $element[$key]['#content']; $element[$key]['#tabset_name'] = $element['#tabset_name']; $element[$key]['#title'] = check_plain($element[$key]['#title']); // If not explicitly set, construct a tab name from the title. if (empty($element[$key]['#tab_name'])) { $element[$key]['#tab_name'] = form_clean_id('tabs-' . strtolower($element[$key]['#title'])); } if (!isset($element[$key]['#attributes'])) { $element[$key]['#attributes'] = array(); } // If we are loading via AJAX we need to add a title attribute and set the url to the AJAX path. if ($is_ajax) { $element[$key]['#attributes']['#title'] = $element[$key]['#tab_name']; $element[$key]['#url'] = $element[$key]['#ajax_url']; } // Otherwise we use a hash. else { $element[$key]['#url'] = '#' . $element[$key]['#tab_name']; } $element[$key]['#attributes']['class'] = (isset($element[$key]['#attributes']['class']) ? $element[$key]['#attributes']['class'] .' ' : '') . $element[$key]['#tab_name']; // Add the active class if this tab is selected. if (isset($element[$key]['#selected']) && $element[$key]['#selected']) { $element[$key]['#attributes']['class'] .= ' active'; } // Add a class to the first and last tabs. if ($index == 0) { $element[$key]['#attributes']['class'] .= ' first'; } if ($index + 1 == $num_items) { $element[$key]['#attributes']['class'] .= ' last'; } $element[$key]['#index'] = $index; } } return $element; } /** * Add required js and css files. */ function tabs_load() { static $loaded = FALSE; if (!$loaded) { $tabs_speed = variable_get('tabs_speed', 'slow'); if (is_numeric($tabs_speed)) { $tabs_speed = (int) $tabs_speed; } $path = drupal_get_path('module', 'tabs'); // TODO: make this a dependency in D7. if (module_exists('jquery_ui')) { jquery_ui_add(array('ui.tabs')); } else { drupal_add_js($path . '/ui.core.js'); drupal_add_js($path . '/ui.tabs.js'); } drupal_add_js($path . '/tabs.js'); drupal_add_js(array('tabs' => array('slide' => (bool) variable_get('tabs_slide', 0), 'fade' => (bool) variable_get('tabs_fade', 0), 'speed' => $tabs_speed, 'auto_height' => (bool) variable_get('tabs_auto_height', 0), 'next_text' => variable_get('tabs_nav_next', t('next')), 'previous_text' => variable_get('tabs_nav_prev', t('previous')))), 'setting'); drupal_add_css($path . '/drupal-tabs.css'); $loaded = TRUE; } } /** * Render a tabset 'manually' (when not rendering as part of a regular form render). */ function tabs_render($form) { $form_state = array(); return drupal_render(form_builder('tabset', $form, $form_state)); } /** * Implementation of hook_elements(). */ function tabs_elements() { $type = array(); $type['tabset'] = array('#tabs_navigation' => variable_get('tabs_navigation', 0) ? TRUE : FALSE, '#pre_render' => array('tabs_pre_render_tabset')); $type['tabpage'] = array('#content' => ''); return $type; }