array( 'title' => t('Access administration theme'), 'description' => t('View pages using the administration theme'), ) ); } /** * Get the variable name for a certain option. * * @param string $module * Module that defines this option. * @param string $params * Name of the option. * * @return string * Variable name for the option. */ function admin_theme_variable_name($module, $option) { return 'admin_theme_' . $module . '_' . $option; } /** * Get all module defined options. * * @return array * All options. */ function admin_theme_list() { $options = array(); foreach (module_list() as $module) { $module_options = module_invoke($module, 'admin_theme_info'); if ($module_options && count($module_options) > 0) { foreach ($module_options as $option => $info) { $info['option'] = $option; $info['module'] = $module; $options[] = $info; } } } return $options; } /** * Implements hook_form_alter(). */ function admin_theme_form_system_themes_admin_form_alter(&$form, $form_state) { // Define a fieldset for the page selection. $form['admin_theme']['pages'] = array( '#type' => 'fieldset', '#title' => t('Pages'), '#collapsible' => TRUE, '#description' => t('Choose which pages should be displayed with the administration theme.'), ); // Add the content editing option to the pages fieldset and change the title. $form['admin_theme']['pages']['node_admin_theme'] = $form['admin_theme']['node_admin_theme']; $form['admin_theme']['pages']['node_admin_theme']['#title'] = t('Content editing'); unset($form['admin_theme']['node_admin_theme']); // Add all options as checkboxes to the admin theme settings form. $list = admin_theme_list(); foreach ($list as $info) { $var = admin_theme_variable_name($info['module'], $info['option']); $form['admin_theme']['pages'][$var] = array( '#type' => 'checkbox', '#title' => array_key_exists('title', $info) ? $info['title'] : NULL, '#description' => array_key_exists('description', $info) ? $info['description'] : NULL, '#default_value' => variable_get($var, '0'), ); } // Allow the user to define a set of pages where the admin theme should, // or should not be applied to. $form['admin_theme']['pages']['custom'] = array( '#type' => 'fieldset', '#title' => t('Custom'), '#description' => t("Enter one page per line as Drupal paths. The '*' character is a wildcard. Example paths are %blog for the blog page and %blog-wildcard for every personal blog. %front is the front page.", array('%blog' => 'blog', '%blog-wildcard' => 'blog/*', '%front' => '')), '#collapsible' => TRUE, '#collapsed' => TRUE, '#weight' => 9, ); $form['admin_theme']['pages']['custom']['admin_theme_path'] = array( '#type' => 'textarea', '#title' => t('Use administration theme on the following pages'), '#default_value' => variable_get('admin_theme_path', ''), ); $form['admin_theme']['pages']['custom']['admin_theme_path_disallow'] = array( '#type' => 'textarea', '#title' => t('Do not use administration theme on the following pages'), '#description' => t('If a path appears here, the administration theme is not shown even if all above options apply.'), '#default_value' => variable_get('admin_theme_path_disallow', ''), ); $form['#submit'][] = 'admin_theme_form_system_themes_form_alter_submit'; $form['admin_theme']['actions']['#weight'] = 10; } /** * Process system_themes_form additions submissions. */ function admin_theme_form_system_themes_form_alter_submit($form, &$form_state) { // Module options. $list = admin_theme_list(); foreach ($list as $info) { $var = admin_theme_variable_name($info['module'], $info['option']); if (isset($form_state['values'][$var])) { variable_set($var, $form_state['values'][$var]); } } // Custom page options. variable_set('admin_theme_path', $form_state['values']['admin_theme_path']); variable_set('admin_theme_path_disallow', $form_state['values']['admin_theme_path_disallow']); } /** * Implements hook_custom_theme(). */ function admin_theme_custom_theme() { $admin_theme_disallow = FALSE; $admin_theme = FALSE; // Check if some paths are disallow to get the theme. if (trim(variable_get('admin_theme_path_disallow', '')) != '') { // Pages that are defined by their normal path. $admin_theme_disallow = drupal_match_path($_GET['q'], variable_get('admin_theme_path_disallow', '')); // Pages that are defined with their alias. $alias = drupal_get_path_alias($_GET['q']); if ($alias != $_GET['q']) { $admin_theme_disallow = $admin_theme || drupal_match_path($alias, variable_get('admin_theme_path_disallow', '')); } } // We should not show the admin theme if the user has no access, // or the path is in the disallow list. if (!user_access('access admin theme') || $admin_theme_disallow) { return; } // Check if an option is enabled and if it results to TRUE. $list = admin_theme_list(); foreach ($list as $info) { $var = admin_theme_variable_name($info['module'], $info['option']); if ((bool)variable_get($var, '0') && module_invoke($info['module'], 'admin_theme', 'check', $info['option'])) { $admin_theme = TRUE; } } // Some custom defined pages should get admin theme. if (trim(variable_get('admin_theme_path', '')) != '') { // Pages that are defined by their normal path. $admin_theme = $admin_theme || drupal_match_path($_GET['q'], variable_get('admin_theme_path', '')); // Pages that are defined with their alias. $alias = drupal_get_path_alias($_GET['q']); if ($alias != $_GET['q']) { $admin_theme = $admin_theme || drupal_match_path($alias, variable_get('admin_theme_path', '')); } } // Use the admin theme for the current request (if global admin theme setting is checked). if ($admin_theme) { return variable_get('admin_theme'); } return; } /** * Implements hook_admin_theme_info(). */ function admin_theme_admin_theme_info() { $options = array(); $options['batch'] = array( 'title' => t('Batch processing'), 'description' => t('Use the administration theme when executing batch operations.'), ); if (module_exists('img_assist')) { $options['img_assist'] = array( 'title' => t('Image assist'), 'description' => t('Use the administration theme when viewing the Image assist popup window.'), ); } if (module_exists('coder')) { $options['coder'] = array( 'title' => t('Code reviews'), 'description' => t('Use the administration theme when viewing Coder code reviews.'), ); } if (module_exists('devel')) { $options['devel'] = array( 'title' => t('Devel pages.'), 'description' => t('Use the administration theme when viewing pages of the devel module (hook_elements(), Dev render, Dev load, Session viewer, Theme registery, Variable editor, ...).'), ); } if (module_exists('service_attachments')) { $options['service_attachments'] = array( 'title' => t('Service attachments form on nodes.'), 'description' => t('Use the administration theme when viewing service attachments on nodes.'), ); } if (module_exists('webform')) { $options['webform_results'] = array( 'title' => t('Webform submissions.'), 'description' => t('Use the administration theme when viewing webform submissions.'), ); } if (module_exists('statistics')) { $options['statistics'] = array( 'title' => t('Pages defined by the statistics module.'), 'description' => t('Use the administration theme when viewing pages of the statistics module.'), ); } return $options; } /** * Implements hook_admin_theme_check(). */ function admin_theme_admin_theme_check($option = NULL) { switch ($option) { case 'img_assist': return arg(0) == 'img_assist'; case 'coder': return arg(0) == 'coder'; case 'devel': return arg(0) == 'devel' || (arg(0) == 'node' && arg(2) == 'devel'); case 'batch': return arg(0) == 'batch'; case 'service_attachments': return arg(0) == 'node' && arg(2) == 'service_attachments'; case 'webform_results': return arg(0) == 'node' && arg(2) == 'webform-results'; case 'statistics': return (arg(0) == 'node' || arg(0) == 'user') && arg(2) == 'track'; } }