danielebarchiesi@0: status report for more information.', array('@status' => url('admin/reports/status'))), 'error'); danielebarchiesi@0: } danielebarchiesi@0: $blocks = array(); danielebarchiesi@0: if ($admin = db_query("SELECT menu_name, mlid FROM {menu_links} WHERE link_path = 'admin/config' AND module = 'system'")->fetchAssoc()) { danielebarchiesi@0: $result = db_query(" danielebarchiesi@0: SELECT m.*, ml.* danielebarchiesi@0: FROM {menu_links} ml danielebarchiesi@0: INNER JOIN {menu_router} m ON ml.router_path = m.path danielebarchiesi@0: WHERE ml.link_path <> 'admin/help' AND menu_name = :menu_name AND ml.plid = :mlid AND hidden = 0", $admin, array('fetch' => PDO::FETCH_ASSOC)); danielebarchiesi@0: foreach ($result as $item) { danielebarchiesi@0: _menu_link_translate($item); danielebarchiesi@0: if (!$item['access']) { danielebarchiesi@0: continue; danielebarchiesi@0: } danielebarchiesi@0: // The link description, either derived from 'description' in hook_menu() danielebarchiesi@0: // or customized via menu module is used as title attribute. danielebarchiesi@0: if (!empty($item['localized_options']['attributes']['title'])) { danielebarchiesi@0: $item['description'] = $item['localized_options']['attributes']['title']; danielebarchiesi@0: unset($item['localized_options']['attributes']['title']); danielebarchiesi@0: } danielebarchiesi@0: $block = $item; danielebarchiesi@0: $block['content'] = ''; danielebarchiesi@0: $block['content'] .= theme('admin_block_content', array('content' => system_admin_menu_block($item))); danielebarchiesi@0: if (!empty($block['content'])) { danielebarchiesi@0: $block['show'] = TRUE; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Prepare for sorting as in function _menu_tree_check_access(). danielebarchiesi@0: // The weight is offset so it is always positive, with a uniform 5-digits. danielebarchiesi@0: $blocks[(50000 + $item['weight']) . ' ' . $item['title'] . ' ' . $item['mlid']] = $block; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: if ($blocks) { danielebarchiesi@0: ksort($blocks); danielebarchiesi@0: return theme('admin_page', array('blocks' => $blocks)); danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: return t('You do not have any administrative items.'); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Provide a single block from the administration menu as a page. danielebarchiesi@0: * danielebarchiesi@0: * This function is often a destination for these blocks. danielebarchiesi@0: * For example, 'admin/structure/types' needs to have a destination to be valid danielebarchiesi@0: * in the Drupal menu system, but too much information there might be danielebarchiesi@0: * hidden, so we supply the contents of the block. danielebarchiesi@0: * danielebarchiesi@0: * @return danielebarchiesi@0: * The output HTML. danielebarchiesi@0: */ danielebarchiesi@0: function system_admin_menu_block_page() { danielebarchiesi@0: $item = menu_get_item(); danielebarchiesi@0: if ($content = system_admin_menu_block($item)) { danielebarchiesi@0: $output = theme('admin_block_content', array('content' => $content)); danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: $output = t('You do not have any administrative items.'); danielebarchiesi@0: } danielebarchiesi@0: return $output; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Menu callback; prints a listing of admin tasks, organized by module. danielebarchiesi@0: */ danielebarchiesi@0: function system_admin_index() { danielebarchiesi@0: $module_info = system_get_info('module'); danielebarchiesi@0: foreach ($module_info as $module => $info) { danielebarchiesi@0: $module_info[$module] = new stdClass(); danielebarchiesi@0: $module_info[$module]->info = $info; danielebarchiesi@0: } danielebarchiesi@0: uasort($module_info, 'system_sort_modules_by_info_name'); danielebarchiesi@0: $menu_items = array(); danielebarchiesi@0: danielebarchiesi@0: foreach ($module_info as $module => $info) { danielebarchiesi@0: // Only display a section if there are any available tasks. danielebarchiesi@0: if ($admin_tasks = system_get_module_admin_tasks($module, $info->info)) { danielebarchiesi@0: // Sort links by title. danielebarchiesi@0: uasort($admin_tasks, 'drupal_sort_title'); danielebarchiesi@0: // Move 'Configure permissions' links to the bottom of each section. danielebarchiesi@0: $permission_key = "admin/people/permissions#module-$module"; danielebarchiesi@0: if (isset($admin_tasks[$permission_key])) { danielebarchiesi@0: $permission_task = $admin_tasks[$permission_key]; danielebarchiesi@0: unset($admin_tasks[$permission_key]); danielebarchiesi@0: $admin_tasks[$permission_key] = $permission_task; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $menu_items[$info->info['name']] = array($info->info['description'], $admin_tasks); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: return theme('system_admin_index', array('menu_items' => $menu_items)); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Displays the configuration overview page. danielebarchiesi@0: * danielebarchiesi@0: * This menu callback implementation is a legacy function that used to display danielebarchiesi@0: * the configuration overview page at admin/config. It is currently unused and danielebarchiesi@0: * will be removed in Drupal 8. The page at admin/config is now generated by danielebarchiesi@0: * system_admin_config_page(). danielebarchiesi@0: * danielebarchiesi@0: * @deprecated danielebarchiesi@0: * @see system_admin_config_page() danielebarchiesi@0: */ danielebarchiesi@0: function system_settings_overview() { danielebarchiesi@0: // Check database setup if necessary danielebarchiesi@0: if (function_exists('db_check_setup') && empty($_POST)) { danielebarchiesi@0: db_check_setup(); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $item = menu_get_item('admin/config'); danielebarchiesi@0: $content = system_admin_menu_block($item); danielebarchiesi@0: danielebarchiesi@0: $output = theme('admin_block_content', array('content' => $content)); danielebarchiesi@0: danielebarchiesi@0: return $output; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Menu callback; displays a listing of all themes. danielebarchiesi@0: */ danielebarchiesi@0: function system_themes_page() { danielebarchiesi@0: // Get current list of themes. danielebarchiesi@0: $themes = system_rebuild_theme_data(); danielebarchiesi@0: uasort($themes, 'system_sort_modules_by_info_name'); danielebarchiesi@0: danielebarchiesi@0: $theme_default = variable_get('theme_default', 'bartik'); danielebarchiesi@0: $theme_groups = array(); danielebarchiesi@0: danielebarchiesi@0: foreach ($themes as &$theme) { danielebarchiesi@0: if (!empty($theme->info['hidden'])) { danielebarchiesi@0: continue; danielebarchiesi@0: } danielebarchiesi@0: $admin_theme_options[$theme->name] = $theme->info['name']; danielebarchiesi@0: $theme->is_default = ($theme->name == $theme_default); danielebarchiesi@0: danielebarchiesi@0: // Identify theme screenshot. danielebarchiesi@0: $theme->screenshot = NULL; danielebarchiesi@0: // Create a list which includes the current theme and all its base themes. danielebarchiesi@0: if (isset($themes[$theme->name]->base_themes)) { danielebarchiesi@0: $theme_keys = array_keys($themes[$theme->name]->base_themes); danielebarchiesi@0: $theme_keys[] = $theme->name; danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: $theme_keys = array($theme->name); danielebarchiesi@0: } danielebarchiesi@0: // Look for a screenshot in the current theme or in its closest ancestor. danielebarchiesi@0: foreach (array_reverse($theme_keys) as $theme_key) { danielebarchiesi@0: if (isset($themes[$theme_key]) && file_exists($themes[$theme_key]->info['screenshot'])) { danielebarchiesi@0: $theme->screenshot = array( danielebarchiesi@0: 'path' => $themes[$theme_key]->info['screenshot'], danielebarchiesi@0: 'alt' => t('Screenshot for !theme theme', array('!theme' => $theme->info['name'])), danielebarchiesi@0: 'title' => t('Screenshot for !theme theme', array('!theme' => $theme->info['name'])), danielebarchiesi@0: 'attributes' => array('class' => array('screenshot')), danielebarchiesi@0: ); danielebarchiesi@0: break; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: if (empty($theme->status)) { danielebarchiesi@0: // Ensure this theme is compatible with this version of core. danielebarchiesi@0: // Require the 'content' region to make sure the main page danielebarchiesi@0: // content has a common place in all themes. danielebarchiesi@0: $theme->incompatible_core = !isset($theme->info['core']) || ($theme->info['core'] != DRUPAL_CORE_COMPATIBILITY) || (!isset($theme->info['regions']['content'])); danielebarchiesi@0: $theme->incompatible_php = version_compare(phpversion(), $theme->info['php']) < 0; danielebarchiesi@0: } danielebarchiesi@0: $query['token'] = drupal_get_token('system-theme-operation-link'); danielebarchiesi@0: $theme->operations = array(); danielebarchiesi@0: if (!empty($theme->status) || !$theme->incompatible_core && !$theme->incompatible_php) { danielebarchiesi@0: // Create the operations links. danielebarchiesi@0: $query['theme'] = $theme->name; danielebarchiesi@0: if (drupal_theme_access($theme)) { danielebarchiesi@0: $theme->operations[] = array( danielebarchiesi@0: 'title' => t('Settings'), danielebarchiesi@0: 'href' => 'admin/appearance/settings/' . $theme->name, danielebarchiesi@0: 'attributes' => array('title' => t('Settings for !theme theme', array('!theme' => $theme->info['name']))), danielebarchiesi@0: ); danielebarchiesi@0: } danielebarchiesi@0: if (!empty($theme->status)) { danielebarchiesi@0: if (!$theme->is_default) { danielebarchiesi@0: $theme->operations[] = array( danielebarchiesi@0: 'title' => t('Disable'), danielebarchiesi@0: 'href' => 'admin/appearance/disable', danielebarchiesi@0: 'query' => $query, danielebarchiesi@0: 'attributes' => array('title' => t('Disable !theme theme', array('!theme' => $theme->info['name']))), danielebarchiesi@0: ); danielebarchiesi@0: $theme->operations[] = array( danielebarchiesi@0: 'title' => t('Set default'), danielebarchiesi@0: 'href' => 'admin/appearance/default', danielebarchiesi@0: 'query' => $query, danielebarchiesi@0: 'attributes' => array('title' => t('Set !theme as default theme', array('!theme' => $theme->info['name']))), danielebarchiesi@0: ); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: $theme->operations[] = array( danielebarchiesi@0: 'title' => t('Enable'), danielebarchiesi@0: 'href' => 'admin/appearance/enable', danielebarchiesi@0: 'query' => $query, danielebarchiesi@0: 'attributes' => array('title' => t('Enable !theme theme', array('!theme' => $theme->info['name']))), danielebarchiesi@0: ); danielebarchiesi@0: $theme->operations[] = array( danielebarchiesi@0: 'title' => t('Enable and set default'), danielebarchiesi@0: 'href' => 'admin/appearance/default', danielebarchiesi@0: 'query' => $query, danielebarchiesi@0: 'attributes' => array('title' => t('Enable !theme as default theme', array('!theme' => $theme->info['name']))), danielebarchiesi@0: ); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Add notes to default and administration theme. danielebarchiesi@0: $theme->notes = array(); danielebarchiesi@0: $theme->classes = array(); danielebarchiesi@0: if ($theme->is_default) { danielebarchiesi@0: $theme->classes[] = 'theme-default'; danielebarchiesi@0: $theme->notes[] = t('default theme'); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Sort enabled and disabled themes into their own groups. danielebarchiesi@0: $theme_groups[$theme->status ? 'enabled' : 'disabled'][] = $theme; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // There are two possible theme groups. danielebarchiesi@0: $theme_group_titles = array( danielebarchiesi@0: 'enabled' => format_plural(count($theme_groups['enabled']), 'Enabled theme', 'Enabled themes'), danielebarchiesi@0: ); danielebarchiesi@0: if (!empty($theme_groups['disabled'])) { danielebarchiesi@0: $theme_group_titles['disabled'] = format_plural(count($theme_groups['disabled']), 'Disabled theme', 'Disabled themes'); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: uasort($theme_groups['enabled'], 'system_sort_themes'); danielebarchiesi@0: drupal_alter('system_themes_page', $theme_groups); danielebarchiesi@0: danielebarchiesi@0: $admin_form = drupal_get_form('system_themes_admin_form', $admin_theme_options); danielebarchiesi@0: return theme('system_themes_page', array('theme_groups' => $theme_groups, 'theme_group_titles' => $theme_group_titles)) . drupal_render($admin_form); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Form to select the administration theme. danielebarchiesi@0: * danielebarchiesi@0: * @ingroup forms danielebarchiesi@0: * @see system_themes_admin_form_submit() danielebarchiesi@0: */ danielebarchiesi@0: function system_themes_admin_form($form, &$form_state, $theme_options) { danielebarchiesi@0: // Administration theme settings. danielebarchiesi@0: $form['admin_theme'] = array( danielebarchiesi@0: '#type' => 'fieldset', danielebarchiesi@0: '#title' => t('Administration theme'), danielebarchiesi@0: ); danielebarchiesi@0: $form['admin_theme']['admin_theme'] = array( danielebarchiesi@0: '#type' => 'select', danielebarchiesi@0: '#options' => array(0 => t('Default theme')) + $theme_options, danielebarchiesi@0: '#title' => t('Administration theme'), danielebarchiesi@0: '#description' => t('Choose "Default theme" to always use the same theme as the rest of the site.'), danielebarchiesi@0: '#default_value' => variable_get('admin_theme', 0), danielebarchiesi@0: ); danielebarchiesi@0: $form['admin_theme']['node_admin_theme'] = array( danielebarchiesi@0: '#type' => 'checkbox', danielebarchiesi@0: '#title' => t('Use the administration theme when editing or creating content'), danielebarchiesi@0: '#default_value' => variable_get('node_admin_theme', '0'), danielebarchiesi@0: ); danielebarchiesi@0: $form['admin_theme']['actions'] = array('#type' => 'actions'); danielebarchiesi@0: $form['admin_theme']['actions']['submit'] = array( danielebarchiesi@0: '#type' => 'submit', danielebarchiesi@0: '#value' => t('Save configuration'), danielebarchiesi@0: ); danielebarchiesi@0: return $form; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Process system_themes_admin_form form submissions. danielebarchiesi@0: */ danielebarchiesi@0: function system_themes_admin_form_submit($form, &$form_state) { danielebarchiesi@0: drupal_set_message(t('The configuration options have been saved.')); danielebarchiesi@0: variable_set('admin_theme', $form_state['values']['admin_theme']); danielebarchiesi@0: variable_set('node_admin_theme', $form_state['values']['node_admin_theme']); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Menu callback; Enables a theme. danielebarchiesi@0: */ danielebarchiesi@0: function system_theme_enable() { danielebarchiesi@0: if (isset($_REQUEST['theme']) && isset($_REQUEST['token']) && drupal_valid_token($_REQUEST['token'], 'system-theme-operation-link')) { danielebarchiesi@0: $theme = $_REQUEST['theme']; danielebarchiesi@0: // Get current list of themes. danielebarchiesi@0: $themes = list_themes(); danielebarchiesi@0: danielebarchiesi@0: // Check if the specified theme is one recognized by the system. danielebarchiesi@0: if (!empty($themes[$theme])) { danielebarchiesi@0: theme_enable(array($theme)); danielebarchiesi@0: drupal_set_message(t('The %theme theme has been enabled.', array('%theme' => $themes[$theme]->info['name']))); danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: drupal_set_message(t('The %theme theme was not found.', array('%theme' => $theme)), 'error'); danielebarchiesi@0: } danielebarchiesi@0: drupal_goto('admin/appearance'); danielebarchiesi@0: } danielebarchiesi@0: return drupal_access_denied(); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Menu callback; Disables a theme. danielebarchiesi@0: */ danielebarchiesi@0: function system_theme_disable() { danielebarchiesi@0: if (isset($_REQUEST['theme']) && isset($_REQUEST['token']) && drupal_valid_token($_REQUEST['token'], 'system-theme-operation-link')) { danielebarchiesi@0: $theme = $_REQUEST['theme']; danielebarchiesi@0: // Get current list of themes. danielebarchiesi@0: $themes = list_themes(); danielebarchiesi@0: danielebarchiesi@0: // Check if the specified theme is one recognized by the system. danielebarchiesi@0: if (!empty($themes[$theme])) { danielebarchiesi@0: if ($theme == variable_get('theme_default', 'bartik')) { danielebarchiesi@0: // Don't disable the default theme. danielebarchiesi@0: drupal_set_message(t('%theme is the default theme and cannot be disabled.', array('%theme' => $themes[$theme]->info['name'])), 'error'); danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: theme_disable(array($theme)); danielebarchiesi@0: drupal_set_message(t('The %theme theme has been disabled.', array('%theme' => $themes[$theme]->info['name']))); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: drupal_set_message(t('The %theme theme was not found.', array('%theme' => $theme)), 'error'); danielebarchiesi@0: } danielebarchiesi@0: drupal_goto('admin/appearance'); danielebarchiesi@0: } danielebarchiesi@0: return drupal_access_denied(); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Menu callback; Set the default theme. danielebarchiesi@0: */ danielebarchiesi@0: function system_theme_default() { danielebarchiesi@0: if (isset($_REQUEST['theme']) && isset($_REQUEST['token']) && drupal_valid_token($_REQUEST['token'], 'system-theme-operation-link')) { danielebarchiesi@0: $theme = $_REQUEST['theme']; danielebarchiesi@0: // Get current list of themes. danielebarchiesi@0: $themes = list_themes(); danielebarchiesi@0: danielebarchiesi@0: // Check if the specified theme is one recognized by the system. danielebarchiesi@0: if (!empty($themes[$theme])) { danielebarchiesi@0: // Enable the theme if it is currently disabled. danielebarchiesi@0: if (empty($themes[$theme]->status)) { danielebarchiesi@0: theme_enable(array($theme)); danielebarchiesi@0: } danielebarchiesi@0: // Set the default theme. danielebarchiesi@0: variable_set('theme_default', $theme); danielebarchiesi@0: danielebarchiesi@0: // Rebuild the menu. This duplicates the menu_rebuild() in theme_enable(). danielebarchiesi@0: // However, modules must know the current default theme in order to use danielebarchiesi@0: // this information in hook_menu() or hook_menu_alter() implementations, danielebarchiesi@0: // and doing the variable_set() before the theme_enable() could result danielebarchiesi@0: // in a race condition where the theme is default but not enabled. danielebarchiesi@0: menu_rebuild(); danielebarchiesi@0: danielebarchiesi@0: // The status message depends on whether an admin theme is currently in use: danielebarchiesi@0: // a value of 0 means the admin theme is set to be the default theme. danielebarchiesi@0: $admin_theme = variable_get('admin_theme', 0); danielebarchiesi@0: if ($admin_theme != 0 && $admin_theme != $theme) { danielebarchiesi@0: drupal_set_message(t('Please note that the administration theme is still set to the %admin_theme theme; consequently, the theme on this page remains unchanged. All non-administrative sections of the site, however, will show the selected %selected_theme theme by default.', array( danielebarchiesi@0: '%admin_theme' => $themes[$admin_theme]->info['name'], danielebarchiesi@0: '%selected_theme' => $themes[$theme]->info['name'], danielebarchiesi@0: ))); danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: drupal_set_message(t('%theme is now the default theme.', array('%theme' => $themes[$theme]->info['name']))); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: drupal_set_message(t('The %theme theme was not found.', array('%theme' => $theme)), 'error'); danielebarchiesi@0: } danielebarchiesi@0: drupal_goto('admin/appearance'); danielebarchiesi@0: } danielebarchiesi@0: return drupal_access_denied(); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Form builder; display theme configuration for entire site and individual themes. danielebarchiesi@0: * danielebarchiesi@0: * @param $key danielebarchiesi@0: * A theme name. danielebarchiesi@0: * @return danielebarchiesi@0: * The form structure. danielebarchiesi@0: * @ingroup forms danielebarchiesi@0: * @see system_theme_settings_submit() danielebarchiesi@0: */ danielebarchiesi@0: function system_theme_settings($form, &$form_state, $key = '') { danielebarchiesi@0: // Default settings are defined in theme_get_setting() in includes/theme.inc danielebarchiesi@0: if ($key) { danielebarchiesi@0: $var = 'theme_' . $key . '_settings'; danielebarchiesi@0: $themes = list_themes(); danielebarchiesi@0: $features = $themes[$key]->info['features']; danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: $var = 'theme_settings'; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $form['var'] = array('#type' => 'hidden', '#value' => $var); danielebarchiesi@0: danielebarchiesi@0: // Toggle settings danielebarchiesi@0: $toggles = array( danielebarchiesi@0: 'logo' => t('Logo'), danielebarchiesi@0: 'name' => t('Site name'), danielebarchiesi@0: 'slogan' => t('Site slogan'), danielebarchiesi@0: 'node_user_picture' => t('User pictures in posts'), danielebarchiesi@0: 'comment_user_picture' => t('User pictures in comments'), danielebarchiesi@0: 'comment_user_verification' => t('User verification status in comments'), danielebarchiesi@0: 'favicon' => t('Shortcut icon'), danielebarchiesi@0: 'main_menu' => t('Main menu'), danielebarchiesi@0: 'secondary_menu' => t('Secondary menu'), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: // Some features are not always available danielebarchiesi@0: $disabled = array(); danielebarchiesi@0: if (!variable_get('user_pictures', 0)) { danielebarchiesi@0: $disabled['toggle_node_user_picture'] = TRUE; danielebarchiesi@0: $disabled['toggle_comment_user_picture'] = TRUE; danielebarchiesi@0: } danielebarchiesi@0: if (!module_exists('comment')) { danielebarchiesi@0: $disabled['toggle_comment_user_picture'] = TRUE; danielebarchiesi@0: $disabled['toggle_comment_user_verification'] = TRUE; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $form['theme_settings'] = array( danielebarchiesi@0: '#type' => 'fieldset', danielebarchiesi@0: '#title' => t('Toggle display'), danielebarchiesi@0: '#description' => t('Enable or disable the display of certain page elements.'), danielebarchiesi@0: ); danielebarchiesi@0: foreach ($toggles as $name => $title) { danielebarchiesi@0: if ((!$key) || in_array($name, $features)) { danielebarchiesi@0: $form['theme_settings']['toggle_' . $name] = array('#type' => 'checkbox', '#title' => $title, '#default_value' => theme_get_setting('toggle_' . $name, $key)); danielebarchiesi@0: // Disable checkboxes for features not supported in the current configuration. danielebarchiesi@0: if (isset($disabled['toggle_' . $name])) { danielebarchiesi@0: $form['theme_settings']['toggle_' . $name]['#disabled'] = TRUE; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: if (!element_children($form['theme_settings'])) { danielebarchiesi@0: // If there is no element in the theme settings fieldset then do not show danielebarchiesi@0: // it -- but keep it in the form if another module wants to alter. danielebarchiesi@0: $form['theme_settings']['#access'] = FALSE; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Logo settings danielebarchiesi@0: if ((!$key) || in_array('logo', $features)) { danielebarchiesi@0: $form['logo'] = array( danielebarchiesi@0: '#type' => 'fieldset', danielebarchiesi@0: '#title' => t('Logo image settings'), danielebarchiesi@0: '#description' => t('If toggled on, the following logo will be displayed.'), danielebarchiesi@0: '#attributes' => array('class' => array('theme-settings-bottom')), danielebarchiesi@0: ); danielebarchiesi@0: $form['logo']['default_logo'] = array( danielebarchiesi@0: '#type' => 'checkbox', danielebarchiesi@0: '#title' => t('Use the default logo'), danielebarchiesi@0: '#default_value' => theme_get_setting('default_logo', $key), danielebarchiesi@0: '#tree' => FALSE, danielebarchiesi@0: '#description' => t('Check here if you want the theme to use the logo supplied with it.') danielebarchiesi@0: ); danielebarchiesi@0: $form['logo']['settings'] = array( danielebarchiesi@0: '#type' => 'container', danielebarchiesi@0: '#states' => array( danielebarchiesi@0: // Hide the logo settings when using the default logo. danielebarchiesi@0: 'invisible' => array( danielebarchiesi@0: 'input[name="default_logo"]' => array('checked' => TRUE), danielebarchiesi@0: ), danielebarchiesi@0: ), danielebarchiesi@0: ); danielebarchiesi@0: $form['logo']['settings']['logo_path'] = array( danielebarchiesi@0: '#type' => 'textfield', danielebarchiesi@0: '#title' => t('Path to custom logo'), danielebarchiesi@0: '#description' => t('The path to the file you would like to use as your logo file instead of the default logo.'), danielebarchiesi@0: '#default_value' => theme_get_setting('logo_path', $key), danielebarchiesi@0: ); danielebarchiesi@0: $form['logo']['settings']['logo_upload'] = array( danielebarchiesi@0: '#type' => 'file', danielebarchiesi@0: '#title' => t('Upload logo image'), danielebarchiesi@0: '#maxlength' => 40, danielebarchiesi@0: '#description' => t("If you don't have direct file access to the server, use this field to upload your logo.") danielebarchiesi@0: ); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: if ((!$key) || in_array('favicon', $features)) { danielebarchiesi@0: $form['favicon'] = array( danielebarchiesi@0: '#type' => 'fieldset', danielebarchiesi@0: '#title' => t('Shortcut icon settings'), danielebarchiesi@0: '#description' => t("Your shortcut icon, or 'favicon', is displayed in the address bar and bookmarks of most browsers."), danielebarchiesi@0: ); danielebarchiesi@0: $form['favicon']['default_favicon'] = array( danielebarchiesi@0: '#type' => 'checkbox', danielebarchiesi@0: '#title' => t('Use the default shortcut icon.'), danielebarchiesi@0: '#default_value' => theme_get_setting('default_favicon', $key), danielebarchiesi@0: '#description' => t('Check here if you want the theme to use the default shortcut icon.') danielebarchiesi@0: ); danielebarchiesi@0: $form['favicon']['settings'] = array( danielebarchiesi@0: '#type' => 'container', danielebarchiesi@0: '#states' => array( danielebarchiesi@0: // Hide the favicon settings when using the default favicon. danielebarchiesi@0: 'invisible' => array( danielebarchiesi@0: 'input[name="default_favicon"]' => array('checked' => TRUE), danielebarchiesi@0: ), danielebarchiesi@0: ), danielebarchiesi@0: ); danielebarchiesi@0: $form['favicon']['settings']['favicon_path'] = array( danielebarchiesi@0: '#type' => 'textfield', danielebarchiesi@0: '#title' => t('Path to custom icon'), danielebarchiesi@0: '#description' => t('The path to the image file you would like to use as your custom shortcut icon.'), danielebarchiesi@0: '#default_value' => theme_get_setting('favicon_path', $key), danielebarchiesi@0: ); danielebarchiesi@0: $form['favicon']['settings']['favicon_upload'] = array( danielebarchiesi@0: '#type' => 'file', danielebarchiesi@0: '#title' => t('Upload icon image'), danielebarchiesi@0: '#description' => t("If you don't have direct file access to the server, use this field to upload your shortcut icon.") danielebarchiesi@0: ); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Inject human-friendly values for logo and favicon. danielebarchiesi@0: foreach (array('logo' => 'logo.png', 'favicon' => 'favicon.ico') as $type => $default) { danielebarchiesi@0: if (isset($form[$type]['settings'][$type . '_path'])) { danielebarchiesi@0: $element = &$form[$type]['settings'][$type . '_path']; danielebarchiesi@0: danielebarchiesi@0: // If path is a public:// URI, display the path relative to the files danielebarchiesi@0: // directory; stream wrappers are not end-user friendly. danielebarchiesi@0: $original_path = $element['#default_value']; danielebarchiesi@0: $friendly_path = NULL; danielebarchiesi@0: if (file_uri_scheme($original_path) == 'public') { danielebarchiesi@0: $friendly_path = file_uri_target($original_path); danielebarchiesi@0: $element['#default_value'] = $friendly_path; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: if ($key) { danielebarchiesi@0: // Call engine-specific settings. danielebarchiesi@0: $function = $themes[$key]->prefix . '_engine_settings'; danielebarchiesi@0: if (function_exists($function)) { danielebarchiesi@0: $form['engine_specific'] = array( danielebarchiesi@0: '#type' => 'fieldset', danielebarchiesi@0: '#title' => t('Theme-engine-specific settings'), danielebarchiesi@0: '#description' => t('These settings only exist for the themes based on the %engine theme engine.', array('%engine' => $themes[$key]->prefix)), danielebarchiesi@0: ); danielebarchiesi@0: $function($form, $form_state); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Create a list which includes the current theme and all its base themes. danielebarchiesi@0: if (isset($themes[$key]->base_themes)) { danielebarchiesi@0: $theme_keys = array_keys($themes[$key]->base_themes); danielebarchiesi@0: $theme_keys[] = $key; danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: $theme_keys = array($key); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Save the name of the current theme (if any), so that we can temporarily danielebarchiesi@0: // override the current theme and allow theme_get_setting() to work danielebarchiesi@0: // without having to pass the theme name to it. danielebarchiesi@0: $default_theme = !empty($GLOBALS['theme_key']) ? $GLOBALS['theme_key'] : NULL; danielebarchiesi@0: $GLOBALS['theme_key'] = $key; danielebarchiesi@0: danielebarchiesi@0: // Process the theme and all its base themes. danielebarchiesi@0: foreach ($theme_keys as $theme) { danielebarchiesi@0: // Include the theme-settings.php file. danielebarchiesi@0: $filename = DRUPAL_ROOT . '/' . str_replace("/$theme.info", '', $themes[$theme]->filename) . '/theme-settings.php'; danielebarchiesi@0: if (file_exists($filename)) { danielebarchiesi@0: require_once $filename; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Call theme-specific settings. danielebarchiesi@0: $function = $theme . '_form_system_theme_settings_alter'; danielebarchiesi@0: if (function_exists($function)) { danielebarchiesi@0: $function($form, $form_state); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Restore the original current theme. danielebarchiesi@0: if (isset($default_theme)) { danielebarchiesi@0: $GLOBALS['theme_key'] = $default_theme; danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: unset($GLOBALS['theme_key']); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $form = system_settings_form($form); danielebarchiesi@0: // We don't want to call system_settings_form_submit(), so change #submit. danielebarchiesi@0: array_pop($form['#submit']); danielebarchiesi@0: $form['#submit'][] = 'system_theme_settings_submit'; danielebarchiesi@0: $form['#validate'][] = 'system_theme_settings_validate'; danielebarchiesi@0: return $form; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Validator for the system_theme_settings() form. danielebarchiesi@0: */ danielebarchiesi@0: function system_theme_settings_validate($form, &$form_state) { danielebarchiesi@0: // Handle file uploads. danielebarchiesi@0: $validators = array('file_validate_is_image' => array()); danielebarchiesi@0: danielebarchiesi@0: // Check for a new uploaded logo. danielebarchiesi@0: $file = file_save_upload('logo_upload', $validators); danielebarchiesi@0: if (isset($file)) { danielebarchiesi@0: // File upload was attempted. danielebarchiesi@0: if ($file) { danielebarchiesi@0: // Put the temporary file in form_values so we can save it on submit. danielebarchiesi@0: $form_state['values']['logo_upload'] = $file; danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: // File upload failed. danielebarchiesi@0: form_set_error('logo_upload', t('The logo could not be uploaded.')); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $validators = array('file_validate_extensions' => array('ico png gif jpg jpeg apng svg')); danielebarchiesi@0: danielebarchiesi@0: // Check for a new uploaded favicon. danielebarchiesi@0: $file = file_save_upload('favicon_upload', $validators); danielebarchiesi@0: if (isset($file)) { danielebarchiesi@0: // File upload was attempted. danielebarchiesi@0: if ($file) { danielebarchiesi@0: // Put the temporary file in form_values so we can save it on submit. danielebarchiesi@0: $form_state['values']['favicon_upload'] = $file; danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: // File upload failed. danielebarchiesi@0: form_set_error('favicon_upload', t('The favicon could not be uploaded.')); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // If the user provided a path for a logo or favicon file, make sure a file danielebarchiesi@0: // exists at that path. danielebarchiesi@0: if ($form_state['values']['logo_path']) { danielebarchiesi@0: $path = _system_theme_settings_validate_path($form_state['values']['logo_path']); danielebarchiesi@0: if (!$path) { danielebarchiesi@0: form_set_error('logo_path', t('The custom logo path is invalid.')); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: if ($form_state['values']['favicon_path']) { danielebarchiesi@0: $path = _system_theme_settings_validate_path($form_state['values']['favicon_path']); danielebarchiesi@0: if (!$path) { danielebarchiesi@0: form_set_error('favicon_path', t('The custom favicon path is invalid.')); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Helper function for the system_theme_settings form. danielebarchiesi@0: * danielebarchiesi@0: * Attempts to validate normal system paths, paths relative to the public files danielebarchiesi@0: * directory, or stream wrapper URIs. If the given path is any of the above, danielebarchiesi@0: * returns a valid path or URI that the theme system can display. danielebarchiesi@0: * danielebarchiesi@0: * @param $path danielebarchiesi@0: * A path relative to the Drupal root or to the public files directory, or danielebarchiesi@0: * a stream wrapper URI. danielebarchiesi@0: * @return mixed danielebarchiesi@0: * A valid path that can be displayed through the theme system, or FALSE if danielebarchiesi@0: * the path could not be validated. danielebarchiesi@0: */ danielebarchiesi@0: function _system_theme_settings_validate_path($path) { danielebarchiesi@0: // Absolute local file paths are invalid. danielebarchiesi@0: if (drupal_realpath($path) == $path) { danielebarchiesi@0: return FALSE; danielebarchiesi@0: } danielebarchiesi@0: // A path relative to the Drupal root or a fully qualified URI is valid. danielebarchiesi@0: if (is_file($path)) { danielebarchiesi@0: return $path; danielebarchiesi@0: } danielebarchiesi@0: // Prepend 'public://' for relative file paths within public filesystem. danielebarchiesi@0: if (file_uri_scheme($path) === FALSE) { danielebarchiesi@0: $path = 'public://' . $path; danielebarchiesi@0: } danielebarchiesi@0: if (is_file($path)) { danielebarchiesi@0: return $path; danielebarchiesi@0: } danielebarchiesi@0: return FALSE; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Process system_theme_settings form submissions. danielebarchiesi@0: */ danielebarchiesi@0: function system_theme_settings_submit($form, &$form_state) { danielebarchiesi@0: // Exclude unnecessary elements before saving. danielebarchiesi@0: form_state_values_clean($form_state); danielebarchiesi@0: danielebarchiesi@0: $values = $form_state['values']; danielebarchiesi@0: danielebarchiesi@0: // Extract the name of the theme from the submitted form values, then remove danielebarchiesi@0: // it from the array so that it is not saved as part of the variable. danielebarchiesi@0: $key = $values['var']; danielebarchiesi@0: unset($values['var']); danielebarchiesi@0: danielebarchiesi@0: // If the user uploaded a new logo or favicon, save it to a permanent location danielebarchiesi@0: // and use it in place of the default theme-provided file. danielebarchiesi@0: if ($file = $values['logo_upload']) { danielebarchiesi@0: unset($values['logo_upload']); danielebarchiesi@0: $filename = file_unmanaged_copy($file->uri); danielebarchiesi@0: $values['default_logo'] = 0; danielebarchiesi@0: $values['logo_path'] = $filename; danielebarchiesi@0: $values['toggle_logo'] = 1; danielebarchiesi@0: } danielebarchiesi@0: if ($file = $values['favicon_upload']) { danielebarchiesi@0: unset($values['favicon_upload']); danielebarchiesi@0: $filename = file_unmanaged_copy($file->uri); danielebarchiesi@0: $values['default_favicon'] = 0; danielebarchiesi@0: $values['favicon_path'] = $filename; danielebarchiesi@0: $values['toggle_favicon'] = 1; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // If the user entered a path relative to the system files directory for danielebarchiesi@0: // a logo or favicon, store a public:// URI so the theme system can handle it. danielebarchiesi@0: if (!empty($values['logo_path'])) { danielebarchiesi@0: $values['logo_path'] = _system_theme_settings_validate_path($values['logo_path']); danielebarchiesi@0: } danielebarchiesi@0: if (!empty($values['favicon_path'])) { danielebarchiesi@0: $values['favicon_path'] = _system_theme_settings_validate_path($values['favicon_path']); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: if (empty($values['default_favicon']) && !empty($values['favicon_path'])) { danielebarchiesi@0: $values['favicon_mimetype'] = file_get_mimetype($values['favicon_path']); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: variable_set($key, $values); danielebarchiesi@0: drupal_set_message(t('The configuration options have been saved.')); danielebarchiesi@0: danielebarchiesi@0: cache_clear_all(); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Recursively check compatibility. danielebarchiesi@0: * danielebarchiesi@0: * @param $incompatible danielebarchiesi@0: * An associative array which at the end of the check contains all danielebarchiesi@0: * incompatible files as the keys, their values being TRUE. danielebarchiesi@0: * @param $files danielebarchiesi@0: * The set of files that will be tested. danielebarchiesi@0: * @param $file danielebarchiesi@0: * The file at which the check starts. danielebarchiesi@0: * @return danielebarchiesi@0: * Returns TRUE if an incompatible file is found, NULL (no return value) danielebarchiesi@0: * otherwise. danielebarchiesi@0: */ danielebarchiesi@0: function _system_is_incompatible(&$incompatible, $files, $file) { danielebarchiesi@0: if (isset($incompatible[$file->name])) { danielebarchiesi@0: return TRUE; danielebarchiesi@0: } danielebarchiesi@0: // Recursively traverse required modules, looking for incompatible modules. danielebarchiesi@0: foreach ($file->requires as $requires) { danielebarchiesi@0: if (isset($files[$requires]) && _system_is_incompatible($incompatible, $files, $files[$requires])) { danielebarchiesi@0: $incompatible[$file->name] = TRUE; danielebarchiesi@0: return TRUE; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Menu callback; provides module enable/disable interface. danielebarchiesi@0: * danielebarchiesi@0: * The list of modules gets populated by module.info files, which contain each danielebarchiesi@0: * module's name, description, and information about which modules it requires. danielebarchiesi@0: * See drupal_parse_info_file() for information on module.info descriptors. danielebarchiesi@0: * danielebarchiesi@0: * Dependency checking is performed to ensure that a module: danielebarchiesi@0: * - can not be enabled if there are disabled modules it requires. danielebarchiesi@0: * - can not be disabled if there are enabled modules which depend on it. danielebarchiesi@0: * danielebarchiesi@0: * @param $form_state danielebarchiesi@0: * An associative array containing the current state of the form. danielebarchiesi@0: * danielebarchiesi@0: * @return danielebarchiesi@0: * The form array. danielebarchiesi@0: * danielebarchiesi@0: * @ingroup forms danielebarchiesi@0: * @see theme_system_modules() danielebarchiesi@0: * @see system_modules_submit() danielebarchiesi@0: */ danielebarchiesi@0: function system_modules($form, $form_state = array()) { danielebarchiesi@0: // Get current list of modules. danielebarchiesi@0: $files = system_rebuild_module_data(); danielebarchiesi@0: danielebarchiesi@0: // Remove hidden modules from display list. danielebarchiesi@0: $visible_files = $files; danielebarchiesi@0: foreach ($visible_files as $filename => $file) { danielebarchiesi@0: if (!empty($file->info['hidden'])) { danielebarchiesi@0: unset($visible_files[$filename]); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: uasort($visible_files, 'system_sort_modules_by_info_name'); danielebarchiesi@0: danielebarchiesi@0: // If the modules form was submitted, then system_modules_submit() runs first danielebarchiesi@0: // and if there are unfilled required modules, then $form_state['storage'] is danielebarchiesi@0: // filled, triggering a rebuild. In this case we need to display a danielebarchiesi@0: // confirmation form. danielebarchiesi@0: if (!empty($form_state['storage'])) { danielebarchiesi@0: return system_modules_confirm_form($visible_files, $form_state['storage']); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $modules = array(); danielebarchiesi@0: $form['modules'] = array('#tree' => TRUE); danielebarchiesi@0: danielebarchiesi@0: // Used when checking if module implements a help page. danielebarchiesi@0: $help_arg = module_exists('help') ? drupal_help_arg() : FALSE; danielebarchiesi@0: danielebarchiesi@0: // Used when displaying modules that are required by the installation profile. danielebarchiesi@0: require_once DRUPAL_ROOT . '/includes/install.inc'; danielebarchiesi@0: $distribution_name = check_plain(drupal_install_profile_distribution_name()); danielebarchiesi@0: danielebarchiesi@0: // Iterate through each of the modules. danielebarchiesi@0: foreach ($visible_files as $filename => $module) { danielebarchiesi@0: $extra = array(); danielebarchiesi@0: $extra['enabled'] = (bool) $module->status; danielebarchiesi@0: if (!empty($module->info['required'] )) { danielebarchiesi@0: $extra['disabled'] = TRUE; danielebarchiesi@0: $extra['required_by'][] = $distribution_name . (!empty($module->info['explanation']) ? ' ('. $module->info['explanation'] .')' : ''); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // If this module requires other modules, add them to the array. danielebarchiesi@0: foreach ($module->requires as $requires => $v) { danielebarchiesi@0: if (!isset($files[$requires])) { danielebarchiesi@0: $extra['requires'][$requires] = t('@module (missing)', array('@module' => drupal_ucfirst($requires))); danielebarchiesi@0: $extra['disabled'] = TRUE; danielebarchiesi@0: } danielebarchiesi@0: // Only display visible modules. danielebarchiesi@0: elseif (isset($visible_files[$requires])) { danielebarchiesi@0: $requires_name = $files[$requires]->info['name']; danielebarchiesi@0: // Disable this module if it is incompatible with the dependency's version. danielebarchiesi@0: if ($incompatible_version = drupal_check_incompatibility($v, str_replace(DRUPAL_CORE_COMPATIBILITY . '-', '', $files[$requires]->info['version']))) { danielebarchiesi@0: $extra['requires'][$requires] = t('@module (incompatible with version @version)', array( danielebarchiesi@0: '@module' => $requires_name . $incompatible_version, danielebarchiesi@0: '@version' => $files[$requires]->info['version'], danielebarchiesi@0: )); danielebarchiesi@0: $extra['disabled'] = TRUE; danielebarchiesi@0: } danielebarchiesi@0: // Disable this module if the dependency is incompatible with this danielebarchiesi@0: // version of Drupal core. danielebarchiesi@0: elseif ($files[$requires]->info['core'] != DRUPAL_CORE_COMPATIBILITY) { danielebarchiesi@0: $extra['requires'][$requires] = t('@module (incompatible with this version of Drupal core)', array( danielebarchiesi@0: '@module' => $requires_name, danielebarchiesi@0: )); danielebarchiesi@0: $extra['disabled'] = TRUE; danielebarchiesi@0: } danielebarchiesi@0: elseif ($files[$requires]->status) { danielebarchiesi@0: $extra['requires'][$requires] = t('@module (enabled)', array('@module' => $requires_name)); danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: $extra['requires'][$requires] = t('@module (disabled)', array('@module' => $requires_name)); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: // Generate link for module's help page, if there is one. danielebarchiesi@0: if ($help_arg && $module->status && in_array($filename, module_implements('help'))) { danielebarchiesi@0: if (module_invoke($filename, 'help', "admin/help#$filename", $help_arg)) { danielebarchiesi@0: $extra['links']['help'] = array( danielebarchiesi@0: '#type' => 'link', danielebarchiesi@0: '#title' => t('Help'), danielebarchiesi@0: '#href' => "admin/help/$filename", danielebarchiesi@0: '#options' => array('attributes' => array('class' => array('module-link', 'module-link-help'), 'title' => t('Help'))), danielebarchiesi@0: ); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: // Generate link for module's permission, if the user has access to it. danielebarchiesi@0: if ($module->status && user_access('administer permissions') && in_array($filename, module_implements('permission'))) { danielebarchiesi@0: $extra['links']['permissions'] = array( danielebarchiesi@0: '#type' => 'link', danielebarchiesi@0: '#title' => t('Permissions'), danielebarchiesi@0: '#href' => 'admin/people/permissions', danielebarchiesi@0: '#options' => array('fragment' => 'module-' . $filename, 'attributes' => array('class' => array('module-link', 'module-link-permissions'), 'title' => t('Configure permissions'))), danielebarchiesi@0: ); danielebarchiesi@0: } danielebarchiesi@0: // Generate link for module's configuration page, if the module provides danielebarchiesi@0: // one. danielebarchiesi@0: if ($module->status && isset($module->info['configure'])) { danielebarchiesi@0: $configure_link = menu_get_item($module->info['configure']); danielebarchiesi@0: if ($configure_link['access']) { danielebarchiesi@0: $extra['links']['configure'] = array( danielebarchiesi@0: '#type' => 'link', danielebarchiesi@0: '#title' => t('Configure'), danielebarchiesi@0: '#href' => $configure_link['href'], danielebarchiesi@0: '#options' => array('attributes' => array('class' => array('module-link', 'module-link-configure'), 'title' => $configure_link['description'])), danielebarchiesi@0: ); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // If this module is required by other modules, list those, and then make it danielebarchiesi@0: // impossible to disable this one. danielebarchiesi@0: foreach ($module->required_by as $required_by => $v) { danielebarchiesi@0: // Hidden modules are unset already. danielebarchiesi@0: if (isset($visible_files[$required_by])) { danielebarchiesi@0: if ($files[$required_by]->status == 1 && $module->status == 1) { danielebarchiesi@0: $extra['required_by'][] = t('@module (enabled)', array('@module' => $files[$required_by]->info['name'])); danielebarchiesi@0: $extra['disabled'] = TRUE; danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: $extra['required_by'][] = t('@module (disabled)', array('@module' => $files[$required_by]->info['name'])); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: $form['modules'][$module->info['package']][$filename] = _system_modules_build_row($module->info, $extra); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Add basic information to the fieldsets. danielebarchiesi@0: foreach (element_children($form['modules']) as $package) { danielebarchiesi@0: $form['modules'][$package] += array( danielebarchiesi@0: '#type' => 'fieldset', danielebarchiesi@0: '#title' => t($package), danielebarchiesi@0: '#collapsible' => TRUE, danielebarchiesi@0: '#theme' => 'system_modules_fieldset', danielebarchiesi@0: '#header' => array( danielebarchiesi@0: array('data' => t('Enabled'), 'class' => array('checkbox')), danielebarchiesi@0: t('Name'), danielebarchiesi@0: t('Version'), danielebarchiesi@0: t('Description'), danielebarchiesi@0: array('data' => t('Operations'), 'colspan' => 3), danielebarchiesi@0: ), danielebarchiesi@0: // Ensure that the "Core" package fieldset comes first. danielebarchiesi@0: '#weight' => $package == 'Core' ? -10 : NULL, danielebarchiesi@0: ); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Lastly, sort all fieldsets by title. danielebarchiesi@0: uasort($form['modules'], 'element_sort_by_title'); danielebarchiesi@0: danielebarchiesi@0: $form['actions'] = array('#type' => 'actions'); danielebarchiesi@0: $form['actions']['submit'] = array( danielebarchiesi@0: '#type' => 'submit', danielebarchiesi@0: '#value' => t('Save configuration'), danielebarchiesi@0: ); danielebarchiesi@0: $form['#action'] = url('admin/modules/list/confirm'); danielebarchiesi@0: danielebarchiesi@0: return $form; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Array sorting callback; sorts modules or themes by their name. danielebarchiesi@0: */ danielebarchiesi@0: function system_sort_modules_by_info_name($a, $b) { danielebarchiesi@0: return strcasecmp($a->info['name'], $b->info['name']); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Array sorting callback; sorts modules or themes by their name. danielebarchiesi@0: */ danielebarchiesi@0: function system_sort_themes($a, $b) { danielebarchiesi@0: if ($a->is_default) { danielebarchiesi@0: return -1; danielebarchiesi@0: } danielebarchiesi@0: if ($b->is_default) { danielebarchiesi@0: return 1; danielebarchiesi@0: } danielebarchiesi@0: return strcasecmp($a->info['name'], $b->info['name']); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Build a table row for the system modules page. danielebarchiesi@0: */ danielebarchiesi@0: function _system_modules_build_row($info, $extra) { danielebarchiesi@0: // Add in the defaults. danielebarchiesi@0: $extra += array( danielebarchiesi@0: 'requires' => array(), danielebarchiesi@0: 'required_by' => array(), danielebarchiesi@0: 'disabled' => FALSE, danielebarchiesi@0: 'enabled' => FALSE, danielebarchiesi@0: 'links' => array(), danielebarchiesi@0: ); danielebarchiesi@0: $form = array( danielebarchiesi@0: '#tree' => TRUE, danielebarchiesi@0: ); danielebarchiesi@0: // Set the basic properties. danielebarchiesi@0: $form['name'] = array( danielebarchiesi@0: '#markup' => $info['name'], danielebarchiesi@0: ); danielebarchiesi@0: $form['description'] = array( danielebarchiesi@0: '#markup' => t($info['description']), danielebarchiesi@0: ); danielebarchiesi@0: $form['version'] = array( danielebarchiesi@0: '#markup' => $info['version'], danielebarchiesi@0: ); danielebarchiesi@0: $form['#requires'] = $extra['requires']; danielebarchiesi@0: $form['#required_by'] = $extra['required_by']; danielebarchiesi@0: danielebarchiesi@0: // Check the compatibilities. danielebarchiesi@0: $compatible = TRUE; danielebarchiesi@0: $status_short = ''; danielebarchiesi@0: $status_long = ''; danielebarchiesi@0: danielebarchiesi@0: // Check the core compatibility. danielebarchiesi@0: if (!isset($info['core']) || $info['core'] != DRUPAL_CORE_COMPATIBILITY) { danielebarchiesi@0: $compatible = FALSE; danielebarchiesi@0: $status_short .= t('Incompatible with this version of Drupal core.'); danielebarchiesi@0: $status_long .= t('This version is not compatible with Drupal !core_version and should be replaced.', array('!core_version' => DRUPAL_CORE_COMPATIBILITY)); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Ensure this module is compatible with the currently installed version of PHP. danielebarchiesi@0: if (version_compare(phpversion(), $info['php']) < 0) { danielebarchiesi@0: $compatible = FALSE; danielebarchiesi@0: $status_short .= t('Incompatible with this version of PHP'); danielebarchiesi@0: $php_required = $info['php']; danielebarchiesi@0: if (substr_count($info['php'], '.') < 2) { danielebarchiesi@0: $php_required .= '.*'; danielebarchiesi@0: } danielebarchiesi@0: $status_long .= t('This module requires PHP version @php_required and is incompatible with PHP version !php_version.', array('@php_required' => $php_required, '!php_version' => phpversion())); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // If this module is compatible, present a checkbox indicating danielebarchiesi@0: // this module may be installed. Otherwise, show a big red X. danielebarchiesi@0: if ($compatible) { danielebarchiesi@0: $form['enable'] = array( danielebarchiesi@0: '#type' => 'checkbox', danielebarchiesi@0: '#title' => t('Enable'), danielebarchiesi@0: '#default_value' => $extra['enabled'], danielebarchiesi@0: ); danielebarchiesi@0: if ($extra['disabled']) { danielebarchiesi@0: $form['enable']['#disabled'] = TRUE; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: $form['enable'] = array( danielebarchiesi@0: '#markup' => theme('image', array('path' => 'misc/watchdog-error.png', 'alt' => $status_short, 'title' => $status_short)), danielebarchiesi@0: ); danielebarchiesi@0: $form['description']['#markup'] .= theme('system_modules_incompatible', array('message' => $status_long)); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Build operation links. danielebarchiesi@0: foreach (array('help', 'permissions', 'configure') as $key) { danielebarchiesi@0: $form['links'][$key] = (isset($extra['links'][$key]) ? $extra['links'][$key] : array()); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: return $form; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Display confirmation form for required modules. danielebarchiesi@0: * danielebarchiesi@0: * @param $modules danielebarchiesi@0: * Array of module file objects as returned from system_rebuild_module_data(). danielebarchiesi@0: * @param $storage danielebarchiesi@0: * The contents of $form_state['storage']; an array with two danielebarchiesi@0: * elements: the list of required modules and the list of status danielebarchiesi@0: * form field values from the previous screen. danielebarchiesi@0: * @ingroup forms danielebarchiesi@0: */ danielebarchiesi@0: function system_modules_confirm_form($modules, $storage) { danielebarchiesi@0: $items = array(); danielebarchiesi@0: danielebarchiesi@0: $form['validation_modules'] = array('#type' => 'value', '#value' => $modules); danielebarchiesi@0: $form['status']['#tree'] = TRUE; danielebarchiesi@0: danielebarchiesi@0: foreach ($storage['more_required'] as $info) { danielebarchiesi@0: $t_argument = array( danielebarchiesi@0: '@module' => $info['name'], danielebarchiesi@0: '@required' => implode(', ', $info['requires']), danielebarchiesi@0: ); danielebarchiesi@0: $items[] = format_plural(count($info['requires']), 'You must enable the @required module to install @module.', 'You must enable the @required modules to install @module.', $t_argument); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: foreach ($storage['missing_modules'] as $name => $info) { danielebarchiesi@0: $t_argument = array( danielebarchiesi@0: '@module' => $name, danielebarchiesi@0: '@depends' => implode(', ', $info['depends']), danielebarchiesi@0: ); danielebarchiesi@0: $items[] = format_plural(count($info['depends']), 'The @module module is missing, so the following module will be disabled: @depends.', 'The @module module is missing, so the following modules will be disabled: @depends.', $t_argument); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $form['text'] = array('#markup' => theme('item_list', array('items' => $items))); danielebarchiesi@0: danielebarchiesi@0: if ($form) { danielebarchiesi@0: // Set some default form values danielebarchiesi@0: $form = confirm_form( danielebarchiesi@0: $form, danielebarchiesi@0: t('Some required modules must be enabled'), danielebarchiesi@0: 'admin/modules', danielebarchiesi@0: t('Would you like to continue with the above?'), danielebarchiesi@0: t('Continue'), danielebarchiesi@0: t('Cancel')); danielebarchiesi@0: return $form; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Submit callback; handles modules form submission. danielebarchiesi@0: */ danielebarchiesi@0: function system_modules_submit($form, &$form_state) { danielebarchiesi@0: include_once DRUPAL_ROOT . '/includes/install.inc'; danielebarchiesi@0: danielebarchiesi@0: // Builds list of modules. danielebarchiesi@0: $modules = array(); danielebarchiesi@0: // If we're not coming from the confirmation form, build the list of modules. danielebarchiesi@0: if (empty($form_state['storage'])) { danielebarchiesi@0: // If we're not coming from the confirmation form, build the module list. danielebarchiesi@0: foreach ($form_state['values']['modules'] as $group_name => $group) { danielebarchiesi@0: foreach ($group as $module => $enabled) { danielebarchiesi@0: $modules[$module] = array('group' => $group_name, 'enabled' => $enabled['enable']); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: // If we are coming from the confirmation form, fetch danielebarchiesi@0: // the modules out of $form_state. danielebarchiesi@0: $modules = $form_state['storage']['modules']; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Collect data for all modules to be able to determine dependencies. danielebarchiesi@0: $files = system_rebuild_module_data(); danielebarchiesi@0: danielebarchiesi@0: // Sorts modules by weight. danielebarchiesi@0: $sort = array(); danielebarchiesi@0: foreach (array_keys($modules) as $module) { danielebarchiesi@0: $sort[$module] = $files[$module]->sort; danielebarchiesi@0: } danielebarchiesi@0: array_multisort($sort, $modules); danielebarchiesi@0: danielebarchiesi@0: // Makes sure all required modules are set to be enabled. danielebarchiesi@0: $more_required = array(); danielebarchiesi@0: $missing_modules = array(); danielebarchiesi@0: foreach ($modules as $name => $module) { danielebarchiesi@0: if ($module['enabled']) { danielebarchiesi@0: // Checks that all dependencies are set to be enabled. Stores the ones danielebarchiesi@0: // that are not in $dependencies variable so that the user can be alerted danielebarchiesi@0: // in the confirmation form that more modules need to be enabled. danielebarchiesi@0: $dependencies = array(); danielebarchiesi@0: foreach (array_keys($files[$name]->requires) as $required) { danielebarchiesi@0: if (empty($modules[$required]['enabled'])) { danielebarchiesi@0: if (isset($files[$required])) { danielebarchiesi@0: $dependencies[] = $files[$required]->info['name']; danielebarchiesi@0: $modules[$required]['enabled'] = TRUE; danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: $missing_modules[$required]['depends'][] = $name; danielebarchiesi@0: $modules[$name]['enabled'] = FALSE; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Stores additional modules that need to be enabled in $more_required. danielebarchiesi@0: if (!empty($dependencies)) { danielebarchiesi@0: $more_required[$name] = array( danielebarchiesi@0: 'name' => $files[$name]->info['name'], danielebarchiesi@0: 'requires' => $dependencies, danielebarchiesi@0: ); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Redirects to confirmation form if more modules need to be enabled. danielebarchiesi@0: if ((!empty($more_required) || !empty($missing_modules)) && !isset($form_state['values']['confirm'])) { danielebarchiesi@0: $form_state['storage'] = array( danielebarchiesi@0: 'more_required' => $more_required, danielebarchiesi@0: 'modules' => $modules, danielebarchiesi@0: 'missing_modules' => $missing_modules, danielebarchiesi@0: ); danielebarchiesi@0: $form_state['rebuild'] = TRUE; danielebarchiesi@0: return; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Invokes hook_requirements('install'). If failures are detected, makes sure danielebarchiesi@0: // the dependent modules aren't installed either. danielebarchiesi@0: foreach ($modules as $name => $module) { danielebarchiesi@0: // Only invoke hook_requirements() on modules that are going to be installed. danielebarchiesi@0: if ($module['enabled'] && drupal_get_installed_schema_version($name) == SCHEMA_UNINSTALLED) { danielebarchiesi@0: if (!drupal_check_module($name)) { danielebarchiesi@0: $modules[$name]['enabled'] = FALSE; danielebarchiesi@0: foreach (array_keys($files[$name]->required_by) as $required_by) { danielebarchiesi@0: $modules[$required_by]['enabled'] = FALSE; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Initializes array of actions. danielebarchiesi@0: $actions = array( danielebarchiesi@0: 'enable' => array(), danielebarchiesi@0: 'disable' => array(), danielebarchiesi@0: 'install' => array(), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: // Builds arrays of modules that need to be enabled, disabled, and installed. danielebarchiesi@0: foreach ($modules as $name => $module) { danielebarchiesi@0: if ($module['enabled']) { danielebarchiesi@0: if (drupal_get_installed_schema_version($name) == SCHEMA_UNINSTALLED) { danielebarchiesi@0: $actions['install'][] = $name; danielebarchiesi@0: $actions['enable'][] = $name; danielebarchiesi@0: } danielebarchiesi@0: elseif (!module_exists($name)) { danielebarchiesi@0: $actions['enable'][] = $name; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: elseif (module_exists($name)) { danielebarchiesi@0: $actions['disable'][] = $name; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Gets list of modules prior to install process, unsets $form_state['storage'] danielebarchiesi@0: // so we don't get redirected back to the confirmation form. danielebarchiesi@0: $pre_install_list = module_list(); danielebarchiesi@0: unset($form_state['storage']); danielebarchiesi@0: danielebarchiesi@0: // Reverse the 'enable' list, to order dependencies before dependents. danielebarchiesi@0: krsort($actions['enable']); danielebarchiesi@0: danielebarchiesi@0: // Installs, enables, and disables modules. danielebarchiesi@0: module_enable($actions['enable'], FALSE); danielebarchiesi@0: module_disable($actions['disable'], FALSE); danielebarchiesi@0: danielebarchiesi@0: // Gets module list after install process, flushes caches and displays a danielebarchiesi@0: // message if there are changes. danielebarchiesi@0: $post_install_list = module_list(TRUE); danielebarchiesi@0: if ($pre_install_list != $post_install_list) { danielebarchiesi@0: drupal_flush_all_caches(); danielebarchiesi@0: drupal_set_message(t('The configuration options have been saved.')); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $form_state['redirect'] = 'admin/modules'; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Uninstall functions danielebarchiesi@0: */ danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Builds a form of currently disabled modules. danielebarchiesi@0: * danielebarchiesi@0: * @ingroup forms danielebarchiesi@0: * @see system_modules_uninstall_validate() danielebarchiesi@0: * @see system_modules_uninstall_submit() danielebarchiesi@0: * @param $form_state['values'] danielebarchiesi@0: * Submitted form values. danielebarchiesi@0: * @return danielebarchiesi@0: * A form array representing the currently disabled modules. danielebarchiesi@0: */ danielebarchiesi@0: function system_modules_uninstall($form, $form_state = NULL) { danielebarchiesi@0: // Make sure the install API is available. danielebarchiesi@0: include_once DRUPAL_ROOT . '/includes/install.inc'; danielebarchiesi@0: danielebarchiesi@0: // Display the confirm form if any modules have been submitted. danielebarchiesi@0: if (!empty($form_state['storage']) && $confirm_form = system_modules_uninstall_confirm_form($form_state['storage'])) { danielebarchiesi@0: return $confirm_form; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Get a list of disabled, installed modules. danielebarchiesi@0: $all_modules = system_rebuild_module_data(); danielebarchiesi@0: $disabled_modules = array(); danielebarchiesi@0: foreach ($all_modules as $name => $module) { danielebarchiesi@0: if (empty($module->status) && $module->schema_version > SCHEMA_UNINSTALLED) { danielebarchiesi@0: $disabled_modules[$name] = $module; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Only build the rest of the form if there are any modules available to danielebarchiesi@0: // uninstall. danielebarchiesi@0: if (!empty($disabled_modules)) { danielebarchiesi@0: $profile = drupal_get_profile(); danielebarchiesi@0: uasort($disabled_modules, 'system_sort_modules_by_info_name'); danielebarchiesi@0: $form['uninstall'] = array('#tree' => TRUE); danielebarchiesi@0: foreach ($disabled_modules as $module) { danielebarchiesi@0: $module_name = $module->info['name'] ? $module->info['name'] : $module->name; danielebarchiesi@0: $form['modules'][$module->name]['#module_name'] = $module_name; danielebarchiesi@0: $form['modules'][$module->name]['name']['#markup'] = $module_name; danielebarchiesi@0: $form['modules'][$module->name]['description']['#markup'] = t($module->info['description']); danielebarchiesi@0: $form['uninstall'][$module->name] = array( danielebarchiesi@0: '#type' => 'checkbox', danielebarchiesi@0: '#title' => t('Uninstall @module module', array('@module' => $module_name)), danielebarchiesi@0: '#title_display' => 'invisible', danielebarchiesi@0: ); danielebarchiesi@0: // All modules which depend on this one must be uninstalled first, before danielebarchiesi@0: // we can allow this module to be uninstalled. (The installation profile danielebarchiesi@0: // is excluded from this list.) danielebarchiesi@0: foreach (array_keys($module->required_by) as $dependent) { danielebarchiesi@0: if ($dependent != $profile && drupal_get_installed_schema_version($dependent) != SCHEMA_UNINSTALLED) { danielebarchiesi@0: $dependent_name = isset($all_modules[$dependent]->info['name']) ? $all_modules[$dependent]->info['name'] : $dependent; danielebarchiesi@0: $form['modules'][$module->name]['#required_by'][] = $dependent_name; danielebarchiesi@0: $form['uninstall'][$module->name]['#disabled'] = TRUE; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: $form['actions'] = array('#type' => 'actions'); danielebarchiesi@0: $form['actions']['submit'] = array( danielebarchiesi@0: '#type' => 'submit', danielebarchiesi@0: '#value' => t('Uninstall'), danielebarchiesi@0: ); danielebarchiesi@0: $form['#action'] = url('admin/modules/uninstall/confirm'); danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: $form['modules'] = array(); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: return $form; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Confirm uninstall of selected modules. danielebarchiesi@0: * danielebarchiesi@0: * @ingroup forms danielebarchiesi@0: * @param $storage danielebarchiesi@0: * An associative array of modules selected to be uninstalled. danielebarchiesi@0: * @return danielebarchiesi@0: * A form array representing modules to confirm. danielebarchiesi@0: */ danielebarchiesi@0: function system_modules_uninstall_confirm_form($storage) { danielebarchiesi@0: // Nothing to build. danielebarchiesi@0: if (empty($storage)) { danielebarchiesi@0: return; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Construct the hidden form elements and list items. danielebarchiesi@0: foreach (array_filter($storage['uninstall']) as $module => $value) { danielebarchiesi@0: $info = drupal_parse_info_file(drupal_get_path('module', $module) . '/' . $module . '.info'); danielebarchiesi@0: $uninstall[] = $info['name']; danielebarchiesi@0: $form['uninstall'][$module] = array('#type' => 'hidden', danielebarchiesi@0: '#value' => 1, danielebarchiesi@0: ); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Display a confirm form if modules have been selected. danielebarchiesi@0: if (isset($uninstall)) { danielebarchiesi@0: $form['#confirmed'] = TRUE; danielebarchiesi@0: $form['uninstall']['#tree'] = TRUE; danielebarchiesi@0: $form['modules'] = array('#markup' => '
' . t('The following modules will be completely uninstalled from your site, and all data from these modules will be lost!') . '
' . theme('item_list', array('items' => $uninstall))); danielebarchiesi@0: $form = confirm_form( danielebarchiesi@0: $form, danielebarchiesi@0: t('Confirm uninstall'), danielebarchiesi@0: 'admin/modules/uninstall', danielebarchiesi@0: t('Would you like to continue with uninstalling the above?'), danielebarchiesi@0: t('Uninstall'), danielebarchiesi@0: t('Cancel')); danielebarchiesi@0: return $form; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Validates the submitted uninstall form. danielebarchiesi@0: */ danielebarchiesi@0: function system_modules_uninstall_validate($form, &$form_state) { danielebarchiesi@0: // Form submitted, but no modules selected. danielebarchiesi@0: if (!count(array_filter($form_state['values']['uninstall']))) { danielebarchiesi@0: drupal_set_message(t('No modules selected.'), 'error'); danielebarchiesi@0: drupal_goto('admin/modules/uninstall'); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Processes the submitted uninstall form. danielebarchiesi@0: */ danielebarchiesi@0: function system_modules_uninstall_submit($form, &$form_state) { danielebarchiesi@0: // Make sure the install API is available. danielebarchiesi@0: include_once DRUPAL_ROOT . '/includes/install.inc'; danielebarchiesi@0: danielebarchiesi@0: if (!empty($form['#confirmed'])) { danielebarchiesi@0: // Call the uninstall routine for each selected module. danielebarchiesi@0: $modules = array_keys($form_state['values']['uninstall']); danielebarchiesi@0: drupal_uninstall_modules($modules); danielebarchiesi@0: drupal_set_message(t('The selected modules have been uninstalled.')); danielebarchiesi@0: danielebarchiesi@0: $form_state['redirect'] = 'admin/modules/uninstall'; danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: $form_state['storage'] = $form_state['values']; danielebarchiesi@0: $form_state['rebuild'] = TRUE; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Menu callback. Display blocked IP addresses. danielebarchiesi@0: * danielebarchiesi@0: * @param $default_ip danielebarchiesi@0: * Optional IP address to be passed on to drupal_get_form() for danielebarchiesi@0: * use as the default value of the IP address form field. danielebarchiesi@0: */ danielebarchiesi@0: function system_ip_blocking($default_ip = '') { danielebarchiesi@0: $rows = array(); danielebarchiesi@0: $header = array(t('Blocked IP addresses'), t('Operations')); danielebarchiesi@0: $result = db_query('SELECT * FROM {blocked_ips}'); danielebarchiesi@0: foreach ($result as $ip) { danielebarchiesi@0: $rows[] = array( danielebarchiesi@0: $ip->ip, danielebarchiesi@0: l(t('delete'), "admin/config/people/ip-blocking/delete/$ip->iid"), danielebarchiesi@0: ); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $build['system_ip_blocking_form'] = drupal_get_form('system_ip_blocking_form', $default_ip); danielebarchiesi@0: danielebarchiesi@0: $build['system_ip_blocking_table'] = array( danielebarchiesi@0: '#theme' => 'table', danielebarchiesi@0: '#header' => $header, danielebarchiesi@0: '#rows' => $rows, danielebarchiesi@0: '#empty' => t('No blocked IP addresses available.'), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: return $build; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Define the form for blocking IP addresses. danielebarchiesi@0: * danielebarchiesi@0: * @ingroup forms danielebarchiesi@0: * @see system_ip_blocking_form_validate() danielebarchiesi@0: * @see system_ip_blocking_form_submit() danielebarchiesi@0: */ danielebarchiesi@0: function system_ip_blocking_form($form, $form_state, $default_ip) { danielebarchiesi@0: $form['ip'] = array( danielebarchiesi@0: '#title' => t('IP address'), danielebarchiesi@0: '#type' => 'textfield', danielebarchiesi@0: '#size' => 48, danielebarchiesi@0: '#maxlength' => 40, danielebarchiesi@0: '#default_value' => $default_ip, danielebarchiesi@0: '#description' => t('Enter a valid IP address.'), danielebarchiesi@0: ); danielebarchiesi@0: $form['actions'] = array('#type' => 'actions'); danielebarchiesi@0: $form['actions']['submit'] = array( danielebarchiesi@0: '#type' => 'submit', danielebarchiesi@0: '#value' => t('Add'), danielebarchiesi@0: ); danielebarchiesi@0: $form['#submit'][] = 'system_ip_blocking_form_submit'; danielebarchiesi@0: $form['#validate'][] = 'system_ip_blocking_form_validate'; danielebarchiesi@0: return $form; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: function system_ip_blocking_form_validate($form, &$form_state) { danielebarchiesi@0: $ip = trim($form_state['values']['ip']); danielebarchiesi@0: if (db_query("SELECT * FROM {blocked_ips} WHERE ip = :ip", array(':ip' => $ip))->fetchField()) { danielebarchiesi@0: form_set_error('ip', t('This IP address is already blocked.')); danielebarchiesi@0: } danielebarchiesi@0: elseif ($ip == ip_address()) { danielebarchiesi@0: form_set_error('ip', t('You may not block your own IP address.')); danielebarchiesi@0: } danielebarchiesi@0: elseif (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE) == FALSE) { danielebarchiesi@0: form_set_error('ip', t('Enter a valid IP address.')); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: function system_ip_blocking_form_submit($form, &$form_state) { danielebarchiesi@0: $ip = trim($form_state['values']['ip']); danielebarchiesi@0: db_insert('blocked_ips') danielebarchiesi@0: ->fields(array('ip' => $ip)) danielebarchiesi@0: ->execute(); danielebarchiesi@0: drupal_set_message(t('The IP address %ip has been blocked.', array('%ip' => $ip))); danielebarchiesi@0: $form_state['redirect'] = 'admin/config/people/ip-blocking'; danielebarchiesi@0: return; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * IP deletion confirm page. danielebarchiesi@0: * danielebarchiesi@0: * @see system_ip_blocking_delete_submit() danielebarchiesi@0: */ danielebarchiesi@0: function system_ip_blocking_delete($form, &$form_state, $iid) { danielebarchiesi@0: $form['blocked_ip'] = array( danielebarchiesi@0: '#type' => 'value', danielebarchiesi@0: '#value' => $iid, danielebarchiesi@0: ); danielebarchiesi@0: return confirm_form($form, t('Are you sure you want to delete %ip?', array('%ip' => $iid['ip'])), 'admin/config/people/ip-blocking', t('This action cannot be undone.'), t('Delete'), t('Cancel')); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Process system_ip_blocking_delete form submissions. danielebarchiesi@0: */ danielebarchiesi@0: function system_ip_blocking_delete_submit($form, &$form_state) { danielebarchiesi@0: $blocked_ip = $form_state['values']['blocked_ip']; danielebarchiesi@0: db_delete('blocked_ips') danielebarchiesi@0: ->condition('iid', $blocked_ip['iid']) danielebarchiesi@0: ->execute(); danielebarchiesi@0: watchdog('user', 'Deleted %ip', array('%ip' => $blocked_ip['ip'])); danielebarchiesi@0: drupal_set_message(t('The IP address %ip was deleted.', array('%ip' => $blocked_ip['ip']))); danielebarchiesi@0: $form_state['redirect'] = 'admin/config/people/ip-blocking'; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Form builder; The general site information form. danielebarchiesi@0: * danielebarchiesi@0: * @ingroup forms danielebarchiesi@0: * @see system_settings_form() danielebarchiesi@0: */ danielebarchiesi@0: function system_site_information_settings() { danielebarchiesi@0: $form['site_information'] = array( danielebarchiesi@0: '#type' => 'fieldset', danielebarchiesi@0: '#title' => t('Site details'), danielebarchiesi@0: ); danielebarchiesi@0: $form['site_information']['site_name'] = array( danielebarchiesi@0: '#type' => 'textfield', danielebarchiesi@0: '#title' => t('Site name'), danielebarchiesi@0: '#default_value' => variable_get('site_name', 'Drupal'), danielebarchiesi@0: '#required' => TRUE danielebarchiesi@0: ); danielebarchiesi@0: $form['site_information']['site_slogan'] = array( danielebarchiesi@0: '#type' => 'textfield', danielebarchiesi@0: '#title' => t('Slogan'), danielebarchiesi@0: '#default_value' => variable_get('site_slogan', ''), danielebarchiesi@0: '#description' => t("How this is used depends on your site's theme."), danielebarchiesi@0: ); danielebarchiesi@0: $form['site_information']['site_mail'] = array( danielebarchiesi@0: '#type' => 'textfield', danielebarchiesi@0: '#title' => t('E-mail address'), danielebarchiesi@0: '#default_value' => variable_get('site_mail', ini_get('sendmail_from')), danielebarchiesi@0: '#description' => t("The From address in automated e-mails sent during registration and new password requests, and other notifications. (Use an address ending in your site's domain to help prevent this e-mail being flagged as spam.)"), danielebarchiesi@0: '#required' => TRUE, danielebarchiesi@0: ); danielebarchiesi@0: $form['front_page'] = array( danielebarchiesi@0: '#type' => 'fieldset', danielebarchiesi@0: '#title' => t('Front page'), danielebarchiesi@0: ); danielebarchiesi@0: $form['front_page']['default_nodes_main'] = array( danielebarchiesi@0: '#type' => 'select', '#title' => t('Number of posts on front page'), danielebarchiesi@0: '#default_value' => variable_get('default_nodes_main', 10), danielebarchiesi@0: '#options' => drupal_map_assoc(array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30)), danielebarchiesi@0: '#description' => t('The maximum number of posts displayed on overview pages such as the front page.') danielebarchiesi@0: ); danielebarchiesi@0: $form['front_page']['site_frontpage'] = array( danielebarchiesi@0: '#type' => 'textfield', danielebarchiesi@0: '#title' => t('Default front page'), danielebarchiesi@0: '#default_value' => (variable_get('site_frontpage')!='node'?drupal_get_path_alias(variable_get('site_frontpage', 'node')):''), danielebarchiesi@0: '#size' => 40, danielebarchiesi@0: '#description' => t('Optionally, specify a relative URL to display as the front page. Leave blank to display the default content feed.'), danielebarchiesi@0: '#field_prefix' => url(NULL, array('absolute' => TRUE)) . (variable_get('clean_url', 0) ? '' : '?q='), danielebarchiesi@0: ); danielebarchiesi@0: $form['error_page'] = array( danielebarchiesi@0: '#type' => 'fieldset', danielebarchiesi@0: '#title' => t('Error pages'), danielebarchiesi@0: ); danielebarchiesi@0: $form['error_page']['site_403'] = array( danielebarchiesi@0: '#type' => 'textfield', danielebarchiesi@0: '#title' => t('Default 403 (access denied) page'), danielebarchiesi@0: '#default_value' => variable_get('site_403', ''), danielebarchiesi@0: '#size' => 40, danielebarchiesi@0: '#description' => t('This page is displayed when the requested document is denied to the current user. Leave blank to display a generic "access denied" page.'), danielebarchiesi@0: '#field_prefix' => url(NULL, array('absolute' => TRUE)) . (variable_get('clean_url', 0) ? '' : '?q=') danielebarchiesi@0: ); danielebarchiesi@0: $form['error_page']['site_404'] = array( danielebarchiesi@0: '#type' => 'textfield', danielebarchiesi@0: '#title' => t('Default 404 (not found) page'), danielebarchiesi@0: '#default_value' => variable_get('site_404', ''), danielebarchiesi@0: '#size' => 40, danielebarchiesi@0: '#description' => t('This page is displayed when no other content matches the requested document. Leave blank to display a generic "page not found" page.'), danielebarchiesi@0: '#field_prefix' => url(NULL, array('absolute' => TRUE)) . (variable_get('clean_url', 0) ? '' : '?q=') danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $form['#validate'][] = 'system_site_information_settings_validate'; danielebarchiesi@0: danielebarchiesi@0: return system_settings_form($form); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Validates the submitted site-information form. danielebarchiesi@0: */ danielebarchiesi@0: function system_site_information_settings_validate($form, &$form_state) { danielebarchiesi@0: // Validate the e-mail address. danielebarchiesi@0: if ($error = user_validate_mail($form_state['values']['site_mail'])) { danielebarchiesi@0: form_set_error('site_mail', $error); danielebarchiesi@0: } danielebarchiesi@0: // Check for empty front page path. danielebarchiesi@0: if (empty($form_state['values']['site_frontpage'])) { danielebarchiesi@0: // Set to default "node". danielebarchiesi@0: form_set_value($form['front_page']['site_frontpage'], 'node', $form_state); danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: // Get the normal path of the front page. danielebarchiesi@0: form_set_value($form['front_page']['site_frontpage'], drupal_get_normal_path($form_state['values']['site_frontpage']), $form_state); danielebarchiesi@0: } danielebarchiesi@0: // Validate front page path. danielebarchiesi@0: if (!drupal_valid_path($form_state['values']['site_frontpage'])) { danielebarchiesi@0: form_set_error('site_frontpage', t("The path '%path' is either invalid or you do not have access to it.", array('%path' => $form_state['values']['site_frontpage']))); danielebarchiesi@0: } danielebarchiesi@0: // Get the normal paths of both error pages. danielebarchiesi@0: if (!empty($form_state['values']['site_403'])) { danielebarchiesi@0: form_set_value($form['error_page']['site_403'], drupal_get_normal_path($form_state['values']['site_403']), $form_state); danielebarchiesi@0: } danielebarchiesi@0: if (!empty($form_state['values']['site_404'])) { danielebarchiesi@0: form_set_value($form['error_page']['site_404'], drupal_get_normal_path($form_state['values']['site_404']), $form_state); danielebarchiesi@0: } danielebarchiesi@0: // Validate 403 error path. danielebarchiesi@0: if (!empty($form_state['values']['site_403']) && !drupal_valid_path($form_state['values']['site_403'])) { danielebarchiesi@0: form_set_error('site_403', t("The path '%path' is either invalid or you do not have access to it.", array('%path' => $form_state['values']['site_403']))); danielebarchiesi@0: } danielebarchiesi@0: // Validate 404 error path. danielebarchiesi@0: if (!empty($form_state['values']['site_404']) && !drupal_valid_path($form_state['values']['site_404'])) { danielebarchiesi@0: form_set_error('site_404', t("The path '%path' is either invalid or you do not have access to it.", array('%path' => $form_state['values']['site_404']))); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Form builder; Cron form. danielebarchiesi@0: * danielebarchiesi@0: * @see system_settings_form() danielebarchiesi@0: * @ingroup forms danielebarchiesi@0: */ danielebarchiesi@0: function system_cron_settings() { danielebarchiesi@0: global $base_url; danielebarchiesi@0: $form['description'] = array( danielebarchiesi@0: '#markup' => '' . t('Cron takes care of running periodic tasks like checking for updates and indexing content for search.') . '
', danielebarchiesi@0: ); danielebarchiesi@0: $form['run'] = array( danielebarchiesi@0: '#type' => 'submit', danielebarchiesi@0: '#value' => t('Run cron'), danielebarchiesi@0: '#submit' => array('system_run_cron_submit'), danielebarchiesi@0: ); danielebarchiesi@0: $status = '' . t('Last run: %cron-last ago.', array('%cron-last' => format_interval(REQUEST_TIME - variable_get('cron_last')),)) . '
'; danielebarchiesi@0: $form['status'] = array( danielebarchiesi@0: '#markup' => $status, danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $form['cron_url'] = array( danielebarchiesi@0: '#markup' => '' . t('To run cron from outside the site, go to !cron', array('!cron' => url($base_url . '/cron.php', array('external' => TRUE, 'query' => array('cron_key' => variable_get('cron_key', 'drupal')))))) . '
', danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $form['cron'] = array( danielebarchiesi@0: '#type' => 'fieldset', danielebarchiesi@0: ); danielebarchiesi@0: $form['cron']['cron_safe_threshold'] = array( danielebarchiesi@0: '#type' => 'select', danielebarchiesi@0: '#title' => t('Run cron every'), danielebarchiesi@0: '#default_value' => variable_get('cron_safe_threshold', DRUPAL_CRON_DEFAULT_THRESHOLD), danielebarchiesi@0: '#options' => array(0 => t('Never')) + drupal_map_assoc(array(3600, 10800, 21600, 43200, 86400, 604800), 'format_interval'), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: return system_settings_form($form); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Submit callback; run cron. danielebarchiesi@0: * danielebarchiesi@0: * @ingroup forms danielebarchiesi@0: */ danielebarchiesi@0: function system_run_cron_submit($form, &$form_state) { danielebarchiesi@0: // Run cron manually from Cron form. danielebarchiesi@0: if (drupal_cron_run()) { danielebarchiesi@0: drupal_set_message(t('Cron run successfully.')); danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: drupal_set_message(t('Cron run failed.'), 'error'); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: drupal_goto('admin/config/system/cron'); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Form builder; Configure error reporting settings. danielebarchiesi@0: * danielebarchiesi@0: * @ingroup forms danielebarchiesi@0: * @see system_settings_form() danielebarchiesi@0: */ danielebarchiesi@0: function system_logging_settings() { danielebarchiesi@0: $form['error_level'] = array( danielebarchiesi@0: '#type' => 'radios', danielebarchiesi@0: '#title' => t('Error messages to display'), danielebarchiesi@0: '#default_value' => variable_get('error_level', ERROR_REPORTING_DISPLAY_ALL), danielebarchiesi@0: '#options' => array( danielebarchiesi@0: ERROR_REPORTING_HIDE => t('None'), danielebarchiesi@0: ERROR_REPORTING_DISPLAY_SOME => t('Errors and warnings'), danielebarchiesi@0: ERROR_REPORTING_DISPLAY_ALL => t('All messages'), danielebarchiesi@0: ), danielebarchiesi@0: '#description' => t('It is recommended that sites running on production environments do not display any errors.'), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: return system_settings_form($form); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Form builder; Configure site performance settings. danielebarchiesi@0: * danielebarchiesi@0: * @ingroup forms danielebarchiesi@0: * @see system_settings_form() danielebarchiesi@0: */ danielebarchiesi@0: function system_performance_settings() { danielebarchiesi@0: drupal_add_js(drupal_get_path('module', 'system') . '/system.js'); danielebarchiesi@0: danielebarchiesi@0: $form['clear_cache'] = array( danielebarchiesi@0: '#type' => 'fieldset', danielebarchiesi@0: '#title' => t('Clear cache'), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $form['clear_cache']['clear'] = array( danielebarchiesi@0: '#type' => 'submit', danielebarchiesi@0: '#value' => t('Clear all caches'), danielebarchiesi@0: '#submit' => array('system_clear_cache_submit'), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $form['caching'] = array( danielebarchiesi@0: '#type' => 'fieldset', danielebarchiesi@0: '#title' => t('Caching'), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $cache = variable_get('cache', 0); danielebarchiesi@0: $form['caching']['cache'] = array( danielebarchiesi@0: '#type' => 'checkbox', danielebarchiesi@0: '#title' => t('Cache pages for anonymous users'), danielebarchiesi@0: '#default_value' => $cache, danielebarchiesi@0: '#weight' => -2, danielebarchiesi@0: ); danielebarchiesi@0: $period = drupal_map_assoc(array(0, 60, 180, 300, 600, 900, 1800, 2700, 3600, 10800, 21600, 32400, 43200, 86400), 'format_interval'); danielebarchiesi@0: $period[0] = '<' . t('none') . '>'; danielebarchiesi@0: $form['caching']['cache_lifetime'] = array( danielebarchiesi@0: '#type' => 'select', danielebarchiesi@0: '#title' => t('Minimum cache lifetime'), danielebarchiesi@0: '#default_value' => variable_get('cache_lifetime', 0), danielebarchiesi@0: '#options' => $period, danielebarchiesi@0: '#description' => t('Cached pages will not be re-created until at least this much time has elapsed.') danielebarchiesi@0: ); danielebarchiesi@0: $form['caching']['page_cache_maximum_age'] = array( danielebarchiesi@0: '#type' => 'select', danielebarchiesi@0: '#title' => t('Expiration of cached pages'), danielebarchiesi@0: '#default_value' => variable_get('page_cache_maximum_age', 0), danielebarchiesi@0: '#options' => $period, danielebarchiesi@0: '#description' => t('The maximum time an external cache can use an old version of a page.') danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $directory = 'public://'; danielebarchiesi@0: $is_writable = is_dir($directory) && is_writable($directory); danielebarchiesi@0: $disabled = !$is_writable; danielebarchiesi@0: $disabled_message = ''; danielebarchiesi@0: if (!$is_writable) { danielebarchiesi@0: $disabled_message = ' ' . t('Set up the public files directory to make these optimizations available.', array('!file-system' => url('admin/config/media/file-system'))); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $form['bandwidth_optimization'] = array( danielebarchiesi@0: '#type' => 'fieldset', danielebarchiesi@0: '#title' => t('Bandwidth optimization'), danielebarchiesi@0: '#description' => t('External resources can be optimized automatically, which can reduce both the size and number of requests made to your website.') . $disabled_message, danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $js_hide = $cache ? '' : ' class="js-hide"'; danielebarchiesi@0: $form['bandwidth_optimization']['page_compression'] = array( danielebarchiesi@0: '#type' => 'checkbox', danielebarchiesi@0: '#title' => t('Compress cached pages.'), danielebarchiesi@0: '#default_value' => variable_get('page_compression', TRUE), danielebarchiesi@0: '#prefix' => 'example.com/user
instead of example.com/?q=user
.'),
danielebarchiesi@0: );
danielebarchiesi@0: $form = system_settings_form($form);
danielebarchiesi@0: if ($conflict) {
danielebarchiesi@0: // $form_state['redirect'] needs to be set to the non-clean URL,
danielebarchiesi@0: // otherwise the setting is not saved.
danielebarchiesi@0: $form_state['redirect'] = url('', array('query' => array('q' => '/admin/config/search/clean-urls')));
danielebarchiesi@0: }
danielebarchiesi@0: }
danielebarchiesi@0: // Show the clean URLs test form.
danielebarchiesi@0: else {
danielebarchiesi@0: drupal_add_js(drupal_get_path('module', 'system') . '/system.js');
danielebarchiesi@0:
danielebarchiesi@0: $form_state['redirect'] = url('admin/config/search/clean-urls');
danielebarchiesi@0: $form['clean_url_description'] = array(
danielebarchiesi@0: '#type' => 'markup',
danielebarchiesi@0: '#markup' => '' . t('Use URLs like example.com/user
instead of example.com/?q=user
.'),
danielebarchiesi@0: );
danielebarchiesi@0: // Explain why the user is seeing this page and what to expect after
danielebarchiesi@0: // clicking the 'Run the clean URL test' button.
danielebarchiesi@0: $form['clean_url_test_result'] = array(
danielebarchiesi@0: '#type' => 'markup',
danielebarchiesi@0: '#markup' => '
' . t('Clean URLs cannot be enabled. If you are directed to this page or to a Page not found (404) error after testing for clean URLs, see the online handbook.', array('@handbook' => 'http://drupal.org/node/15365')) . '
', danielebarchiesi@0: ); danielebarchiesi@0: $form['actions'] = array( danielebarchiesi@0: '#type' => 'actions', danielebarchiesi@0: 'clean_url_test' => array( danielebarchiesi@0: '#type' => 'submit', danielebarchiesi@0: '#value' => t('Run the clean URL test'), danielebarchiesi@0: ), danielebarchiesi@0: ); danielebarchiesi@0: $form['clean_url_test_execute'] = array( danielebarchiesi@0: '#type' => 'hidden', danielebarchiesi@0: '#value' => 1, danielebarchiesi@0: ); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: return $form; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Menu callback: displays the site status report. Can also be used as a pure check. danielebarchiesi@0: * danielebarchiesi@0: * @param $check danielebarchiesi@0: * If true, only returns a boolean whether there are system status errors. danielebarchiesi@0: */ danielebarchiesi@0: function system_status($check = FALSE) { danielebarchiesi@0: // Load .install files danielebarchiesi@0: include_once DRUPAL_ROOT . '/includes/install.inc'; danielebarchiesi@0: drupal_load_updates(); danielebarchiesi@0: danielebarchiesi@0: // Check run-time requirements and status information. danielebarchiesi@0: $requirements = module_invoke_all('requirements', 'runtime'); danielebarchiesi@0: usort($requirements, '_system_sort_requirements'); danielebarchiesi@0: danielebarchiesi@0: if ($check) { danielebarchiesi@0: return drupal_requirements_severity($requirements) == REQUIREMENT_ERROR; danielebarchiesi@0: } danielebarchiesi@0: // MySQL import might have set the uid of the anonymous user to autoincrement danielebarchiesi@0: // value. Let's try fixing it. See http://drupal.org/node/204411 danielebarchiesi@0: db_update('users') danielebarchiesi@0: ->expression('uid', 'uid - uid') danielebarchiesi@0: ->condition('name', '') danielebarchiesi@0: ->condition('pass', '') danielebarchiesi@0: ->condition('status', 0) danielebarchiesi@0: ->execute(); danielebarchiesi@0: return theme('status_report', array('requirements' => $requirements)); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Menu callback: run cron manually. danielebarchiesi@0: */ danielebarchiesi@0: function system_run_cron() { danielebarchiesi@0: // Run cron manually danielebarchiesi@0: if (drupal_cron_run()) { danielebarchiesi@0: drupal_set_message(t('Cron ran successfully.')); danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: drupal_set_message(t('Cron run failed.'), 'error'); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: drupal_goto('admin/reports/status'); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Menu callback: return information about PHP. danielebarchiesi@0: */ danielebarchiesi@0: function system_php() { danielebarchiesi@0: phpinfo(); danielebarchiesi@0: drupal_exit(); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Default page callback for batches. danielebarchiesi@0: */ danielebarchiesi@0: function system_batch_page() { danielebarchiesi@0: require_once DRUPAL_ROOT . '/includes/batch.inc'; danielebarchiesi@0: $output = _batch_page(); danielebarchiesi@0: danielebarchiesi@0: if ($output === FALSE) { danielebarchiesi@0: drupal_access_denied(); danielebarchiesi@0: } danielebarchiesi@0: elseif (isset($output)) { danielebarchiesi@0: // Force a page without blocks or messages to danielebarchiesi@0: // display a list of collected messages later. danielebarchiesi@0: drupal_set_page_content($output); danielebarchiesi@0: $page = element_info('page'); danielebarchiesi@0: $page['#show_messages'] = FALSE; danielebarchiesi@0: return $page; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Returns HTML for an administrative block for display. danielebarchiesi@0: * danielebarchiesi@0: * @param $variables danielebarchiesi@0: * An associative array containing: danielebarchiesi@0: * - block: An array containing information about the block: danielebarchiesi@0: * - show: A Boolean whether to output the block. Defaults to FALSE. danielebarchiesi@0: * - title: The block's title. danielebarchiesi@0: * - content: (optional) Formatted content for the block. danielebarchiesi@0: * - description: (optional) Description of the block. Only output if danielebarchiesi@0: * 'content' is not set. danielebarchiesi@0: * danielebarchiesi@0: * @ingroup themeable danielebarchiesi@0: */ danielebarchiesi@0: function theme_admin_block($variables) { danielebarchiesi@0: $block = $variables['block']; danielebarchiesi@0: $output = ''; danielebarchiesi@0: danielebarchiesi@0: // Don't display the block if it has no content to display. danielebarchiesi@0: if (empty($block['show'])) { danielebarchiesi@0: return $output; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $output .= '' . $severity['icon'] . ' | ' . $requirement['title'] . ' | ' . $requirement['value'] . ' |
' . $requirement['description'] . ' | ||
' . $severity['icon'] . ' | ' . $requirement['title'] . ' | ' . $requirement['value'] . ' |