2007-11-30 12:19:10 +00:00
< ? php
// $Id$
/**
* @ file
* Theming for maintenance pages .
*/
/**
* Sets up the theming system for site installs , updates and when the site is
2009-04-19 19:10:08 +00:00
* in maintenance mode . It also applies when the database is unavailable .
2007-11-30 12:19:10 +00:00
*
* Minnelli is always used for the initial install and update operations . In
* other cases , " settings.php " must have a " maintenance_theme " key set for the
* $conf variable in order to change the maintenance theme .
*/
function _drupal_maintenance_theme () {
global $theme , $theme_key ;
// If $theme is already set, assume the others are set too, and do nothing.
if ( isset ( $theme )) {
return ;
}
2008-09-20 20:22:25 +00:00
require_once DRUPAL_ROOT . '/includes/path.inc' ;
require_once DRUPAL_ROOT . '/includes/theme.inc' ;
require_once DRUPAL_ROOT . '/includes/common.inc' ;
require_once DRUPAL_ROOT . '/includes/unicode.inc' ;
require_once DRUPAL_ROOT . '/includes/file.inc' ;
require_once DRUPAL_ROOT . '/includes/module.inc' ;
require_once DRUPAL_ROOT . '/includes/database/database.inc' ;
2007-11-30 12:19:10 +00:00
unicode_check ();
// Install and update pages are treated differently to prevent theming overrides.
if ( defined ( 'MAINTENANCE_MODE' ) && ( MAINTENANCE_MODE == 'install' || MAINTENANCE_MODE == 'update' )) {
$theme = 'minnelli' ;
}
else {
2007-11-30 23:09:14 +00:00
// Load module basics (needed for hook invokes).
$module_list [ 'system' ][ 'filename' ] = 'modules/system/system.module' ;
$module_list [ 'filter' ][ 'filename' ] = 'modules/filter/filter.module' ;
2008-11-24 10:41:40 +00:00
module_list ( TRUE , FALSE , $module_list );
2007-11-30 23:09:14 +00:00
drupal_load ( 'module' , 'system' );
drupal_load ( 'module' , 'filter' );
2007-11-30 12:19:10 +00:00
$theme = variable_get ( 'maintenance_theme' , 'minnelli' );
}
2007-11-30 23:09:14 +00:00
$themes = list_themes ();
2007-11-30 12:19:10 +00:00
// Store the identifier for retrieving theme settings with.
$theme_key = $theme ;
// Find all our ancestor themes and put them in an array.
$base_theme = array ();
$ancestor = $theme ;
while ( $ancestor && isset ( $themes [ $ancestor ] -> base_theme )) {
$base_theme [] = $new_base_theme = $themes [ $themes [ $ancestor ] -> base_theme ];
$ancestor = $themes [ $ancestor ] -> base_theme ;
}
_init_theme ( $themes [ $theme ], array_reverse ( $base_theme ), '_theme_load_offline_registry' );
// These are usually added from system_init() -except maintenance.css.
// When the database is inactive it's not called so we add it here.
2008-10-26 18:06:39 +00:00
drupal_add_css ( drupal_get_path ( 'module' , 'system' ) . '/defaults.css' );
drupal_add_css ( drupal_get_path ( 'module' , 'system' ) . '/system.css' );
drupal_add_css ( drupal_get_path ( 'module' , 'system' ) . '/system-menus.css' );
drupal_add_css ( drupal_get_path ( 'module' , 'system' ) . '/maintenance.css' );
drupal_add_css ( drupal_get_path ( 'module' , 'system' ) . '/admin.css' );
2007-11-30 12:19:10 +00:00
}
/**
* This builds the registry when the site needs to bypass any database calls .
*/
function _theme_load_offline_registry ( $theme , $base_theme = NULL , $theme_engine = NULL ) {
$registry = _theme_build_registry ( $theme , $base_theme , $theme_engine );
_theme_set_registry ( $registry );
}
/**
* Return a themed list of maintenance tasks to perform .
2007-12-08 14:06:23 +00:00
*
2007-12-06 09:58:34 +00:00
* @ ingroup themeable
2007-11-30 12:19:10 +00:00
*/
function theme_task_list ( $items , $active = NULL ) {
$done = isset ( $items [ $active ]) || $active == NULL ;
$output = '<ol class="task-list">' ;
foreach ( $items as $k => $item ) {
if ( $active == $k ) {
$class = 'active' ;
2008-09-19 07:53:59 +00:00
$done = FALSE ;
2007-11-30 12:19:10 +00:00
}
else {
$class = $done ? 'done' : '' ;
}
2008-04-14 17:48:46 +00:00
$output .= '<li class="' . $class . '">' . $item . '</li>' ;
2007-11-30 12:19:10 +00:00
}
$output .= '</ol>' ;
return $output ;
}
/**
* Generate a themed installation page .
*
* Note : this function is not themeable .
*
* @ param $content
* The page content to show .
*/
function theme_install_page ( $content ) {
2009-04-22 09:45:03 +00:00
drupal_set_header ( 'Content-Type' , 'text/html; charset=utf-8' );
2007-11-30 12:19:10 +00:00
// Assign content.
$variables [ 'content' ] = $content ;
// Delay setting the message variable so it can be processed below.
$variables [ 'show_messages' ] = FALSE ;
2009-05-28 16:44:07 +00:00
// Variable processors invoked manually since this function and theme_update_page()
// are exceptions in how it works within the theme system.
template_preprocess ( $variables , 'install_page' );
2007-11-30 12:19:10 +00:00
template_preprocess_maintenance_page ( $variables );
2009-05-28 16:44:07 +00:00
template_process ( $variables , 'install_page' );
2007-11-30 12:19:10 +00:00
// Special handling of error messages
$messages = drupal_set_message ();
if ( isset ( $messages [ 'error' ])) {
$title = count ( $messages [ 'error' ]) > 1 ? st ( 'The following errors must be resolved before you can continue the installation process' ) : st ( 'The following error must be resolved before you can continue the installation process' );
2008-04-14 17:48:46 +00:00
$variables [ 'messages' ] .= '<h3>' . $title . ':</h3>' ;
2007-11-30 12:19:10 +00:00
$variables [ 'messages' ] .= theme ( 'status_messages' , 'error' );
2008-04-14 17:48:46 +00:00
$variables [ 'content' ] .= '<p>' . st ( 'Please check the error messages and <a href="!url">try again</a>.' , array ( '!url' => request_uri ())) . '</p>' ;
2007-11-30 12:19:10 +00:00
}
2008-02-06 19:38:28 +00:00
2008-01-04 17:19:04 +00:00
// Special handling of warning messages
if ( isset ( $messages [ 'warning' ])) {
2008-01-07 15:31:50 +00:00
$title = count ( $messages [ 'warning' ]) > 1 ? st ( 'The following installation warnings should be carefully reviewed' ) : st ( 'The following installation warning should be carefully reviewed' );
2008-04-14 17:48:46 +00:00
$variables [ 'messages' ] .= '<h4>' . $title . ':</h4>' ;
2008-01-04 17:19:04 +00:00
$variables [ 'messages' ] .= theme ( 'status_messages' , 'warning' );
}
2007-11-30 12:19:10 +00:00
// Special handling of status messages
if ( isset ( $messages [ 'status' ])) {
2007-12-08 15:15:25 +00:00
$title = count ( $messages [ 'status' ]) > 1 ? st ( 'The following installation warnings should be carefully reviewed, but in most cases may be safely ignored' ) : st ( 'The following installation warning should be carefully reviewed, but in most cases may be safely ignored' );
2008-04-14 17:48:46 +00:00
$variables [ 'messages' ] .= '<h4>' . $title . ':</h4>' ;
2007-11-30 12:19:10 +00:00
$variables [ 'messages' ] .= theme ( 'status_messages' , 'status' );
}
2008-01-16 10:47:17 +00:00
// This was called as a theme hook (not template), so we need to
// fix path_to_theme() for the template, to point at the actual
// theme rather than system module as owner of the hook.
global $theme_path ;
$theme_path = 'themes/garland' ;
2007-11-30 12:19:10 +00:00
return theme_render_template ( 'themes/garland/maintenance-page.tpl.php' , $variables );
}
/**
* Generate a themed update page .
*
* Note : this function is not themeable .
*
* @ param $content
* The page content to show .
* @ param $show_messages
* Whether to output status and error messages .
* FALSE can be useful to postpone the messages to a subsequent page .
*/
function theme_update_page ( $content , $show_messages = TRUE ) {
// Set required headers.
2009-04-22 09:45:03 +00:00
drupal_set_header ( 'Content-Type' , 'text/html; charset=utf-8' );
2007-11-30 12:19:10 +00:00
// Assign content and show message flag.
$variables [ 'content' ] = $content ;
$variables [ 'show_messages' ] = $show_messages ;
2009-05-28 16:44:07 +00:00
// Variable processors invoked manually since this function and theme_install_page()
// are exceptions in how it works within the theme system.
template_preprocess ( $variables , 'update_page' );
2007-11-30 12:19:10 +00:00
template_preprocess_maintenance_page ( $variables );
2009-05-28 16:44:07 +00:00
template_process ( $variables , 'update_page' );
2007-11-30 12:19:10 +00:00
2008-01-16 10:37:43 +00:00
// Special handling of warning messages.
$messages = drupal_set_message ();
if ( isset ( $messages [ 'warning' ])) {
$title = count ( $messages [ 'warning' ]) > 1 ? 'The following update warnings should be carefully reviewed before continuing' : 'The following update warning should be carefully reviewed before continuing' ;
2008-04-14 17:48:46 +00:00
$variables [ 'messages' ] .= '<h4>' . $title . ':</h4>' ;
2008-01-16 10:37:43 +00:00
$variables [ 'messages' ] .= theme ( 'status_messages' , 'warning' );
}
2008-01-16 10:47:17 +00:00
// This was called as a theme hook (not template), so we need to
// fix path_to_theme() for the template, to point at the actual
// theme rather than system module as owner of the hook.
global $theme_path ;
$theme_path = 'themes/garland' ;
2007-11-30 12:19:10 +00:00
return theme_render_template ( 'themes/garland/maintenance-page.tpl.php' , $variables );
}
/**
* The variables generated here is a mirror of template_preprocess_page () .
* This preprocessor will run it ' s course when theme_maintenance_page () is
* invoked . It is also used in theme_install_page () and theme_update_page () to
* keep all the variables consistent .
*
* An alternate template file of " maintenance-page-offline.tpl.php " can be
* used when the database is offline to hide errors and completely replace the
* content .
*
* The $variables array contains the following arguments :
* - $content
* - $show_blocks
*
* @ see maintenance - page . tpl . php
*/
function template_preprocess_maintenance_page ( & $variables ) {
// Add favicon
if ( theme_get_setting ( 'toggle_favicon' )) {
2009-05-17 10:42:16 +00:00
$favicon = theme_get_setting ( 'favicon' );
$type = file_get_mimetype ( $favicon );
// Use the genereic MIME type for favicons if no other was found.
if ( $type == 'application/octet-stream' ) {
$type = 'image/x-icon' ;
}
drupal_add_html_head ( '<link rel="shortcut icon" href="' . check_url ( $favicon ) . '" type="' . check_plain ( $type ) . '" />' );
2007-11-30 12:19:10 +00:00
}
global $theme ;
// Retrieve the theme data to list all available regions.
2009-06-06 16:05:28 +00:00
$theme_data = _system_get_theme_data ();
2007-11-30 12:19:10 +00:00
$regions = $theme_data [ $theme ] -> info [ 'regions' ];
2009-05-21 21:12:25 +00:00
// Get all region content set with drupal_add_region_content().
2007-11-30 12:19:10 +00:00
foreach ( array_keys ( $regions ) as $region ) {
// Assign region to a region variable.
2009-05-21 21:12:25 +00:00
$region_content = drupal_get_region_content ( $region );
2007-11-30 12:19:10 +00:00
isset ( $variables [ $region ]) ? $variables [ $region ] .= $region_content : $variables [ $region ] = $region_content ;
}
// Setup layout variable.
$variables [ 'layout' ] = 'none' ;
if ( ! empty ( $variables [ 'left' ])) {
$variables [ 'layout' ] = 'left' ;
}
if ( ! empty ( $variables [ 'right' ])) {
$variables [ 'layout' ] = ( $variables [ 'layout' ] == 'left' ) ? 'both' : 'right' ;
}
// Construct page title
if ( drupal_get_title ()) {
$head_title = array ( strip_tags ( drupal_get_title ()), variable_get ( 'site_name' , 'Drupal' ));
}
else {
$head_title = array ( variable_get ( 'site_name' , 'Drupal' ));
if ( variable_get ( 'site_slogan' , '' )) {
$head_title [] = variable_get ( 'site_slogan' , '' );
}
}
$variables [ 'head_title' ] = implode ( ' | ' , $head_title );
$variables [ 'base_path' ] = base_path ();
2008-04-28 09:25:27 +00:00
$variables [ 'front_page' ] = url ();
2007-11-30 12:19:10 +00:00
$variables [ 'breadcrumb' ] = '' ;
$variables [ 'feed_icons' ] = '' ;
$variables [ 'head' ] = drupal_get_html_head ();
$variables [ 'help' ] = '' ;
$variables [ 'language' ] = $GLOBALS [ 'language' ];
2008-01-24 09:42:53 +00:00
$variables [ 'language' ] -> dir = $GLOBALS [ 'language' ] -> direction ? 'rtl' : 'ltr' ;
2007-11-30 12:19:10 +00:00
$variables [ 'logo' ] = theme_get_setting ( 'logo' );
$variables [ 'messages' ] = $variables [ 'show_messages' ] ? theme ( 'status_messages' ) : '' ;
2008-06-25 09:12:25 +00:00
$variables [ 'main_menu' ] = array ();
$variables [ 'secondary_menu' ] = array ();
2007-11-30 12:19:10 +00:00
$variables [ 'search_box' ] = '' ;
$variables [ 'site_name' ] = ( theme_get_setting ( 'toggle_name' ) ? variable_get ( 'site_name' , 'Drupal' ) : '' );
$variables [ 'site_slogan' ] = ( theme_get_setting ( 'toggle_slogan' ) ? variable_get ( 'site_slogan' , '' ) : '' );
$variables [ 'css' ] = drupal_add_css ();
$variables [ 'styles' ] = drupal_get_css ();
$variables [ 'scripts' ] = drupal_get_js ();
$variables [ 'tabs' ] = '' ;
$variables [ 'title' ] = drupal_get_title ();
$variables [ 'closure' ] = '' ;
// Compile a list of classes that are going to be applied to the body element.
2009-05-28 16:44:07 +00:00
$variables [ 'classes_array' ][] = 'in-maintenance' ;
2007-11-30 12:19:10 +00:00
if ( isset ( $variables [ 'db_is_active' ]) && ! $variables [ 'db_is_active' ]) {
2009-05-28 16:44:07 +00:00
$variables [ 'classes_array' ][] = 'db-offline' ;
2007-11-30 12:19:10 +00:00
}
if ( $variables [ 'layout' ] == 'both' ) {
2009-05-28 16:44:07 +00:00
$variables [ 'classes_array' ][] = 'two-sidebars' ;
2007-11-30 12:19:10 +00:00
}
elseif ( $variables [ 'layout' ] == 'none' ) {
2009-05-28 16:44:07 +00:00
$variables [ 'classes_array' ][] = 'no-sidebars' ;
2007-11-30 12:19:10 +00:00
}
else {
2009-05-28 16:44:07 +00:00
$variables [ 'classes_array' ][] = 'one-sidebar sidebar-' . $variables [ 'layout' ];
2007-11-30 12:19:10 +00:00
}
// Dead databases will show error messages so supplying this template will
// allow themers to override the page and the content completely.
if ( isset ( $variables [ 'db_is_active' ]) && ! $variables [ 'db_is_active' ]) {
$variables [ 'template_file' ] = 'maintenance-page-offline' ;
}
}