2007-05-22 05:52:17 +00:00
< ? php
/**
2007-08-26 16:41:02 +00:00
* @ file
* Admin page callbacks for the system module .
*/
2013-04-09 20:30:46 +00:00
use Drupal\Core\Ajax\AjaxResponse ;
use Drupal\Core\Ajax\ReplaceCommand ;
2012-06-29 16:10:25 +00:00
use Symfony\Component\HttpFoundation\JsonResponse ;
2012-04-13 05:01:33 +00:00
use Symfony\Component\HttpFoundation\Response ;
2012-06-04 12:06:09 +00:00
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException ;
2012-11-29 07:37:55 +00:00
use Drupal\Core\Datetime\DrupalDateTime ;
2013-05-19 15:41:59 +00:00
use Drupal\system\Form\ModulesInstallConfirmForm ;
use Drupal\system\Form\ModulesUninstallConfirmForm ;
2012-04-13 05:01:33 +00:00
2009-08-11 11:52:46 +00:00
/**
* Menu callback ; Provide the administration overview page .
*/
function system_admin_config_page () {
// Check for status report errors.
2013-06-05 13:39:57 +00:00
// @todo Use depedancy injection in http://drupal.org/node/1987810.
if ( Drupal :: service ( 'system.manager' ) -> checkRequirements () && user_access ( 'administer site configuration' )) {
2009-08-11 11:52:46 +00:00
drupal_set_message ( t ( 'One or more problems were detected with your Drupal installation. Check the <a href="@status">status report</a> for more information.' , array ( '@status' => url ( 'admin/reports/status' ))), 'error' );
}
$blocks = array ();
2013-02-08 23:55:25 +00:00
if ( $system_link = entity_load_multiple_by_properties ( 'menu_link' , array ( 'link_path' => 'admin/config' , 'module' => 'system' ))) {
$system_link = reset ( $system_link );
2013-04-11 12:55:05 +00:00
$query = Drupal :: entityQuery ( 'menu_link' )
2013-02-08 23:55:25 +00:00
-> condition ( 'link_path' , 'admin/help' , '<>' )
-> condition ( 'menu_name' , $system_link -> menu_name )
-> condition ( 'plid' , $system_link -> id ())
-> condition ( 'hidden' , 0 );
$result = $query -> execute ();
if ( ! empty ( $result )) {
$menu_links = menu_link_load_multiple ( $result );
2010-05-21 11:37:55 +00:00
2013-02-08 23:55:25 +00:00
foreach ( $menu_links as $item ) {
_menu_link_translate ( $item );
if ( ! $item [ 'access' ]) {
continue ;
}
// The link description, either derived from 'description' in hook_menu()
// or customized via menu module is used as title attribute.
if ( ! empty ( $item [ 'localized_options' ][ 'attributes' ][ 'title' ])) {
$item [ 'description' ] = $item [ 'localized_options' ][ 'attributes' ][ 'title' ];
unset ( $item [ 'localized_options' ][ 'attributes' ][ 'title' ]);
}
$block = $item ;
$block [ 'content' ] = '' ;
$block [ 'content' ] .= theme ( 'admin_block_content' , array ( 'content' => system_admin_menu_block ( $item )));
if ( ! empty ( $block [ 'content' ])) {
$block [ 'show' ] = TRUE ;
}
// Prepare for sorting as in function _menu_tree_check_access().
// The weight is offset so it is always positive, with a uniform 5-digits.
$blocks [( 50000 + $item [ 'weight' ]) . ' ' . $item [ 'title' ] . ' ' . $item [ 'mlid' ]] = $block ;
}
2009-08-11 11:52:46 +00:00
}
}
if ( $blocks ) {
ksort ( $blocks );
2009-10-09 01:00:08 +00:00
return theme ( 'admin_page' , array ( 'blocks' => $blocks ));
2009-08-11 11:52:46 +00:00
}
else {
return t ( 'You do not have any administrative items.' );
}
}
2007-05-22 05:52:17 +00:00
/**
* Provide a single block from the administration menu as a page .
2011-03-27 23:31:05 +00:00
*
2007-05-22 05:52:17 +00:00
* This function is often a destination for these blocks .
2009-07-20 18:51:36 +00:00
* For example , 'admin/structure/types' needs to have a destination to be valid
2007-05-22 05:52:17 +00:00
* in the Drupal menu system , but too much information there might be
* hidden , so we supply the contents of the block .
2007-12-16 21:01:45 +00:00
*
* @ return
* The output HTML .
2007-05-22 05:52:17 +00:00
*/
function system_admin_menu_block_page () {
$item = menu_get_item ();
2007-12-26 19:02:24 +00:00
if ( $content = system_admin_menu_block ( $item )) {
2009-10-09 01:00:08 +00:00
$output = theme ( 'admin_block_content' , array ( 'content' => $content ));
2007-12-26 19:02:24 +00:00
}
else {
$output = t ( 'You do not have any administrative items.' );
}
2007-05-22 05:52:17 +00:00
return $output ;
}
2007-08-26 16:41:02 +00:00
2009-12-01 00:39:35 +00:00
/**
* Menu callback ; displays a listing of all themes .
*/
function system_themes_page () {
// Get current list of themes.
2010-05-28 18:18:50 +00:00
$themes = system_rebuild_theme_data ();
2010-04-28 19:34:46 +00:00
uasort ( $themes , 'system_sort_modules_by_info_name' );
2009-12-01 00:39:35 +00:00
2013-03-04 14:04:05 +00:00
$theme_default = config ( 'system.theme' ) -> get ( 'default' );
2009-12-01 00:39:35 +00:00
$theme_groups = array ();
2012-12-10 12:35:52 +00:00
$admin_theme = config ( 'system.theme' ) -> get ( 'admin' );
2009-12-01 00:39:35 +00:00
foreach ( $themes as & $theme ) {
2010-04-28 19:34:46 +00:00
if ( ! empty ( $theme -> info [ 'hidden' ])) {
continue ;
}
2009-12-01 00:39:35 +00:00
$theme -> is_default = ( $theme -> name == $theme_default );
2007-08-26 16:41:02 +00:00
2009-12-01 00:39:35 +00:00
// Identify theme screenshot.
$theme -> screenshot = NULL ;
2009-08-03 06:06:23 +00:00
// Create a list which includes the current theme and all its base themes.
if ( isset ( $themes [ $theme -> name ] -> base_themes )) {
2009-08-25 15:28:05 +00:00
$theme_keys = array_keys ( $themes [ $theme -> name ] -> base_themes );
$theme_keys [] = $theme -> name ;
2009-08-03 06:06:23 +00:00
}
else {
$theme_keys = array ( $theme -> name );
}
// Look for a screenshot in the current theme or in its closest ancestor.
foreach ( array_reverse ( $theme_keys ) as $theme_key ) {
if ( isset ( $themes [ $theme_key ]) && file_exists ( $themes [ $theme_key ] -> info [ 'screenshot' ])) {
2009-12-01 00:39:35 +00:00
$theme -> screenshot = array (
2011-11-25 03:09:40 +00:00
'uri' => $themes [ $theme_key ] -> info [ 'screenshot' ],
2009-12-01 00:39:35 +00:00
'alt' => t ( 'Screenshot for !theme theme' , array ( '!theme' => $theme -> info [ 'name' ])),
'title' => t ( 'Screenshot for !theme theme' , array ( '!theme' => $theme -> info [ 'name' ])),
'attributes' => array ( 'class' => array ( 'screenshot' )),
);
2007-08-26 16:41:02 +00:00
break ;
}
}
2007-12-20 21:37:42 +00:00
2009-12-01 00:39:35 +00:00
if ( empty ( $theme -> status )) {
// Ensure this theme is compatible with this version of core.
// Require the 'content' region to make sure the main page
// content has a common place in all themes.
$theme -> incompatible_core = ! isset ( $theme -> info [ 'core' ]) || ( $theme -> info [ 'core' ] != DRUPAL_CORE_COMPATIBILITY ) || ( ! isset ( $theme -> info [ 'regions' ][ 'content' ]));
$theme -> incompatible_php = version_compare ( phpversion (), $theme -> info [ 'php' ]) < 0 ;
2012-08-06 13:18:08 +00:00
// Confirmed that the base theme is available.
$theme -> incompatible_base = ( isset ( $theme -> info [ 'base theme' ]) && ! isset ( $themes [ $theme -> info [ 'base theme' ]]));
// Confirm that the theme engine is available.
$theme -> incompatible_engine = ( isset ( $theme -> info [ 'engine' ]) && ! isset ( $theme -> owner ));
2007-12-20 21:37:42 +00:00
}
2009-12-01 00:39:35 +00:00
$query [ 'token' ] = drupal_get_token ( 'system-theme-operation-link' );
$theme -> operations = array ();
2012-08-06 13:18:08 +00:00
if ( ! empty ( $theme -> status ) || ! $theme -> incompatible_core && ! $theme -> incompatible_php && ! $theme -> incompatible_base && ! $theme -> incompatible_engine ) {
2009-12-01 00:39:35 +00:00
// Create the operations links.
$query [ 'theme' ] = $theme -> name ;
if ( drupal_theme_access ( $theme )) {
$theme -> operations [] = array (
'title' => t ( 'Settings' ),
'href' => 'admin/appearance/settings/' . $theme -> name ,
'attributes' => array ( 'title' => t ( 'Settings for !theme theme' , array ( '!theme' => $theme -> info [ 'name' ]))),
);
2007-08-26 16:41:02 +00:00
}
2009-12-01 00:39:35 +00:00
if ( ! empty ( $theme -> status )) {
if ( ! $theme -> is_default ) {
2012-08-12 18:48:54 +00:00
if ( $theme -> name != $admin_theme ) {
$theme -> operations [] = array (
'title' => t ( 'Disable' ),
'href' => 'admin/appearance/disable' ,
'query' => $query ,
'attributes' => array ( 'title' => t ( 'Disable !theme theme' , array ( '!theme' => $theme -> info [ 'name' ]))),
);
}
2009-12-01 00:39:35 +00:00
$theme -> operations [] = array (
'title' => t ( 'Set default' ),
'href' => 'admin/appearance/default' ,
'query' => $query ,
'attributes' => array ( 'title' => t ( 'Set !theme as default theme' , array ( '!theme' => $theme -> info [ 'name' ]))),
);
}
2012-08-12 18:48:54 +00:00
$admin_theme_options [ $theme -> name ] = $theme -> info [ 'name' ];
2009-12-01 00:39:35 +00:00
}
else {
$theme -> operations [] = array (
'title' => t ( 'Enable' ),
'href' => 'admin/appearance/enable' ,
'query' => $query ,
'attributes' => array ( 'title' => t ( 'Enable !theme theme' , array ( '!theme' => $theme -> info [ 'name' ]))),
);
2010-01-02 18:58:57 +00:00
$theme -> operations [] = array (
'title' => t ( 'Enable and set default' ),
'href' => 'admin/appearance/default' ,
'query' => $query ,
'attributes' => array ( 'title' => t ( 'Enable !theme as default theme' , array ( '!theme' => $theme -> info [ 'name' ]))),
);
2007-08-26 16:41:02 +00:00
}
}
2009-12-01 00:39:35 +00:00
// Add notes to default and administration theme.
$theme -> notes = array ();
$theme -> classes = array ();
if ( $theme -> is_default ) {
$theme -> classes [] = 'theme-default' ;
$theme -> notes [] = t ( 'default theme' );
}
2012-08-12 18:48:54 +00:00
if ( $theme -> name == $admin_theme || ( $theme -> is_default && $admin_theme == '0' )) {
$theme -> classes [] = 'theme-admin' ;
$theme -> notes [] = t ( 'admin theme' );
}
2009-12-01 00:39:35 +00:00
// Sort enabled and disabled themes into their own groups.
$theme_groups [ $theme -> status ? 'enabled' : 'disabled' ][] = $theme ;
2007-08-26 16:41:02 +00:00
}
2009-12-01 00:39:35 +00:00
// There are two possible theme groups.
$theme_group_titles = array (
'enabled' => format_plural ( count ( $theme_groups [ 'enabled' ]), 'Enabled theme' , 'Enabled themes' ),
2007-08-26 16:41:02 +00:00
);
2009-12-01 15:57:40 +00:00
if ( ! empty ( $theme_groups [ 'disabled' ])) {
$theme_group_titles [ 'disabled' ] = format_plural ( count ( $theme_groups [ 'disabled' ]), 'Disabled theme' , 'Disabled themes' );
2010-04-23 05:48:13 +00:00
}
2009-02-11 05:33:18 +00:00
2009-12-01 00:39:35 +00:00
uasort ( $theme_groups [ 'enabled' ], 'system_sort_themes' );
drupal_alter ( 'system_themes_page' , $theme_groups );
$admin_form = drupal_get_form ( 'system_themes_admin_form' , $admin_theme_options );
return theme ( 'system_themes_page' , array ( 'theme_groups' => $theme_groups , 'theme_group_titles' => $theme_group_titles )) . drupal_render ( $admin_form );
}
/**
* Form to select the administration theme .
*
* @ ingroup forms
* @ see system_themes_admin_form_submit ()
*/
function system_themes_admin_form ( $form , & $form_state , $theme_options ) {
2009-02-11 05:33:18 +00:00
// Administration theme settings.
$form [ 'admin_theme' ] = array (
2012-11-27 07:06:47 +00:00
'#type' => 'details' ,
2009-02-11 05:33:18 +00:00
'#title' => t ( 'Administration theme' ),
);
$form [ 'admin_theme' ][ 'admin_theme' ] = array (
'#type' => 'select' ,
2009-12-01 00:39:35 +00:00
'#options' => array ( 0 => t ( 'Default theme' )) + $theme_options ,
2009-02-11 05:33:18 +00:00
'#title' => t ( 'Administration theme' ),
2009-08-15 06:27:49 +00:00
'#description' => t ( 'Choose "Default theme" to always use the same theme as the rest of the site.' ),
2012-12-10 12:35:52 +00:00
'#default_value' => config ( 'system.theme' ) -> get ( 'admin' ),
2009-02-11 05:33:18 +00:00
);
2010-04-24 14:49:14 +00:00
$form [ 'admin_theme' ][ 'actions' ] = array ( '#type' => 'actions' );
2010-01-03 21:01:04 +00:00
$form [ 'admin_theme' ][ 'actions' ][ 'submit' ] = array (
2007-08-26 16:41:02 +00:00
'#type' => 'submit' ,
'#value' => t ( 'Save configuration' ),
);
return $form ;
}
2007-12-16 21:01:45 +00:00
/**
2009-12-01 00:39:35 +00:00
* Process system_themes_admin_form form submissions .
2007-12-16 21:01:45 +00:00
*/
2009-12-01 00:39:35 +00:00
function system_themes_admin_form_submit ( $form , & $form_state ) {
drupal_set_message ( t ( 'The configuration options have been saved.' ));
2012-12-10 12:35:52 +00:00
config ( 'system.theme' ) -> set ( 'admin' , $form_state [ 'values' ][ 'admin_theme' ]) -> save ();
2009-12-01 00:39:35 +00:00
}
2007-08-26 16:41:02 +00:00
2009-12-01 00:39:35 +00:00
/**
* Menu callback ; Set the default theme .
*/
function system_theme_default () {
if ( isset ( $_REQUEST [ 'theme' ]) && isset ( $_REQUEST [ 'token' ]) && drupal_valid_token ( $_REQUEST [ 'token' ], 'system-theme-operation-link' )) {
$theme = $_REQUEST [ 'theme' ];
// Get current list of themes.
2010-04-28 19:34:46 +00:00
$themes = list_themes ();
2009-12-01 00:39:35 +00:00
// Check if the specified theme is one recognized by the system.
if ( ! empty ( $themes [ $theme ])) {
// Enable the theme if it is currently disabled.
if ( empty ( $themes [ $theme ] -> status )) {
theme_enable ( array ( $theme ));
}
// Set the default theme.
2013-03-04 14:04:05 +00:00
config ( 'system.theme' )
-> set ( 'default' , $theme )
-> save ();
2011-05-13 19:32:13 +00:00
2012-05-03 15:09:39 +00:00
// Rebuild the menu. This duplicates the menu_router_rebuild() in
// theme_enable(). However, modules must know the current default theme in
// order to use this information in hook_menu() or hook_menu_alter()
// implementations, and doing the variable_set() before the theme_enable()
// could result in a race condition where the theme is default but not
// enabled.
menu_router_rebuild ();
2011-05-13 19:32:13 +00:00
2010-02-15 15:07:57 +00:00
// The status message depends on whether an admin theme is currently in use:
// a value of 0 means the admin theme is set to be the default theme.
2012-12-10 12:35:52 +00:00
$admin_theme = config ( 'system.theme' ) -> get ( 'admin' );
2010-02-15 15:07:57 +00:00
if ( $admin_theme != 0 && $admin_theme != $theme ) {
2009-12-01 00:39:35 +00:00
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 (
'%admin_theme' => $themes [ $admin_theme ] -> info [ 'name' ],
'%selected_theme' => $themes [ $theme ] -> info [ 'name' ],
)));
}
else {
drupal_set_message ( t ( '%theme is now the default theme.' , array ( '%theme' => $themes [ $theme ] -> info [ 'name' ])));
}
}
else {
drupal_set_message ( t ( 'The %theme theme was not found.' , array ( '%theme' => $theme )), 'error' );
}
drupal_goto ( 'admin/appearance' );
}
2012-06-04 12:06:09 +00:00
throw new AccessDeniedHttpException ();
2007-08-26 16:41:02 +00:00
}
/**
* Form builder ; display theme configuration for entire site and individual themes .
2007-08-30 15:31:46 +00:00
*
2007-12-16 21:01:45 +00:00
* @ param $key
* A theme name .
* @ return
* The form structure .
2007-08-26 16:41:02 +00:00
* @ ingroup forms
2013-05-07 09:47:19 +00:00
* @ see system_theme_settings_validate ()
2008-01-08 10:35:43 +00:00
* @ see system_theme_settings_submit ()
2007-08-26 16:41:02 +00:00
*/
2009-09-18 00:12:48 +00:00
function system_theme_settings ( $form , & $form_state , $key = '' ) {
2009-10-14 10:56:35 +00:00
// Default settings are defined in theme_get_setting() in includes/theme.inc
2007-08-26 16:41:02 +00:00
if ( $key ) {
2009-10-14 10:56:35 +00:00
$var = 'theme_' . $key . '_settings' ;
2013-05-07 09:47:19 +00:00
$config_key = $key . '.settings' ;
2012-02-03 14:16:11 +00:00
$themes = list_themes ();
2007-08-26 16:41:02 +00:00
$features = $themes [ $key ] -> info [ 'features' ];
}
else {
$var = 'theme_settings' ;
2013-05-07 09:47:19 +00:00
$config_key = 'system.theme.global' ;
2007-08-26 16:41:02 +00:00
}
$form [ 'var' ] = array ( '#type' => 'hidden' , '#value' => $var );
2013-05-07 09:47:19 +00:00
$form [ 'config_key' ] = array ( '#type' => 'hidden' , '#value' => $config_key );
2007-08-26 16:41:02 +00:00
// Toggle settings
$toggles = array (
2009-04-26 09:14:32 +00:00
'logo' => t ( 'Logo' ),
'name' => t ( 'Site name' ),
'slogan' => t ( 'Site slogan' ),
'node_user_picture' => t ( 'User pictures in posts' ),
'comment_user_picture' => t ( 'User pictures in comments' ),
'comment_user_verification' => t ( 'User verification status in comments' ),
'favicon' => t ( 'Shortcut icon' ),
'main_menu' => t ( 'Main menu' ),
'secondary_menu' => t ( 'Secondary menu' ),
2007-08-26 16:41:02 +00:00
);
// Some features are not always available
$disabled = array ();
2012-11-26 10:38:45 +00:00
if ( ! user_picture_enabled ()) {
2007-08-26 16:41:02 +00:00
$disabled [ 'toggle_node_user_picture' ] = TRUE ;
$disabled [ 'toggle_comment_user_picture' ] = TRUE ;
}
2010-08-12 00:34:25 +00:00
if ( ! module_exists ( 'comment' )) {
$disabled [ 'toggle_comment_user_picture' ] = TRUE ;
$disabled [ 'toggle_comment_user_verification' ] = TRUE ;
}
2007-08-26 16:41:02 +00:00
$form [ 'theme_settings' ] = array (
2012-11-27 07:06:47 +00:00
'#type' => 'details' ,
2007-08-26 16:41:02 +00:00
'#title' => t ( 'Toggle display' ),
'#description' => t ( 'Enable or disable the display of certain page elements.' ),
);
foreach ( $toggles as $name => $title ) {
if (( ! $key ) || in_array ( $name , $features )) {
2013-05-07 09:47:19 +00:00
$form [ 'theme_settings' ][ 'toggle_' . $name ] = array ( '#type' => 'checkbox' , '#title' => $title , '#default_value' => theme_get_setting ( 'features.' . $name , $key ));
2007-10-18 13:41:00 +00:00
// Disable checkboxes for features not supported in the current configuration.
2008-04-14 17:48:46 +00:00
if ( isset ( $disabled [ 'toggle_' . $name ])) {
$form [ 'theme_settings' ][ 'toggle_' . $name ][ '#disabled' ] = TRUE ;
2007-08-26 16:41:02 +00:00
}
}
}
2009-01-09 16:19:56 +00:00
if ( ! element_children ( $form [ 'theme_settings' ])) {
2012-11-27 07:06:47 +00:00
// If there is no element in the theme settings details then do not show
2007-11-04 15:54:53 +00:00
// it -- but keep it in the form if another module wants to alter.
$form [ 'theme_settings' ][ '#access' ] = FALSE ;
}
2007-08-26 16:41:02 +00:00
2012-08-31 01:27:21 +00:00
// Logo settings, only available when file.module is enabled.
if (( ! $key ) || in_array ( 'logo' , $features ) && module_exists ( 'file' )) {
2007-08-26 16:41:02 +00:00
$form [ 'logo' ] = array (
2012-11-27 07:06:47 +00:00
'#type' => 'details' ,
2007-08-26 16:41:02 +00:00
'#title' => t ( 'Logo image settings' ),
2009-08-22 14:34:23 +00:00
'#attributes' => array ( 'class' => array ( 'theme-settings-bottom' )),
2013-05-03 22:47:44 +00:00
'#states' => array (
// Hide the logo image settings fieldset when logo display is disabled.
'invisible' => array (
'input[name="toggle_logo"]' => array ( 'checked' => FALSE ),
),
),
2007-08-26 16:41:02 +00:00
);
2009-01-09 16:19:56 +00:00
$form [ 'logo' ][ 'default_logo' ] = array (
2007-08-26 16:41:02 +00:00
'#type' => 'checkbox' ,
2012-02-17 03:38:33 +00:00
'#title' => t ( 'Use the default logo supplied by the theme' ),
2013-05-07 09:47:19 +00:00
'#default_value' => theme_get_setting ( 'logo.use_default' , $key ),
2007-08-26 16:41:02 +00:00
'#tree' => FALSE ,
);
2009-10-16 19:20:34 +00:00
$form [ 'logo' ][ 'settings' ] = array (
'#type' => 'container' ,
'#states' => array (
// Hide the logo settings when using the default logo.
'invisible' => array (
'input[name="default_logo"]' => array ( 'checked' => TRUE ),
),
),
);
$form [ 'logo' ][ 'settings' ][ 'logo_path' ] = array (
2007-08-26 16:41:02 +00:00
'#type' => 'textfield' ,
'#title' => t ( 'Path to custom logo' ),
2013-05-07 09:47:19 +00:00
'#default_value' => theme_get_setting ( 'logo.path' , $key ),
2009-10-16 19:20:34 +00:00
);
$form [ 'logo' ][ 'settings' ][ 'logo_upload' ] = array (
2007-08-26 16:41:02 +00:00
'#type' => 'file' ,
'#title' => t ( 'Upload logo image' ),
'#maxlength' => 40 ,
'#description' => t ( " If you don't have direct file access to the server, use this field to upload your logo. " )
);
}
2012-08-31 01:27:21 +00:00
if (( ! $key ) || in_array ( 'favicon' , $features ) && module_exists ( 'file' )) {
2007-08-26 16:41:02 +00:00
$form [ 'favicon' ] = array (
2012-11-27 07:06:47 +00:00
'#type' => 'details' ,
2007-08-26 16:41:02 +00:00
'#title' => t ( 'Shortcut icon settings' ),
2009-01-09 16:19:56 +00:00
'#description' => t ( " Your shortcut icon, or 'favicon', is displayed in the address bar and bookmarks of most browsers. " ),
2013-05-03 22:47:44 +00:00
'#states' => array (
// Hide the shortcut icon settings fieldset when shortcut icon display
// is disabled.
'invisible' => array (
'input[name="toggle_favicon"]' => array ( 'checked' => FALSE ),
),
),
2007-08-26 16:41:02 +00:00
);
$form [ 'favicon' ][ 'default_favicon' ] = array (
'#type' => 'checkbox' ,
2012-02-17 03:38:33 +00:00
'#title' => t ( 'Use the default shortcut icon supplied by the theme' ),
2013-05-07 09:47:19 +00:00
'#default_value' => theme_get_setting ( 'favicon.use_default' , $key ),
2007-08-26 16:41:02 +00:00
);
2009-10-16 19:20:34 +00:00
$form [ 'favicon' ][ 'settings' ] = array (
'#type' => 'container' ,
'#states' => array (
// Hide the favicon settings when using the default favicon.
'invisible' => array (
'input[name="default_favicon"]' => array ( 'checked' => TRUE ),
),
),
);
$form [ 'favicon' ][ 'settings' ][ 'favicon_path' ] = array (
2007-08-26 16:41:02 +00:00
'#type' => 'textfield' ,
'#title' => t ( 'Path to custom icon' ),
2013-05-07 09:47:19 +00:00
'#default_value' => theme_get_setting ( 'favicon.path' , $key ),
2007-08-26 16:41:02 +00:00
);
2009-10-16 19:20:34 +00:00
$form [ 'favicon' ][ 'settings' ][ 'favicon_upload' ] = array (
2007-08-26 16:41:02 +00:00
'#type' => 'file' ,
'#title' => t ( 'Upload icon image' ),
'#description' => t ( " If you don't have direct file access to the server, use this field to upload your shortcut icon. " )
);
}
2012-02-17 03:38:33 +00:00
// Inject human-friendly values and form element descriptions for logo and
// favicon.
foreach ( array ( 'logo' => 'logo.png' , 'favicon' => 'favicon.ico' ) as $type => $default ) {
if ( isset ( $form [ $type ][ 'settings' ][ $type . '_path' ])) {
$element = & $form [ $type ][ 'settings' ][ $type . '_path' ];
// If path is a public:// URI, display the path relative to the files
// directory; stream wrappers are not end-user friendly.
$original_path = $element [ '#default_value' ];
$friendly_path = NULL ;
if ( file_uri_scheme ( $original_path ) == 'public' ) {
$friendly_path = file_uri_target ( $original_path );
$element [ '#default_value' ] = $friendly_path ;
}
// Prepare local file path for description.
if ( $original_path && isset ( $friendly_path )) {
$local_file = strtr ( $original_path , array ( 'public:/' => variable_get ( 'file_public_path' , conf_path () . '/files' )));
}
elseif ( $key ) {
$local_file = drupal_get_path ( 'theme' , $key ) . '/' . $default ;
}
else {
$local_file = path_to_theme () . '/' . $default ;
}
$element [ '#description' ] = t ( 'Examples: <code>@implicit-public-file</code> (for a file in the public filesystem), <code>@explicit-file</code>, or <code>@local-file</code>.' , array (
'@implicit-public-file' => isset ( $friendly_path ) ? $friendly_path : $default ,
'@explicit-file' => file_uri_scheme ( $original_path ) !== FALSE ? $original_path : 'public://' . $default ,
'@local-file' => $local_file ,
));
}
}
2007-08-26 16:41:02 +00:00
if ( $key ) {
2007-08-29 18:09:36 +00:00
// Call engine-specific settings.
2008-04-14 17:48:46 +00:00
$function = $themes [ $key ] -> prefix . '_engine_settings' ;
2007-08-26 16:41:02 +00:00
if ( function_exists ( $function )) {
2009-10-14 10:56:35 +00:00
$form [ 'engine_specific' ] = array (
2012-11-27 07:06:47 +00:00
'#type' => 'details' ,
2009-10-14 10:56:35 +00:00
'#title' => t ( 'Theme-engine-specific settings' ),
'#description' => t ( 'These settings only exist for the themes based on the %engine theme engine.' , array ( '%engine' => $themes [ $key ] -> prefix )),
);
$function ( $form , $form_state );
2007-08-29 18:09:36 +00:00
}
2009-10-14 10:56:35 +00:00
// Create a list which includes the current theme and all its base themes.
if ( isset ( $themes [ $key ] -> base_themes )) {
$theme_keys = array_keys ( $themes [ $key ] -> base_themes );
$theme_keys [] = $key ;
2007-08-29 18:09:36 +00:00
}
2009-10-14 10:56:35 +00:00
else {
$theme_keys = array ( $key );
}
// Save the name of the current theme (if any), so that we can temporarily
// override the current theme and allow theme_get_setting() to work
// without having to pass the theme name to it.
$default_theme = ! empty ( $GLOBALS [ 'theme_key' ]) ? $GLOBALS [ 'theme_key' ] : NULL ;
$GLOBALS [ 'theme_key' ] = $key ;
// Process the theme and all its base themes.
foreach ( $theme_keys as $theme ) {
// Include the theme-settings.php file.
2013-03-06 22:51:39 +00:00
$filename = DRUPAL_ROOT . '/' . str_replace ( " / $theme .info.yml " , '' , $themes [ $theme ] -> filename ) . '/theme-settings.php' ;
2009-10-14 10:56:35 +00:00
if ( file_exists ( $filename )) {
require_once $filename ;
}
// Call theme-specific settings.
$function = $theme . '_form_system_theme_settings_alter' ;
if ( function_exists ( $function )) {
$function ( $form , $form_state );
2007-08-26 16:41:02 +00:00
}
}
2009-10-14 10:56:35 +00:00
// Restore the original current theme.
2010-09-24 02:10:06 +00:00
if ( isset ( $default_theme )) {
2009-10-14 10:56:35 +00:00
$GLOBALS [ 'theme_key' ] = $default_theme ;
}
else {
unset ( $GLOBALS [ 'theme_key' ]);
}
2007-08-26 16:41:02 +00:00
}
2013-05-07 09:47:19 +00:00
return system_config_form ( $form , $form_state );
2007-08-26 16:41:02 +00:00
}
2009-12-24 16:54:56 +00:00
/**
* Validator for the system_theme_settings () form .
*/
function system_theme_settings_validate ( $form , & $form_state ) {
2012-08-31 01:27:21 +00:00
if ( module_exists ( 'file' )) {
// Handle file uploads.
$validators = array ( 'file_validate_is_image' => array ());
// Check for a new uploaded logo.
2013-04-20 03:34:14 +00:00
$file = file_save_upload ( 'logo_upload' , $validators , FALSE , 0 );
2012-08-31 01:27:21 +00:00
if ( isset ( $file )) {
// File upload was attempted.
if ( $file ) {
// Put the temporary file in form_values so we can save it on submit.
$form_state [ 'values' ][ 'logo_upload' ] = $file ;
}
else {
// File upload failed.
form_set_error ( 'logo_upload' , t ( 'The logo could not be uploaded.' ));
}
2009-12-24 16:54:56 +00:00
}
2012-08-31 01:27:21 +00:00
$validators = array ( 'file_validate_extensions' => array ( 'ico png gif jpg jpeg apng svg' ));
2010-09-01 20:05:14 +00:00
2012-08-31 01:27:21 +00:00
// Check for a new uploaded favicon.
2013-04-20 03:34:14 +00:00
$file = file_save_upload ( 'favicon_upload' , $validators , FALSE , 0 );
2012-08-31 01:27:21 +00:00
if ( isset ( $file )) {
// File upload was attempted.
if ( $file ) {
// Put the temporary file in form_values so we can save it on submit.
$form_state [ 'values' ][ 'favicon_upload' ] = $file ;
}
else {
// File upload failed.
form_set_error ( 'favicon_upload' , t ( 'The favicon could not be uploaded.' ));
}
2009-12-24 16:54:56 +00:00
}
2012-08-31 01:27:21 +00:00
// If the user provided a path for a logo or favicon file, make sure a file
// exists at that path.
if ( $form_state [ 'values' ][ 'logo_path' ]) {
$path = _system_theme_settings_validate_path ( $form_state [ 'values' ][ 'logo_path' ]);
if ( ! $path ) {
form_set_error ( 'logo_path' , t ( 'The custom logo path is invalid.' ));
}
2009-12-24 16:54:56 +00:00
}
2012-08-31 01:27:21 +00:00
if ( $form_state [ 'values' ][ 'favicon_path' ]) {
$path = _system_theme_settings_validate_path ( $form_state [ 'values' ][ 'favicon_path' ]);
if ( ! $path ) {
form_set_error ( 'favicon_path' , t ( 'The custom favicon path is invalid.' ));
}
2009-12-24 16:54:56 +00:00
}
}
}
/**
* Helper function for the system_theme_settings form .
*
* Attempts to validate normal system paths , paths relative to the public files
* directory , or stream wrapper URIs . If the given path is any of the above ,
* returns a valid path or URI that the theme system can display .
*
* @ param $path
* A path relative to the Drupal root or to the public files directory , or
* a stream wrapper URI .
* @ return mixed
* A valid path that can be displayed through the theme system , or FALSE if
* the path could not be validated .
*/
function _system_theme_settings_validate_path ( $path ) {
2012-02-17 03:38:33 +00:00
// Absolute local file paths are invalid.
if ( drupal_realpath ( $path ) == $path ) {
return FALSE ;
}
// A path relative to the Drupal root or a fully qualified URI is valid.
if ( is_file ( $path )) {
2009-12-24 16:54:56 +00:00
return $path ;
}
2012-02-17 03:38:33 +00:00
// Prepend 'public://' for relative file paths within public filesystem.
if ( file_uri_scheme ( $path ) === FALSE ) {
$path = 'public://' . $path ;
}
if ( is_file ( $path )) {
return $path ;
2009-12-24 16:54:56 +00:00
}
return FALSE ;
}
2007-12-16 21:01:45 +00:00
/**
* Process system_theme_settings form submissions .
*/
2007-08-26 16:41:02 +00:00
function system_theme_settings_submit ( $form , & $form_state ) {
2013-05-07 09:47:19 +00:00
$config = Drupal :: config ( $form_state [ 'values' ][ 'config_key' ]);
2012-01-10 04:22:09 +00:00
// Exclude unnecessary elements before saving.
form_state_values_clean ( $form_state );
2013-05-07 09:47:19 +00:00
$key = $form_state [ 'values' ][ 'var' ];
unset ( $form_state [ 'values' ][ 'var' ]);
unset ( $form_state [ 'values' ][ 'config_key' ]);
2009-12-24 16:54:56 +00:00
2013-05-07 09:47:19 +00:00
$values = $form_state [ 'values' ];
2012-08-12 18:53:54 +00:00
2009-12-24 16:54:56 +00:00
// If the user uploaded a new logo or favicon, save it to a permanent location
// and use it in place of the default theme-provided file.
2012-08-31 01:27:21 +00:00
if ( module_exists ( 'file' )) {
if ( $file = $values [ 'logo_upload' ]) {
unset ( $values [ 'logo_upload' ]);
2013-06-15 08:46:11 +00:00
$filename = file_unmanaged_copy ( $file -> getFileUri ());
2012-08-31 01:27:21 +00:00
$values [ 'default_logo' ] = 0 ;
$values [ 'logo_path' ] = $filename ;
$values [ 'toggle_logo' ] = 1 ;
}
if ( $file = $values [ 'favicon_upload' ]) {
unset ( $values [ 'favicon_upload' ]);
2013-06-15 08:46:11 +00:00
$filename = file_unmanaged_copy ( $file -> getFileUri ());
2012-08-31 01:27:21 +00:00
$values [ 'default_favicon' ] = 0 ;
$values [ 'favicon_path' ] = $filename ;
$values [ 'toggle_favicon' ] = 1 ;
}
2009-12-24 16:54:56 +00:00
2012-08-31 01:27:21 +00:00
// If the user entered a path relative to the system files directory for
// a logo or favicon, store a public:// URI so the theme system can handle it.
if ( ! empty ( $values [ 'logo_path' ])) {
$values [ 'logo_path' ] = _system_theme_settings_validate_path ( $values [ 'logo_path' ]);
}
if ( ! empty ( $values [ 'favicon_path' ])) {
$values [ 'favicon_path' ] = _system_theme_settings_validate_path ( $values [ 'favicon_path' ]);
}
2009-12-24 16:54:56 +00:00
2012-08-31 01:27:21 +00:00
if ( empty ( $values [ 'default_favicon' ]) && ! empty ( $values [ 'favicon_path' ])) {
$values [ 'favicon_mimetype' ] = file_get_mimetype ( $values [ 'favicon_path' ]);
}
2009-08-04 07:04:21 +00:00
}
2007-08-26 16:41:02 +00:00
2013-05-07 09:47:19 +00:00
theme_settings_convert_to_config ( $values , $config ) -> save ();
2007-08-26 16:41:02 +00:00
2012-11-28 21:36:29 +00:00
cache_invalidate_tags ( array ( 'content' => TRUE ));
2007-08-26 16:41:02 +00:00
}
2007-09-14 12:16:55 +00:00
/**
2007-12-16 21:01:45 +00:00
* Recursively check compatibility .
*
* @ param $incompatible
2009-01-14 12:18:37 +00:00
* An associative array which at the end of the check contains all
* incompatible files as the keys , their values being TRUE .
2007-12-16 21:01:45 +00:00
* @ param $files
* The set of files that will be tested .
* @ param $file
* The file at which the check starts .
* @ return
2009-01-14 12:18:37 +00:00
* Returns TRUE if an incompatible file is found , NULL ( no return value )
* otherwise .
2007-09-14 12:16:55 +00:00
*/
function _system_is_incompatible ( & $incompatible , $files , $file ) {
if ( isset ( $incompatible [ $file -> name ])) {
return TRUE ;
}
2009-01-14 12:18:37 +00:00
// Recursively traverse required modules, looking for incompatible modules.
foreach ( $file -> requires as $requires ) {
if ( isset ( $files [ $requires ]) && _system_is_incompatible ( $incompatible , $files , $files [ $requires ])) {
2007-09-14 12:16:55 +00:00
$incompatible [ $file -> name ] = TRUE ;
return TRUE ;
}
}
}
2007-08-26 16:41:02 +00:00
/**
2013-05-19 15:41:59 +00:00
* Form constructor for the module enable / disable interface .
2007-08-26 16:41:02 +00:00
*
2013-03-06 22:51:39 +00:00
* The list of modules gets populated by module . info . yml files , which contain
* each module ' s name , description , and information about which modules it
* requires .
* See drupal_parse_info_file () for information on module . info . yml descriptors .
2007-08-26 16:41:02 +00:00
*
2009-01-14 12:18:37 +00:00
* Dependency checking is performed to ensure that a module :
* - can not be enabled if there are disabled modules it requires .
* - can not be disabled if there are enabled modules which depend on it .
2007-08-26 16:41:02 +00:00
*
2013-05-19 15:41:59 +00:00
* @ see system_menu ()
2008-01-08 10:35:43 +00:00
* @ see theme_system_modules ()
* @ see system_modules_submit ()
2013-05-19 15:41:59 +00:00
*
* @ ingroup forms
2007-08-26 16:41:02 +00:00
*/
2009-09-18 00:12:48 +00:00
function system_modules ( $form , $form_state = array ()) {
2007-08-26 16:41:02 +00:00
// Get current list of modules.
2009-10-13 05:26:57 +00:00
$files = system_rebuild_module_data ();
2007-11-09 17:44:01 +00:00
2008-08-09 12:41:23 +00:00
// Remove hidden modules from display list.
2010-05-06 06:26:42 +00:00
$visible_files = $files ;
foreach ( $visible_files as $filename => $file ) {
2010-06-21 02:27:47 +00:00
if ( ! empty ( $file -> info [ 'hidden' ])) {
2010-05-06 06:26:42 +00:00
unset ( $visible_files [ $filename ]);
2008-08-09 12:41:23 +00:00
}
}
2010-05-06 06:26:42 +00:00
uasort ( $visible_files , 'system_sort_modules_by_info_name' );
2007-11-09 17:44:01 +00:00
2009-01-14 12:18:37 +00:00
// If the modules form was submitted, then system_modules_submit() runs first
2009-11-21 17:01:31 +00:00
// and if there are unfilled required modules, then $form_state['storage'] is
2009-01-14 12:18:37 +00:00
// filled, triggering a rebuild. In this case we need to display a
// confirmation form.
2007-08-26 16:41:02 +00:00
if ( ! empty ( $form_state [ 'storage' ])) {
2013-05-19 15:41:59 +00:00
// Contents of confirm form is injected here because already in form
// building function.
$confirm_form = new ModulesInstallConfirmForm ();
return $confirm_form -> buildForm ( $form , $form_state , $visible_files , $form_state [ 'storage' ]);
2007-08-26 16:41:02 +00:00
}
2009-01-14 12:18:37 +00:00
2013-02-09 00:41:02 +00:00
// JS-only table filters.
$form [ 'filters' ] = array (
'#type' => 'container' ,
'#attributes' => array (
'class' => array ( 'table-filter' , 'js-show' ),
),
);
$form [ 'filters' ][ 'text' ] = array (
'#type' => 'search' ,
'#title' => t ( 'Search' ),
'#size' => 30 ,
'#placeholder' => t ( 'Enter module name…' ),
'#attributes' => array (
'class' => array ( 'table-filter-text' ),
'data-table' => '#system-modules' ,
'autocomplete' => 'off' ,
'title' => t ( 'Enter a part of the module name or description to filter by.' ),
),
);
2008-07-23 07:37:06 +00:00
$modules = array ();
$form [ 'modules' ] = array ( '#tree' => TRUE );
2007-09-14 12:16:55 +00:00
2008-05-05 21:10:48 +00:00
// Used when checking if module implements a help page.
$help_arg = module_exists ( 'help' ) ? drupal_help_arg () : FALSE ;
2012-10-05 16:11:15 +00:00
// Used when displaying modules that are required by the installation profile.
2011-10-31 04:05:57 +00:00
require_once DRUPAL_ROOT . '/core/includes/install.inc' ;
2010-06-21 02:27:47 +00:00
$distribution_name = check_plain ( drupal_install_profile_distribution_name ());
2008-07-23 07:37:06 +00:00
// Iterate through each of the modules.
2010-05-06 06:26:42 +00:00
foreach ( $visible_files as $filename => $module ) {
2008-07-23 07:37:06 +00:00
$extra = array ();
$extra [ 'enabled' ] = ( bool ) $module -> status ;
2010-06-21 02:27:47 +00:00
if ( ! empty ( $module -> info [ 'required' ] )) {
$extra [ 'disabled' ] = TRUE ;
2011-08-30 06:12:26 +00:00
$extra [ 'required_by' ][] = $distribution_name . ( ! empty ( $module -> info [ 'explanation' ]) ? ' (' . $module -> info [ 'explanation' ] . ')' : '' );
2010-06-21 02:27:47 +00:00
}
2009-01-14 12:18:37 +00:00
// If this module requires other modules, add them to the array.
foreach ( $module -> requires as $requires => $v ) {
if ( ! isset ( $files [ $requires ])) {
$extra [ 'requires' ][ $requires ] = t ( '@module (<span class="admin-missing">missing</span>)' , array ( '@module' => drupal_ucfirst ( $requires )));
2009-07-28 19:06:16 +00:00
$extra [ 'disabled' ] = TRUE ;
}
2010-05-06 06:26:42 +00:00
// Only display visible modules.
elseif ( isset ( $visible_files [ $requires ])) {
2009-07-28 19:06:16 +00:00
$requires_name = $files [ $requires ] -> info [ 'name' ];
2011-11-08 16:04:26 +00:00
// Disable this module if it is incompatible with the dependency's version.
2009-08-13 03:03:04 +00:00
if ( $incompatible_version = drupal_check_incompatibility ( $v , str_replace ( DRUPAL_CORE_COMPATIBILITY . '-' , '' , $files [ $requires ] -> info [ 'version' ]))) {
$extra [ 'requires' ][ $requires ] = t ( '@module (<span class="admin-missing">incompatible with</span> version @version)' , array (
'@module' => $requires_name . $incompatible_version ,
'@version' => $files [ $requires ] -> info [ 'version' ],
));
$extra [ 'disabled' ] = TRUE ;
2008-07-23 07:37:06 +00:00
}
2011-11-08 16:04:26 +00:00
// Disable this module if the dependency is incompatible with this
// version of Drupal core.
elseif ( $files [ $requires ] -> info [ 'core' ] != DRUPAL_CORE_COMPATIBILITY ) {
$extra [ 'requires' ][ $requires ] = t ( '@module (<span class="admin-missing">incompatible with</span> this version of Drupal core)' , array (
'@module' => $requires_name ,
));
$extra [ 'disabled' ] = TRUE ;
}
2009-08-13 03:03:04 +00:00
elseif ( $files [ $requires ] -> status ) {
Issue #1790280 by nod_, Bojhan, Wim Leers, danillonunes, deviantintegral, Kiphaas7, benjifisher, sun, yoroy, Everett Zufelt, jenlampton, aspilicious: Module page redesign 2.0.
2012-11-21 19:35:03 +00:00
$extra [ 'requires' ][ $requires ] = t ( '@module' , array ( '@module' => $requires_name ));
2009-08-13 03:03:04 +00:00
}
else {
$extra [ 'requires' ][ $requires ] = t ( '@module (<span class="admin-disabled">disabled</span>)' , array ( '@module' => $requires_name ));
2007-08-26 16:41:02 +00:00
}
}
2008-07-23 07:37:06 +00:00
}
// Generate link for module's help page, if there is one.
2008-11-11 22:39:59 +00:00
if ( $help_arg && $module -> status && in_array ( $filename , module_implements ( 'help' ))) {
2008-07-23 07:37:06 +00:00
if ( module_invoke ( $filename , 'help' , " admin/help# $filename " , $help_arg )) {
2009-11-17 21:24:19 +00:00
$extra [ 'links' ][ 'help' ] = array (
'#type' => 'link' ,
'#title' => t ( 'Help' ),
'#href' => " admin/help/ $filename " ,
'#options' => array ( 'attributes' => array ( 'class' => array ( 'module-link' , 'module-link-help' ), 'title' => t ( 'Help' ))),
);
2007-08-26 16:41:02 +00:00
}
}
2009-11-17 21:24:19 +00:00
// Generate link for module's permission, if the user has access to it.
if ( $module -> status && user_access ( 'administer permissions' ) && in_array ( $filename , module_implements ( 'permission' ))) {
$extra [ 'links' ][ 'permissions' ] = array (
'#type' => 'link' ,
'#title' => t ( 'Permissions' ),
2010-02-07 17:29:09 +00:00
'#href' => 'admin/people/permissions' ,
2009-11-17 21:24:19 +00:00
'#options' => array ( 'fragment' => 'module-' . $filename , 'attributes' => array ( 'class' => array ( 'module-link' , 'module-link-permissions' ), 'title' => t ( 'Configure permissions' ))),
);
}
// Generate link for module's configuration page, if the module provides
// one.
if ( $module -> status && isset ( $module -> info [ 'configure' ])) {
$configure_link = menu_get_item ( $module -> info [ 'configure' ]);
if ( $configure_link [ 'access' ]) {
$extra [ 'links' ][ 'configure' ] = array (
'#type' => 'link' ,
'#title' => t ( 'Configure' ),
'#href' => $configure_link [ 'href' ],
'#options' => array ( 'attributes' => array ( 'class' => array ( 'module-link' , 'module-link-configure' ), 'title' => $configure_link [ 'description' ])),
);
}
}
2009-01-14 12:18:37 +00:00
// If this module is required by other modules, list those, and then make it
// impossible to disable this one.
foreach ( $module -> required_by as $required_by => $v ) {
2009-01-11 07:50:03 +00:00
// Hidden modules are unset already.
2010-05-06 06:26:42 +00:00
if ( isset ( $visible_files [ $required_by ])) {
2010-05-16 20:08:38 +00:00
if ( $files [ $required_by ] -> status == 1 && $module -> status == 1 ) {
Issue #1790280 by nod_, Bojhan, Wim Leers, danillonunes, deviantintegral, Kiphaas7, benjifisher, sun, yoroy, Everett Zufelt, jenlampton, aspilicious: Module page redesign 2.0.
2012-11-21 19:35:03 +00:00
$extra [ 'required_by' ][] = t ( '@module' , array ( '@module' => $files [ $required_by ] -> info [ 'name' ]));
2009-01-11 07:50:03 +00:00
$extra [ 'disabled' ] = TRUE ;
}
else {
2009-01-14 12:18:37 +00:00
$extra [ 'required_by' ][] = t ( '@module (<span class="admin-disabled">disabled</span>)' , array ( '@module' => $files [ $required_by ] -> info [ 'name' ]));
2009-01-11 07:50:03 +00:00
}
2007-08-26 16:41:02 +00:00
}
}
2008-07-23 07:37:06 +00:00
$form [ 'modules' ][ $module -> info [ 'package' ]][ $filename ] = _system_modules_build_row ( $module -> info , $extra );
2007-08-26 16:41:02 +00:00
}
2010-06-21 02:27:47 +00:00
2012-11-27 07:06:47 +00:00
// Add basic information to the details.
2008-07-23 07:37:06 +00:00
foreach ( element_children ( $form [ 'modules' ]) as $package ) {
$form [ 'modules' ][ $package ] += array (
2012-11-27 07:06:47 +00:00
'#type' => 'details' ,
2008-07-23 07:37:06 +00:00
'#title' => t ( $package ),
2012-11-27 07:06:47 +00:00
'#theme' => 'system_modules_details' ,
2008-07-23 07:37:06 +00:00
'#header' => array (
Issue #1790280 by nod_, Bojhan, Wim Leers, danillonunes, deviantintegral, Kiphaas7, benjifisher, sun, yoroy, Everett Zufelt, jenlampton, aspilicious: Module page redesign 2.0.
2012-11-21 19:35:03 +00:00
array ( 'data' => t ( '<span class="element-invisible">Enabled</span>' ), 'class' => array ( 'checkbox' )),
array ( 'data' => t ( 'Name' ), 'class' => array ( 'name' )),
array ( 'data' => t ( 'Description' ), 'class' => array ( 'description' , RESPONSIVE_PRIORITY_LOW )),
2008-07-23 07:37:06 +00:00
),
2012-11-27 07:06:47 +00:00
// Ensure that the "Core" package comes first.
2010-09-05 15:38:16 +00:00
'#weight' => $package == 'Core' ? - 10 : NULL ,
2008-07-23 07:37:06 +00:00
);
2007-08-26 16:41:02 +00:00
}
2012-11-27 07:06:47 +00:00
// Lastly, sort all packages by title.
2010-09-05 15:38:16 +00:00
uasort ( $form [ 'modules' ], 'element_sort_by_title' );
Issue #1790280 by nod_, Bojhan, Wim Leers, danillonunes, deviantintegral, Kiphaas7, benjifisher, sun, yoroy, Everett Zufelt, jenlampton, aspilicious: Module page redesign 2.0.
2012-11-21 19:35:03 +00:00
$form [ '#attached' ][ 'library' ][] = array ( 'system' , 'drupal.system.modules' );
2010-04-24 14:49:14 +00:00
$form [ 'actions' ] = array ( '#type' => 'actions' );
2010-01-03 21:01:04 +00:00
$form [ 'actions' ][ 'submit' ] = array (
2007-08-26 16:41:02 +00:00
'#type' => 'submit' ,
'#value' => t ( 'Save configuration' ),
);
2010-01-04 21:31:52 +00:00
$form [ '#action' ] = url ( 'admin/modules/list/confirm' );
2007-08-26 16:41:02 +00:00
return $form ;
}
2007-12-16 21:01:45 +00:00
/**
2008-01-16 12:55:50 +00:00
* Array sorting callback ; sorts modules or themes by their name .
2007-12-16 21:01:45 +00:00
*/
2007-11-09 17:44:01 +00:00
function system_sort_modules_by_info_name ( $a , $b ) {
return strcasecmp ( $a -> info [ 'name' ], $b -> info [ 'name' ]);
}
2009-12-01 00:39:35 +00:00
/**
* Array sorting callback ; sorts modules or themes by their name .
*/
function system_sort_themes ( $a , $b ) {
if ( $a -> is_default ) {
return - 1 ;
}
if ( $b -> is_default ) {
return 1 ;
}
return strcasecmp ( $a -> info [ 'name' ], $b -> info [ 'name' ]);
}
2008-08-09 12:41:23 +00:00
/**
2008-07-23 07:37:06 +00:00
* Build a table row for the system modules page .
2007-08-26 16:41:02 +00:00
*/
2008-07-23 07:37:06 +00:00
function _system_modules_build_row ( $info , $extra ) {
// Add in the defaults.
$extra += array (
2009-01-14 12:18:37 +00:00
'requires' => array (),
'required_by' => array (),
2008-07-23 07:37:06 +00:00
'disabled' => FALSE ,
'enabled' => FALSE ,
2009-11-17 21:24:19 +00:00
'links' => array (),
2008-07-23 07:37:06 +00:00
);
$form = array (
'#tree' => TRUE ,
);
// Set the basic properties.
$form [ 'name' ] = array (
2009-11-15 21:21:01 +00:00
'#markup' => $info [ 'name' ],
2008-07-23 07:37:06 +00:00
);
$form [ 'description' ] = array (
'#markup' => t ( $info [ 'description' ]),
);
$form [ 'version' ] = array (
'#markup' => $info [ 'version' ],
);
2009-01-14 12:18:37 +00:00
$form [ '#requires' ] = $extra [ 'requires' ];
$form [ '#required_by' ] = $extra [ 'required_by' ];
2008-07-23 07:37:06 +00:00
// Check the compatibilities.
$compatible = TRUE ;
$status_short = '' ;
$status_long = '' ;
// Check the core compatibility.
2010-09-16 18:00:43 +00:00
if ( ! isset ( $info [ 'core' ]) || $info [ 'core' ] != DRUPAL_CORE_COMPATIBILITY ) {
2008-07-23 07:37:06 +00:00
$compatible = FALSE ;
2011-10-10 01:16:08 +00:00
$status_short .= t ( 'Incompatible with this version of Drupal core.' );
2010-01-15 13:32:41 +00:00
$status_long .= t ( 'This version is not compatible with Drupal !core_version and should be replaced.' , array ( '!core_version' => DRUPAL_CORE_COMPATIBILITY ));
2008-07-23 07:37:06 +00:00
}
// Ensure this module is compatible with the currently installed version of PHP.
if ( version_compare ( phpversion (), $info [ 'php' ]) < 0 ) {
$compatible = FALSE ;
$status_short .= t ( 'Incompatible with this version of PHP' );
2010-10-03 00:47:51 +00:00
$php_required = $info [ 'php' ];
2008-07-23 07:37:06 +00:00
if ( substr_count ( $info [ 'php' ], '.' ) < 2 ) {
$php_required .= '.*' ;
}
$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 ()));
}
// If this module is compatible, present a checkbox indicating
// this module may be installed. Otherwise, show a big red X.
if ( $compatible ) {
$form [ 'enable' ] = array (
'#type' => 'checkbox' ,
'#title' => t ( 'Enable' ),
'#default_value' => $extra [ 'enabled' ],
Issue #1790280 by nod_, Bojhan, Wim Leers, danillonunes, deviantintegral, Kiphaas7, benjifisher, sun, yoroy, Everett Zufelt, jenlampton, aspilicious: Module page redesign 2.0.
2012-11-21 19:35:03 +00:00
'#attributes' => array ( 'role' => 'disabled' ),
2008-07-23 07:37:06 +00:00
);
if ( $extra [ 'disabled' ]) {
$form [ 'enable' ][ '#disabled' ] = TRUE ;
}
}
else {
$form [ 'enable' ] = array (
2011-11-25 03:09:40 +00:00
'#markup' => theme ( 'image' , array ( 'uri' => 'core/misc/watchdog-error.png' , 'alt' => $status_short , 'title' => $status_short )),
2008-07-23 07:37:06 +00:00
);
2009-10-09 01:00:08 +00:00
$form [ 'description' ][ '#markup' ] .= theme ( 'system_modules_incompatible' , array ( 'message' => $status_long ));
2008-07-23 07:37:06 +00:00
}
2009-11-17 21:24:19 +00:00
// Build operation links.
foreach ( array ( 'help' , 'permissions' , 'configure' ) as $key ) {
$form [ 'links' ][ $key ] = ( isset ( $extra [ 'links' ][ $key ]) ? $extra [ 'links' ][ $key ] : array ());
2007-08-26 16:41:02 +00:00
}
2009-11-17 21:24:19 +00:00
2007-08-26 16:41:02 +00:00
return $form ;
}
/**
* Submit callback ; handles modules form submission .
*/
function system_modules_submit ( $form , & $form_state ) {
2011-10-31 04:05:57 +00:00
include_once DRUPAL_ROOT . '/core/includes/install.inc' ;
2010-05-26 07:31:47 +00:00
// Builds list of modules.
2008-07-23 07:37:06 +00:00
$modules = array ();
// If we're not coming from the confirmation form, build the list of modules.
2009-11-21 17:01:31 +00:00
if ( empty ( $form_state [ 'storage' ])) {
2010-05-26 07:31:47 +00:00
// If we're not coming from the confirmation form, build the module list.
2008-07-23 07:37:06 +00:00
foreach ( $form_state [ 'values' ][ 'modules' ] as $group_name => $group ) {
foreach ( $group as $module => $enabled ) {
$modules [ $module ] = array ( 'group' => $group_name , 'enabled' => $enabled [ 'enable' ]);
2007-08-26 16:41:02 +00:00
}
}
}
else {
2008-07-23 07:37:06 +00:00
// If we are coming from the confirmation form, fetch
// the modules out of $form_state.
$modules = $form_state [ 'storage' ][ 'modules' ];
2007-08-26 16:41:02 +00:00
}
2010-05-26 07:31:47 +00:00
// Collect data for all modules to be able to determine dependencies.
2009-10-13 05:26:57 +00:00
$files = system_rebuild_module_data ();
2008-07-23 07:37:06 +00:00
2010-05-26 07:31:47 +00:00
// Sorts modules by weight.
$sort = array ();
foreach ( array_keys ( $modules ) as $module ) {
$sort [ $module ] = $files [ $module ] -> sort ;
}
array_multisort ( $sort , $modules );
2009-12-08 06:39:34 +00:00
2010-05-26 07:31:47 +00:00
// Makes sure all required modules are set to be enabled.
$more_required = array ();
$missing_modules = array ();
2008-07-23 07:37:06 +00:00
foreach ( $modules as $name => $module ) {
if ( $module [ 'enabled' ]) {
2010-05-26 07:31:47 +00:00
// Checks that all dependencies are set to be enabled. Stores the ones
// that are not in $dependencies variable so that the user can be alerted
// in the confirmation form that more modules need to be enabled.
$dependencies = array ();
foreach ( array_keys ( $files [ $name ] -> requires ) as $required ) {
if ( empty ( $modules [ $required ][ 'enabled' ])) {
if ( isset ( $files [ $required ])) {
$dependencies [] = $files [ $required ] -> info [ 'name' ];
$modules [ $required ][ 'enabled' ] = TRUE ;
2009-12-08 06:39:34 +00:00
}
else {
2010-05-26 07:31:47 +00:00
$missing_modules [ $required ][ 'depends' ][] = $name ;
$modules [ $name ][ 'enabled' ] = FALSE ;
2008-07-23 07:37:06 +00:00
}
}
}
2010-05-26 07:31:47 +00:00
// Stores additional modules that need to be enabled in $more_required.
if ( ! empty ( $dependencies )) {
$more_required [ $name ] = array (
'name' => $files [ $name ] -> info [ 'name' ],
'requires' => $dependencies ,
);
}
2008-07-23 07:37:06 +00:00
}
}
2009-12-08 06:39:34 +00:00
2010-05-26 07:31:47 +00:00
// Redirects to confirmation form if more modules need to be enabled.
if (( ! empty ( $more_required ) || ! empty ( $missing_modules )) && ! isset ( $form_state [ 'values' ][ 'confirm' ])) {
2009-12-08 06:39:34 +00:00
$form_state [ 'storage' ] = array (
2010-05-26 07:31:47 +00:00
'more_required' => $more_required ,
'modules' => $modules ,
2009-12-08 06:39:34 +00:00
'missing_modules' => $missing_modules ,
);
$form_state [ 'rebuild' ] = TRUE ;
return ;
2007-08-26 16:41:02 +00:00
}
2010-05-26 07:31:47 +00:00
// Invokes hook_requirements('install'). If failures are detected, makes sure
// the dependent modules aren't installed either.
foreach ( $modules as $name => $module ) {
// Only invoke hook_requirements() on modules that are going to be installed.
if ( $module [ 'enabled' ] && drupal_get_installed_schema_version ( $name ) == SCHEMA_UNINSTALLED ) {
if ( ! drupal_check_module ( $name )) {
$modules [ $name ][ 'enabled' ] = FALSE ;
foreach ( array_keys ( $files [ $name ] -> required_by ) as $required_by ) {
$modules [ $required_by ][ 'enabled' ] = FALSE ;
}
}
2009-01-14 12:18:37 +00:00
}
2007-08-26 16:41:02 +00:00
}
2010-05-26 07:31:47 +00:00
// Initializes array of actions.
$actions = array (
'enable' => array (),
'disable' => array (),
'install' => array (),
);
// Builds arrays of modules that need to be enabled, disabled, and installed.
foreach ( $modules as $name => $module ) {
if ( $module [ 'enabled' ]) {
if ( drupal_get_installed_schema_version ( $name ) == SCHEMA_UNINSTALLED ) {
$actions [ 'install' ][] = $name ;
2010-10-01 18:37:23 +00:00
$actions [ 'enable' ][] = $name ;
2010-05-26 07:31:47 +00:00
}
elseif ( ! module_exists ( $name )) {
$actions [ 'enable' ][] = $name ;
2008-07-23 07:37:06 +00:00
}
2007-08-26 16:41:02 +00:00
}
2010-05-26 07:31:47 +00:00
elseif ( module_exists ( $name )) {
$actions [ 'disable' ][] = $name ;
}
2007-08-26 16:41:02 +00:00
}
2010-05-26 07:31:47 +00:00
// Gets list of modules prior to install process, unsets $form_state['storage']
// so we don't get redirected back to the confirmation form.
2013-06-05 01:58:17 +00:00
$pre_install_list = Drupal :: moduleHandler () -> getModuleList ();
2010-05-26 07:31:47 +00:00
unset ( $form_state [ 'storage' ]);
2010-10-01 18:37:23 +00:00
// Reverse the 'enable' list, to order dependencies before dependents.
2010-10-05 00:22:24 +00:00
krsort ( $actions [ 'enable' ]);
2010-10-01 18:37:23 +00:00
2010-05-26 07:31:47 +00:00
// Installs, enables, and disables modules.
2010-10-01 18:37:23 +00:00
module_enable ( $actions [ 'enable' ], FALSE );
module_disable ( $actions [ 'disable' ], FALSE );
2010-05-26 07:31:47 +00:00
2010-10-01 18:37:23 +00:00
// Gets module list after install process, flushes caches and displays a
// message if there are changes.
2013-06-05 01:58:17 +00:00
$post_install_list = Drupal :: moduleHandler () -> getModuleList ();
2010-05-26 07:31:47 +00:00
if ( $pre_install_list != $post_install_list ) {
2010-10-01 18:37:23 +00:00
drupal_flush_all_caches ();
2007-08-26 16:41:02 +00:00
drupal_set_message ( t ( 'The configuration options have been saved.' ));
}
2010-01-04 21:31:52 +00:00
$form_state [ 'redirect' ] = 'admin/modules' ;
2007-08-26 16:41:02 +00:00
}
/**
* Uninstall functions
*/
/**
2013-05-19 15:41:59 +00:00
* Form constructor for the uninstalling disabled modules form .
2007-08-26 16:41:02 +00:00
*
2013-05-19 15:41:59 +00:00
* @ see system_menu ()
2008-01-08 10:35:43 +00:00
* @ see system_modules_uninstall_validate ()
* @ see system_modules_uninstall_submit ()
2013-05-19 15:41:59 +00:00
*
* @ ingroup forms
2007-08-26 16:41:02 +00:00
*/
2009-09-18 00:12:48 +00:00
function system_modules_uninstall ( $form , $form_state = NULL ) {
2007-08-26 16:41:02 +00:00
// Make sure the install API is available.
2011-10-31 04:05:57 +00:00
include_once DRUPAL_ROOT . '/core/includes/install.inc' ;
2007-08-26 16:41:02 +00:00
// Display the confirm form if any modules have been submitted.
2013-05-19 15:41:59 +00:00
if ( ! empty ( $form_state [ 'storage' ][ 'uninstall' ]) && $modules = array_filter ( $form_state [ 'storage' ][ 'uninstall' ])) {
// Contents of confirm form is injected here because already in form
// building function.
$confirm_form = new ModulesUninstallConfirmForm ();
return $confirm_form -> buildForm ( $form , $form_state , $modules );
2007-08-26 16:41:02 +00:00
}
2010-11-20 03:34:30 +00:00
// Get a list of disabled, installed modules.
$all_modules = system_rebuild_module_data ();
$disabled_modules = array ();
foreach ( $all_modules as $name => $module ) {
2012-10-09 20:32:40 +00:00
if ( empty ( $module -> status ) && drupal_get_installed_schema_version ( $name ) > SCHEMA_UNINSTALLED ) {
2010-11-20 03:34:30 +00:00
$disabled_modules [ $name ] = $module ;
2007-08-26 16:41:02 +00:00
}
}
2010-11-20 03:34:30 +00:00
// Only build the rest of the form if there are any modules available to
// uninstall.
if ( ! empty ( $disabled_modules )) {
$profile = drupal_get_profile ();
uasort ( $disabled_modules , 'system_sort_modules_by_info_name' );
$form [ 'uninstall' ] = array ( '#tree' => TRUE );
foreach ( $disabled_modules as $module ) {
$module_name = $module -> info [ 'name' ] ? $module -> info [ 'name' ] : $module -> name ;
$form [ 'modules' ][ $module -> name ][ '#module_name' ] = $module_name ;
$form [ 'modules' ][ $module -> name ][ 'name' ][ '#markup' ] = $module_name ;
$form [ 'modules' ][ $module -> name ][ 'description' ][ '#markup' ] = t ( $module -> info [ 'description' ]);
$form [ 'uninstall' ][ $module -> name ] = array (
'#type' => 'checkbox' ,
'#title' => t ( 'Uninstall @module module' , array ( '@module' => $module_name )),
'#title_display' => 'invisible' ,
);
// All modules which depend on this one must be uninstalled first, before
2012-10-05 16:11:15 +00:00
// we can allow this module to be uninstalled. (The installation profile
// is excluded from this list.)
2010-11-20 03:34:30 +00:00
foreach ( array_keys ( $module -> required_by ) as $dependent ) {
if ( $dependent != $profile && drupal_get_installed_schema_version ( $dependent ) != SCHEMA_UNINSTALLED ) {
$dependent_name = isset ( $all_modules [ $dependent ] -> info [ 'name' ]) ? $all_modules [ $dependent ] -> info [ 'name' ] : $dependent ;
$form [ 'modules' ][ $module -> name ][ '#required_by' ][] = $dependent_name ;
$form [ 'uninstall' ][ $module -> name ][ '#disabled' ] = TRUE ;
}
}
}
2010-04-24 14:49:14 +00:00
$form [ 'actions' ] = array ( '#type' => 'actions' );
2010-01-03 21:01:04 +00:00
$form [ 'actions' ][ 'submit' ] = array (
2007-08-26 16:41:02 +00:00
'#type' => 'submit' ,
'#value' => t ( 'Uninstall' ),
);
2010-01-04 21:31:52 +00:00
$form [ '#action' ] = url ( 'admin/modules/uninstall/confirm' );
2007-08-26 16:41:02 +00:00
}
else {
$form [ 'modules' ] = array ();
}
return $form ;
}
/**
* Validates the submitted uninstall form .
*/
function system_modules_uninstall_validate ( $form , & $form_state ) {
// Form submitted, but no modules selected.
if ( ! count ( array_filter ( $form_state [ 'values' ][ 'uninstall' ]))) {
drupal_set_message ( t ( 'No modules selected.' ), 'error' );
2010-01-04 21:31:52 +00:00
drupal_goto ( 'admin/modules/uninstall' );
2007-08-26 16:41:02 +00:00
}
}
/**
* Processes the submitted uninstall form .
*/
function system_modules_uninstall_submit ( $form , & $form_state ) {
// Make sure the install API is available.
2011-10-31 04:05:57 +00:00
include_once DRUPAL_ROOT . '/core/includes/install.inc' ;
2007-08-26 16:41:02 +00:00
if ( ! empty ( $form [ '#confirmed' ])) {
// Call the uninstall routine for each selected module.
2008-10-11 22:46:22 +00:00
$modules = array_keys ( $form_state [ 'values' ][ 'uninstall' ]);
2012-07-07 18:50:30 +00:00
module_uninstall ( $modules );
2007-08-26 16:41:02 +00:00
drupal_set_message ( t ( 'The selected modules have been uninstalled.' ));
2010-01-04 21:31:52 +00:00
$form_state [ 'redirect' ] = 'admin/modules/uninstall' ;
2007-08-26 16:41:02 +00:00
}
else {
$form_state [ 'storage' ] = $form_state [ 'values' ];
2009-11-21 14:06:46 +00:00
$form_state [ 'rebuild' ] = TRUE ;
2007-08-26 16:41:02 +00:00
}
}
/**
* Default page callback for batches .
*/
function system_batch_page () {
2011-10-31 04:05:57 +00:00
require_once DRUPAL_ROOT . '/core/includes/batch.inc' ;
2007-08-26 16:41:02 +00:00
$output = _batch_page ();
2009-10-13 21:34:15 +00:00
2007-08-26 16:41:02 +00:00
if ( $output === FALSE ) {
2012-06-04 12:06:09 +00:00
throw new AccessDeniedHttpException ();
2007-08-26 16:41:02 +00:00
}
2012-04-13 05:01:33 +00:00
elseif ( $output instanceof Response ) {
return $output ;
}
2007-08-26 16:41:02 +00:00
elseif ( isset ( $output )) {
// Force a page without blocks or messages to
// display a list of collected messages later.
2009-05-21 21:12:25 +00:00
drupal_set_page_content ( $output );
$page = element_info ( 'page' );
2009-01-27 00:22:27 +00:00
$page [ '#show_messages' ] = FALSE ;
return $page ;
2007-08-26 16:41:02 +00:00
}
}
/**
2010-04-13 15:23:03 +00:00
* Returns HTML for an administrative block for display .
2007-08-26 16:41:02 +00:00
*
2009-10-09 01:00:08 +00:00
* @ param $variables
* An associative array containing :
2010-10-01 15:24:18 +00:00
* - block : An array containing information about the block :
* - show : A Boolean whether to output the block . Defaults to FALSE .
* - title : The block ' s title .
* - content : ( optional ) Formatted content for the block .
* - description : ( optional ) Description of the block . Only output if
* 'content' is not set .
2009-10-09 01:00:08 +00:00
*
2007-12-06 09:58:34 +00:00
* @ ingroup themeable
2007-08-26 16:41:02 +00:00
*/
2009-10-09 01:00:08 +00:00
function theme_admin_block ( $variables ) {
$block = $variables [ 'block' ];
2010-10-01 15:24:18 +00:00
$output = '' ;
2009-10-09 01:00:08 +00:00
2007-08-26 16:41:02 +00:00
// Don't display the block if it has no content to display.
2009-08-25 10:37:36 +00:00
if ( empty ( $block [ 'show' ])) {
2010-10-01 15:24:18 +00:00
return $output ;
2007-08-26 16:41:02 +00:00
}
2010-10-01 15:24:18 +00:00
$output .= '<div class="admin-panel">' ;
if ( ! empty ( $block [ 'title' ])) {
$output .= '<h3>' . $block [ 'title' ] . '</h3>' ;
}
if ( ! empty ( $block [ 'content' ])) {
$output .= '<div class="body">' . $block [ 'content' ] . '</div>' ;
2009-08-21 07:59:47 +00:00
}
else {
2010-10-01 15:24:18 +00:00
$output .= '<div class="description">' . $block [ 'description' ] . '</div>' ;
2009-08-21 07:59:47 +00:00
}
2010-10-01 15:24:18 +00:00
$output .= '</div>' ;
2007-08-26 16:41:02 +00:00
return $output ;
}
/**
2010-04-13 15:23:03 +00:00
* Returns HTML for the content of an administrative block .
2007-08-26 16:41:02 +00:00
*
2009-10-09 01:00:08 +00:00
* @ param $variables
* An associative array containing :
2010-10-01 15:24:18 +00:00
* - content : An array containing information about the block . Each element
* of the array represents an administrative menu item , and must at least
* contain the keys 'title' , 'href' , and 'localized_options' , which are
* passed to l () . A 'description' key may also be provided .
2009-10-09 01:00:08 +00:00
*
2007-12-06 09:58:34 +00:00
* @ ingroup themeable
2007-08-26 16:41:02 +00:00
*/
2009-10-09 01:00:08 +00:00
function theme_admin_block_content ( $variables ) {
$content = $variables [ 'content' ];
2010-10-01 15:24:18 +00:00
$output = '' ;
2009-10-09 01:00:08 +00:00
2010-10-01 15:24:18 +00:00
if ( ! empty ( $content )) {
$class = 'admin-list' ;
if ( $compact = system_admin_compact_mode ()) {
$class .= ' compact' ;
2007-08-26 16:41:02 +00:00
}
2010-10-01 15:24:18 +00:00
$output .= '<dl class="' . $class . '">' ;
2007-08-26 16:41:02 +00:00
foreach ( $content as $item ) {
2008-04-14 17:48:46 +00:00
$output .= '<dt>' . l ( $item [ 'title' ], $item [ 'href' ], $item [ 'localized_options' ]) . '</dt>' ;
2010-10-01 15:24:18 +00:00
if ( ! $compact && isset ( $item [ 'description' ])) {
$output .= '<dd>' . filter_xss_admin ( $item [ 'description' ]) . '</dd>' ;
}
2007-08-26 16:41:02 +00:00
}
$output .= '</dl>' ;
}
return $output ;
}
/**
2010-04-13 15:23:03 +00:00
* Returns HTML for an administrative page .
2007-08-26 16:41:02 +00:00
*
2009-10-09 01:00:08 +00:00
* @ param $variables
* An associative array containing :
* - blocks : An array of blocks to display . Each array should include a
2010-04-13 15:23:03 +00:00
* 'title' , a 'description' , a formatted 'content' and a 'position' which
* will control which container it will be in . This is usually 'left' or
* 'right' .
2009-10-09 01:00:08 +00:00
*
2007-12-06 09:58:34 +00:00
* @ ingroup themeable
2007-08-26 16:41:02 +00:00
*/
2009-10-09 01:00:08 +00:00
function theme_admin_page ( $variables ) {
$blocks = $variables [ 'blocks' ];
2007-08-26 16:41:02 +00:00
$stripe = 0 ;
$container = array ();
foreach ( $blocks as $block ) {
2009-10-09 01:00:08 +00:00
if ( $block_output = theme ( 'admin_block' , array ( 'block' => $block ))) {
2007-08-26 16:41:02 +00:00
if ( empty ( $block [ 'position' ])) {
// perform automatic striping.
$block [ 'position' ] = ++ $stripe % 2 ? 'left' : 'right' ;
}
if ( ! isset ( $container [ $block [ 'position' ]])) {
$container [ $block [ 'position' ]] = '' ;
}
$container [ $block [ 'position' ]] .= $block_output ;
}
}
2009-02-18 14:28:25 +00:00
$output = '<div class="admin clearfix">' ;
2008-02-20 13:46:43 +00:00
$output .= theme ( 'system_compact_link' );
2007-08-26 16:41:02 +00:00
foreach ( $container as $id => $data ) {
2009-02-18 14:28:25 +00:00
$output .= '<div class="' . $id . ' clearfix">' ;
2007-08-26 16:41:02 +00:00
$output .= $data ;
$output .= '</div>' ;
}
$output .= '</div>' ;
return $output ;
}
/**
2012-07-22 04:23:27 +00:00
* Returns HTML for the output of the admin index page .
2007-12-06 09:58:34 +00:00
*
2009-10-09 01:00:08 +00:00
* @ param $variables
* An associative array containing :
* - menu_items : An array of modules to be displayed .
*
2007-12-06 09:58:34 +00:00
* @ ingroup themeable
2007-08-26 16:41:02 +00:00
*/
2010-10-01 15:24:18 +00:00
function theme_system_admin_index ( $variables ) {
2009-10-09 01:00:08 +00:00
$menu_items = $variables [ 'menu_items' ];
2007-08-26 16:41:02 +00:00
$stripe = 0 ;
$container = array ( 'left' => '' , 'right' => '' );
$flip = array ( 'left' => 'right' , 'right' => 'left' );
$position = 'left' ;
2010-04-22 09:54:26 +00:00
// Iterate over all modules.
2007-08-26 16:41:02 +00:00
foreach ( $menu_items as $module => $block ) {
list ( $description , $items ) = $block ;
2010-04-22 09:54:26 +00:00
// Output links.
2007-08-26 16:41:02 +00:00
if ( count ( $items )) {
$block = array ();
$block [ 'title' ] = $module ;
2010-10-01 15:24:18 +00:00
$block [ 'content' ] = theme ( 'admin_block_content' , array ( 'content' => $items ));
2007-08-26 16:41:02 +00:00
$block [ 'description' ] = t ( $description );
2009-08-25 10:37:36 +00:00
$block [ 'show' ] = TRUE ;
2007-08-26 16:41:02 +00:00
2009-10-09 01:00:08 +00:00
if ( $block_output = theme ( 'admin_block' , array ( 'block' => $block ))) {
2007-08-26 16:41:02 +00:00
if ( ! isset ( $block [ 'position' ])) {
// Perform automatic striping.
$block [ 'position' ] = $position ;
$position = $flip [ $position ];
}
$container [ $block [ 'position' ]] .= $block_output ;
}
}
}
2009-02-18 14:28:25 +00:00
$output = '<div class="admin clearfix">' ;
2010-10-01 15:24:18 +00:00
$output .= theme ( 'system_compact_link' );
2007-08-26 16:41:02 +00:00
foreach ( $container as $id => $data ) {
2009-02-18 14:28:25 +00:00
$output .= '<div class="' . $id . ' clearfix">' ;
2007-08-26 16:41:02 +00:00
$output .= $data ;
$output .= '</div>' ;
}
$output .= '</div>' ;
return $output ;
}
/**
2010-04-13 15:23:03 +00:00
* Returns HTML for the status report .
2007-08-30 15:31:46 +00:00
*
2009-10-09 01:00:08 +00:00
* @ param $variables
* An associative array containing :
* - requirements : An array of requirements .
*
2007-08-26 16:41:02 +00:00
* @ ingroup themeable
*/
2009-10-09 01:00:08 +00:00
function theme_status_report ( $variables ) {
$requirements = $variables [ 'requirements' ];
2010-10-09 05:18:53 +00:00
$severities = array (
REQUIREMENT_INFO => array (
'title' => t ( 'Info' ),
'class' => 'info' ,
),
REQUIREMENT_OK => array (
'title' => t ( 'OK' ),
'class' => 'ok' ,
),
REQUIREMENT_WARNING => array (
'title' => t ( 'Warning' ),
'class' => 'warning' ,
),
REQUIREMENT_ERROR => array (
'title' => t ( 'Error' ),
'class' => 'error' ,
),
);
2013-02-06 12:03:53 +00:00
$output = '<table class="system-status-report"><thead><tr class="element-invisible">' ;
$output .= '<th>' . t ( 'Status' ) . '</th><th>' . t ( 'Component' ) . '</th><th>' . t ( 'Details' ) . '</th>' ;
$output .= '</tr></thead><tbody>' ;
2010-10-09 05:18:53 +00:00
2007-08-26 16:41:02 +00:00
foreach ( $requirements as $requirement ) {
if ( empty ( $requirement [ '#type' ])) {
2012-05-26 18:46:07 +00:00
// Always use the explicit requirement severity, if defined. Otherwise,
// default to REQUIREMENT_OK in the installer to visually confirm that
// installation requirements are met. And default to REQUIREMENT_INFO to
// denote neutral information without special visualization.
if ( isset ( $requirement [ 'severity' ])) {
$severity = $severities [( int ) $requirement [ 'severity' ]];
}
elseif ( defined ( 'MAINTENANCE_MODE' ) && MAINTENANCE_MODE == 'install' ) {
$severity = $severities [ REQUIREMENT_OK ];
}
else {
$severity = $severities [ REQUIREMENT_INFO ];
}
2010-10-09 05:18:53 +00:00
$severity [ 'icon' ] = '<div title="' . $severity [ 'title' ] . '"><span class="element-invisible">' . $severity [ 'title' ] . '</span></div>' ;
2007-08-26 16:41:02 +00:00
2012-05-26 18:46:07 +00:00
// Output table rows.
$output .= '<tr class="' . $severity [ 'class' ] . '">' ;
$output .= '<td class="status-icon">' . $severity [ 'icon' ] . '</td>' ;
$output .= '<td class="status-title">' . $requirement [ 'title' ] . '</td>' ;
$output .= '<td class="status-value">' . $requirement [ 'value' ];
2007-08-26 16:41:02 +00:00
if ( ! empty ( $requirement [ 'description' ])) {
2012-05-26 18:46:07 +00:00
$output .= '<div class="description">' . $requirement [ 'description' ] . '</div>' ;
2007-08-26 16:41:02 +00:00
}
2012-05-26 18:46:07 +00:00
$output .= '</td></tr>' ;
2007-08-26 16:41:02 +00:00
}
}
2012-05-26 18:46:07 +00:00
$output .= '</tbody></table>' ;
2007-08-26 16:41:02 +00:00
return $output ;
}
/**
2010-04-13 15:23:03 +00:00
* Returns HTML for the modules form .
2007-08-30 15:31:46 +00:00
*
2009-10-09 01:00:08 +00:00
* @ param $variables
* An associative array containing :
2010-04-13 15:23:03 +00:00
* - form : A render element representing the form .
2009-10-09 01:00:08 +00:00
*
2007-08-26 16:41:02 +00:00
* @ ingroup themeable
*/
2012-11-27 07:06:47 +00:00
function theme_system_modules_details ( $variables ) {
2009-10-09 01:00:08 +00:00
$form = $variables [ 'form' ];
2007-08-26 16:41:02 +00:00
// Individual table headers.
2008-07-23 07:37:06 +00:00
$rows = array ();
2012-11-27 07:06:47 +00:00
// Iterate through all the modules, which are children of this element.
2008-07-23 07:37:06 +00:00
foreach ( element_children ( $form ) as $key ) {
Issue #1790280 by nod_, Bojhan, Wim Leers, danillonunes, deviantintegral, Kiphaas7, benjifisher, sun, yoroy, Everett Zufelt, jenlampton, aspilicious: Module page redesign 2.0.
2012-11-21 19:35:03 +00:00
// Stick the key into $module for easier access.
2008-07-23 07:37:06 +00:00
$module = $form [ $key ];
Issue #1790280 by nod_, Bojhan, Wim Leers, danillonunes, deviantintegral, Kiphaas7, benjifisher, sun, yoroy, Everett Zufelt, jenlampton, aspilicious: Module page redesign 2.0.
2012-11-21 19:35:03 +00:00
// Create the row for the table.
2008-07-23 07:37:06 +00:00
$row = array ();
Issue #1790280 by nod_, Bojhan, Wim Leers, danillonunes, deviantintegral, Kiphaas7, benjifisher, sun, yoroy, Everett Zufelt, jenlampton, aspilicious: Module page redesign 2.0.
2012-11-21 19:35:03 +00:00
// Add the checkbox into the first cell.
2008-07-23 07:37:06 +00:00
unset ( $module [ 'enable' ][ '#title' ]);
Issue #1790280 by nod_, Bojhan, Wim Leers, danillonunes, deviantintegral, Kiphaas7, benjifisher, sun, yoroy, Everett Zufelt, jenlampton, aspilicious: Module page redesign 2.0.
2012-11-21 19:35:03 +00:00
$module [ '#requires' ] = array_filter ( $module [ '#requires' ]);
$module [ '#required_by' ] = array_filter ( $module [ '#required_by' ]);
$requires = ! empty ( $module [ '#requires' ]);
$required_by = ! empty ( $module [ '#required_by' ]);
$version = ! empty ( $module [ 'version' ][ '#markup' ]);
2009-08-22 14:34:23 +00:00
$row [] = array ( 'class' => array ( 'checkbox' ), 'data' => drupal_render ( $module [ 'enable' ]));
Issue #1790280 by nod_, Bojhan, Wim Leers, danillonunes, deviantintegral, Kiphaas7, benjifisher, sun, yoroy, Everett Zufelt, jenlampton, aspilicious: Module page redesign 2.0.
2012-11-21 19:35:03 +00:00
// Add the module label and expand/collapse functionalty.
2013-04-05 16:04:10 +00:00
$col2 = '<label id="module-' . $key . '" for="' . $module [ 'enable' ][ '#id' ] . '" class="module-name table-filter-text-source">' . drupal_render ( $module [ 'name' ]) . '</label>' ;
Issue #1790280 by nod_, Bojhan, Wim Leers, danillonunes, deviantintegral, Kiphaas7, benjifisher, sun, yoroy, Everett Zufelt, jenlampton, aspilicious: Module page redesign 2.0.
2012-11-21 19:35:03 +00:00
$row [] = array ( 'class' => array ( 'module' ), 'data' => $col2 );
2009-01-14 12:18:37 +00:00
// Add the description, along with any modules it requires.
2013-02-09 00:41:02 +00:00
$description = '<span class="details"><span class="text table-filter-text-source">' . drupal_render ( $module [ 'description' ]) . '</span></span>' ;
Issue #1790280 by nod_, Bojhan, Wim Leers, danillonunes, deviantintegral, Kiphaas7, benjifisher, sun, yoroy, Everett Zufelt, jenlampton, aspilicious: Module page redesign 2.0.
2012-11-21 19:35:03 +00:00
if ( $version || $requires || $required_by ) {
$description .= ' <div class="requirements">' ;
if ( $version ) {
$description .= '<div class="admin-requirements">' . t ( 'Version: !module-version' , array ( '!module-version' => drupal_render ( $module [ 'version' ]))) . '</div>' ;
}
if ( $requires ) {
$description .= '<div class="admin-requirements">' . t ( 'Requires: !module-list' , array ( '!module-list' => implode ( ', ' , $module [ '#requires' ]))) . '</div>' ;
}
if ( $required_by ) {
$description .= '<div class="admin-requirements">' . t ( 'Required by: !module-list' , array ( '!module-list' => implode ( ', ' , $module [ '#required_by' ]))) . '</div>' ;
}
$description .= '</div>' ;
2008-07-23 07:37:06 +00:00
}
Issue #1790280 by nod_, Bojhan, Wim Leers, danillonunes, deviantintegral, Kiphaas7, benjifisher, sun, yoroy, Everett Zufelt, jenlampton, aspilicious: Module page redesign 2.0.
2012-11-21 19:35:03 +00:00
$links = '' ;
2009-11-17 21:24:19 +00:00
foreach ( array ( 'help' , 'permissions' , 'configure' ) as $key ) {
Issue #1790280 by nod_, Bojhan, Wim Leers, danillonunes, deviantintegral, Kiphaas7, benjifisher, sun, yoroy, Everett Zufelt, jenlampton, aspilicious: Module page redesign 2.0.
2012-11-21 19:35:03 +00:00
$links .= drupal_render ( $module [ 'links' ][ $key ]);
2009-11-17 21:24:19 +00:00
}
Issue #1790280 by nod_, Bojhan, Wim Leers, danillonunes, deviantintegral, Kiphaas7, benjifisher, sun, yoroy, Everett Zufelt, jenlampton, aspilicious: Module page redesign 2.0.
2012-11-21 19:35:03 +00:00
if ( $links ) {
$description .= ' <div class="links">' ;
$description .= $links ;
$description .= '</div>' ;
}
$col4 = '<div class="inner" tabindex="0" role="button"><span class="module-description-prefix element-invisible">Show description</span> ' . $description . '</div>' ;
$row [] = array ( 'class' => array ( 'description' , 'expand' ), 'data' => $col4 );
2008-07-23 07:37:06 +00:00
$rows [] = $row ;
2007-08-26 16:41:02 +00:00
}
2009-10-09 01:00:08 +00:00
return theme ( 'table' , array ( 'header' => $form [ '#header' ], 'rows' => $rows ));
2008-07-23 07:37:06 +00:00
}
/**
2010-04-13 15:23:03 +00:00
* Returns HTML for a message about incompatible modules .
2009-10-09 01:00:08 +00:00
*
* @ param $variables
* An associative array containing :
* - message : The form array representing the currently disabled modules .
*
2010-04-13 15:23:03 +00:00
* @ ingroup themeable
2008-07-23 07:37:06 +00:00
*/
2009-10-09 01:00:08 +00:00
function theme_system_modules_incompatible ( $variables ) {
return '<div class="incompatible">' . $variables [ 'message' ] . '</div>' ;
2007-08-26 16:41:02 +00:00
}
/**
2010-04-13 15:23:03 +00:00
* Returns HTML for a table of currently disabled modules .
2009-10-09 01:00:08 +00:00
*
* @ param $variables
* An associative array containing :
2010-04-13 15:23:03 +00:00
* - form : A render element representing the form .
2009-10-09 01:00:08 +00:00
*
2010-04-13 15:23:03 +00:00
* @ ingroup themeable
2007-08-26 16:41:02 +00:00
*/
2009-10-09 01:00:08 +00:00
function theme_system_modules_uninstall ( $variables ) {
$form = $variables [ 'form' ];
2007-08-26 16:41:02 +00:00
// No theming for the confirm form.
if ( isset ( $form [ 'confirm' ])) {
return drupal_render ( $form );
}
// Table headers.
$header = array ( t ( 'Uninstall' ),
t ( 'Name' ),
t ( 'Description' ),
);
// Display table.
$rows = array ();
foreach ( element_children ( $form [ 'modules' ]) as $module ) {
2010-11-20 03:34:30 +00:00
if ( ! empty ( $form [ 'modules' ][ $module ][ '#required_by' ])) {
$disabled_message = format_plural ( count ( $form [ 'modules' ][ $module ][ '#required_by' ]),
'To uninstall @module, the following module must be uninstalled first: @required_modules' ,
'To uninstall @module, the following modules must be uninstalled first: @required_modules' ,
array ( '@module' => $form [ 'modules' ][ $module ][ '#module_name' ], '@required_modules' => implode ( ', ' , $form [ 'modules' ][ $module ][ '#required_by' ])));
$disabled_message = '<div class="admin-requirements">' . $disabled_message . '</div>' ;
}
else {
$disabled_message = '' ;
}
2007-08-26 16:41:02 +00:00
$rows [] = array (
array ( 'data' => drupal_render ( $form [ 'uninstall' ][ $module ]), 'align' => 'center' ),
2008-04-30 06:39:26 +00:00
'<strong><label for="' . $form [ 'uninstall' ][ $module ][ '#id' ] . '">' . drupal_render ( $form [ 'modules' ][ $module ][ 'name' ]) . '</label></strong>' ,
2010-11-20 03:34:30 +00:00
array ( 'data' => drupal_render ( $form [ 'modules' ][ $module ][ 'description' ]) . $disabled_message , 'class' => array ( 'description' )),
2007-08-26 16:41:02 +00:00
);
}
2009-12-02 14:56:32 +00:00
$output = theme ( 'table' , array ( 'header' => $header , 'rows' => $rows , 'empty' => t ( 'No modules are available to uninstall.' )));
2009-02-03 18:55:32 +00:00
$output .= drupal_render_children ( $form );
2007-08-26 16:41:02 +00:00
return $output ;
}
/**
2010-04-13 15:23:03 +00:00
* Returns HTML for the Appearance page .
2007-08-26 16:41:02 +00:00
*
2009-10-09 01:00:08 +00:00
* @ param $variables
* An associative array containing :
2009-12-01 00:39:35 +00:00
* - theme_groups : An associative array containing groups of themes .
2009-10-09 01:00:08 +00:00
*
2007-08-26 16:41:02 +00:00
* @ ingroup themeable
*/
2009-12-01 00:39:35 +00:00
function theme_system_themes_page ( $variables ) {
$theme_groups = $variables [ 'theme_groups' ];
2009-10-09 01:00:08 +00:00
2009-12-01 00:39:35 +00:00
$output = '<div id="system-themes-page">' ;
foreach ( $variables [ 'theme_group_titles' ] as $state => $title ) {
if ( ! count ( $theme_groups [ $state ])) {
// Skip this group of themes if no theme is there.
2007-08-26 16:41:02 +00:00
continue ;
}
2009-12-01 00:39:35 +00:00
// Start new theme group.
$output .= '<div class="system-themes-list system-themes-list-' . $state . ' clearfix"><h2>' . $title . '</h2>' ;
2007-08-26 16:41:02 +00:00
2010-09-28 02:30:32 +00:00
foreach ( $theme_groups [ $state ] as $theme ) {
2007-08-26 16:41:02 +00:00
2009-12-01 00:39:35 +00:00
// Theme the screenshot.
2013-06-13 22:57:52 +00:00
$screenshot = $theme -> screenshot ? theme ( 'image' , $theme -> screenshot ) : '<div class="no-screenshot"><div class="no-screenshot__text">' . t ( 'no screenshot' ) . '</div></div>' ;
2007-08-26 16:41:02 +00:00
2009-12-01 00:39:35 +00:00
// Localize the theme description.
$description = t ( $theme -> info [ 'description' ]);
// Style theme info
$notes = count ( $theme -> notes ) ? ' (' . join ( ', ' , $theme -> notes ) . ')' : '' ;
$theme -> classes [] = 'theme-selector' ;
$theme -> classes [] = 'clearfix' ;
$output .= '<div class="' . join ( ' ' , $theme -> classes ) . '">' . $screenshot . '<div class="theme-info"><h3>' . $theme -> info [ 'name' ] . ' ' . ( isset ( $theme -> info [ 'version' ]) ? $theme -> info [ 'version' ] : '' ) . $notes . '</h3><div class="theme-description">' . $description . '</div>' ;
// Make sure to provide feedback on compatibility.
if ( ! empty ( $theme -> incompatible_core )) {
2010-01-15 13:32:41 +00:00
$output .= '<div class="incompatible">' . t ( 'This version is not compatible with Drupal !core_version and should be replaced.' , array ( '!core_version' => DRUPAL_CORE_COMPATIBILITY )) . '</div>' ;
2009-12-01 00:39:35 +00:00
}
elseif ( ! empty ( $theme -> incompatible_php )) {
if ( substr_count ( $theme -> info [ 'php' ], '.' ) < 2 ) {
$theme -> info [ 'php' ] .= '.*' ;
}
$output .= '<div class="incompatible">' . t ( 'This theme requires PHP version @php_required and is incompatible with PHP version !php_version.' , array ( '@php_required' => $theme -> info [ 'php' ], '!php_version' => phpversion ())) . '</div>' ;
}
2012-08-06 13:18:08 +00:00
elseif ( ! empty ( $theme -> incompatible_base )) {
$output .= '<div class="incompatible">' . t ( 'This theme requires the base theme @base_theme to operate correctly.' , array ( '@base_theme' => $theme -> info [ 'base theme' ])) . '</div>' ;
}
elseif ( ! empty ( $theme -> incompatible_engine )) {
$output .= '<div class="incompatible">' . t ( 'This theme requires the theme engine @theme_engine to operate correctly.' , array ( '@theme_engine' => $theme -> info [ 'engine' ])) . '</div>' ;
}
2009-12-01 00:39:35 +00:00
else {
$output .= theme ( 'links' , array ( 'links' => $theme -> operations , 'attributes' => array ( 'class' => array ( 'operations' , 'clearfix' ))));
}
$output .= '</div></div>' ;
2007-08-26 16:41:02 +00:00
}
2009-12-01 00:39:35 +00:00
$output .= '</div>' ;
2007-08-26 16:41:02 +00:00
}
2009-12-01 00:39:35 +00:00
$output .= '</div>' ;
2007-08-26 16:41:02 +00:00
return $output ;
2008-08-21 19:36:39 +00:00
}
2009-09-19 11:07:37 +00:00
2009-10-13 21:34:15 +00:00
/**
* Displays the date format strings overview page .
*/
function system_date_time_formats () {
2012-11-29 07:37:55 +00:00
$header = array (
array ( 'data' => t ( 'Machine name' ), 'field' => 'machine_name' ),
array ( 'data' => t ( 'Name' ), 'field' => 'name' ),
array ( 'data' => t ( 'Pattern' ), 'field' => 'pattern' ),
array ( 'data' => t ( 'Operations' ))
);
2009-10-13 21:34:15 +00:00
$rows = array ();
2012-11-29 07:37:55 +00:00
$formats = system_get_date_formats ();
2009-10-13 21:34:15 +00:00
if ( ! empty ( $formats )) {
2012-11-29 07:37:55 +00:00
foreach ( $formats as $date_format_id => $format_info ) {
// Do not display date formats that are locked.
if ( empty ( $format_info [ 'locked' ])) {
$row = array ();
$row [] = array ( 'data' => $date_format_id );
$row [] = array ( 'data' => $format_info [ 'name' ]);
$row [] = array ( 'data' => format_date ( REQUEST_TIME , $date_format_id ));
// Prepare Operational links.
$links = array ();
$links [ 'edit' ] = array (
2013-02-27 21:52:18 +00:00
'title' => t ( 'Edit' ),
2012-11-29 07:37:55 +00:00
'href' => 'admin/config/regional/date-time/formats/' . $date_format_id . '/edit' ,
);
$links [ 'delete' ] = array (
2013-02-27 21:52:18 +00:00
'title' => t ( 'Delete' ),
2012-11-29 07:37:55 +00:00
'href' => 'admin/config/regional/date-time/formats/' . $date_format_id . '/delete' ,
);
$row [ 'operations' ] = array ( 'data' => array (
2012-10-09 19:49:07 +00:00
'#type' => 'operations' ,
'#links' => $links ,
2012-11-29 07:37:55 +00:00
));
$rows [] = $row ;
}
2009-10-13 21:34:15 +00:00
}
}
$build [ 'date_formats_table' ] = array (
'#theme' => 'table' ,
'#header' => $header ,
'#rows' => $rows ,
2010-01-03 00:44:53 +00:00
'#empty' => t ( 'No custom date formats available. <a href="@link">Add date format</a>.' , array ( '@link' => url ( 'admin/config/regional/date-time/formats/add' ))),
2009-10-13 21:34:15 +00:00
);
return $build ;
}
/**
2012-11-29 07:37:55 +00:00
* Checks if the chosen machine_name exists or not .
*/
function system_date_format_exists ( $candidate_machine_name ) {
if ( $formats = system_get_date_formats ()) {
return array_key_exists ( $candidate_machine_name , $formats );
}
return FALSE ;
}
2012-06-16 14:38:11 +00:00
/**
2012-10-05 15:42:46 +00:00
* Page callback : Displays edit date format links for each language .
*
* @ see locale_menu ()
2012-06-16 14:38:11 +00:00
*/
function system_date_format_language_overview_page () {
2012-10-09 19:49:07 +00:00
$header = array ( t ( 'Language' ), t ( 'Operations' ));
2012-06-16 14:38:11 +00:00
$languages = language_list ();
foreach ( $languages as $langcode => $language ) {
$row = array ();
$row [] = $language -> name ;
2012-10-09 19:49:07 +00:00
$links = array ();
$links [ 'edit' ] = array (
2013-02-27 21:52:18 +00:00
'title' => t ( 'Edit' ),
2012-10-09 19:49:07 +00:00
'href' => " admin/config/regional/date-time/locale/ $langcode /edit " ,
);
$links [ 'reset' ] = array (
2013-02-27 21:52:18 +00:00
'title' => t ( 'Reset' ),
2012-10-09 19:49:07 +00:00
'href' => " admin/config/regional/date-time/locale/ $langcode /reset " ,
);
$row [] = array (
'data' => array (
'#type' => 'operations' ,
'#links' => $links ,
),
);
2012-06-16 14:38:11 +00:00
$rows [] = $row ;
}
return theme ( 'table' , array ( 'header' => $header , 'rows' => $rows ));
}
/**
2012-10-05 15:42:46 +00:00
* Form constructor for the date localization configuration form .
*
* @ param $langcode
* The code for the current language .
*
* @ see locale_menu ()
* @ see system_date_format_localize_form_submit ()
* @ ingroup forms
2012-06-16 14:38:11 +00:00
*/
function system_date_format_localize_form ( $form , & $form_state , $langcode ) {
// Display the current language name.
$form [ 'language' ] = array (
'#type' => 'item' ,
'#title' => t ( 'Language' ),
'#markup' => language_load ( $langcode ) -> name ,
'#weight' => - 10 ,
);
$form [ 'langcode' ] = array (
'#type' => 'value' ,
'#value' => $langcode ,
);
// Get list of available formats.
$formats = system_get_date_formats ();
$choices = array ();
2012-11-29 07:37:55 +00:00
foreach ( $formats as $date_format_id => $format_info ) {
// Ignore values that are localized.
if ( empty ( $format_info [ 'locales' ])) {
$choices [ $date_format_id ] = format_date ( REQUEST_TIME , $date_format_id );
}
else {
unset ( $formats [ $date_format_id ]);
2012-06-16 14:38:11 +00:00
}
}
// Get configured formats for each language.
$locale_formats = system_date_format_locale ( $langcode );
2012-11-29 07:37:55 +00:00
if ( ! empty ( $locale_formats )) {
$formats += $locale_formats ;
foreach ( $locale_formats as $date_format_id => $format_info ) {
$choices [ $date_format_id ] = format_date ( REQUEST_TIME , $date_format_id );
2012-06-16 14:38:11 +00:00
}
2012-11-29 07:37:55 +00:00
}
2012-06-16 14:38:11 +00:00
2012-11-29 07:37:55 +00:00
// Display a form field for each format type.
foreach ( $formats as $date_format_id => $format_info ) {
2012-06-16 14:38:11 +00:00
// Show date format select list.
2012-11-29 07:37:55 +00:00
$form [ 'date_formats' ][ 'date_format_' . $date_format_id ] = array (
2012-06-16 14:38:11 +00:00
'#type' => 'select' ,
2012-11-29 07:37:55 +00:00
'#title' => check_plain ( $format_info [ 'name' ]),
2012-06-16 14:38:11 +00:00
'#attributes' => array ( 'class' => array ( 'date-format' )),
2012-11-29 07:37:55 +00:00
'#default_value' => isset ( $choices [ $date_format_id ]) ? $date_format_id : 'custom' ,
2012-06-16 14:38:11 +00:00
'#options' => $choices ,
);
}
$form [ 'actions' ] = array ( '#type' => 'actions' );
$form [ 'actions' ][ 'submit' ] = array (
'#type' => 'submit' ,
'#value' => t ( 'Save configuration' ),
);
return $form ;
}
2012-11-04 21:32:20 +00:00
/**
* Ajax callback ; Returns the date for a given format string .
*/
function system_date_time_lookup ( $form , & $form_state ) {
$format = '' ;
2012-11-29 07:37:55 +00:00
if ( ! empty ( $form_state [ 'values' ][ 'date_format_pattern' ])) {
$format = t ( 'Displayed as %date_format' , array ( '%date_format' => format_date ( REQUEST_TIME , 'custom' , $form_state [ 'values' ][ 'date_format_pattern' ])));
2012-11-04 21:32:20 +00:00
}
// Return a command instead of a string, since the Ajax framework
// automatically prepends an additional empty DIV element for a string, which
// breaks the layout.
2013-04-09 20:30:46 +00:00
$response = new AjaxResponse ();
$response -> addCommand ( new ReplaceCommand ( '#edit-date-format-suffix' , '<small id="edit-date-format-suffix">' . $format . '</small>' ));
return $response ;
2012-11-04 21:32:20 +00:00
}
2012-06-16 14:38:11 +00:00
/**
2012-10-05 15:42:46 +00:00
* Form submission handler for system_date_format_localize_form () .
2012-06-16 14:38:11 +00:00
*/
function system_date_format_localize_form_submit ( $form , & $form_state ) {
$langcode = $form_state [ 'values' ][ 'langcode' ];
2012-11-29 07:37:55 +00:00
$formats = system_get_date_formats ();
foreach ( $formats as $date_format_id => $format_info ) {
if ( isset ( $form_state [ 'values' ][ 'date_format_' . $date_format_id ])) {
$format = $form_state [ 'values' ][ 'date_format_' . $date_format_id ];
system_date_format_localize_form_save ( $langcode , $date_format_id , $formats [ $format ][ 'pattern' ]);
2012-06-16 14:38:11 +00:00
}
}
drupal_set_message ( t ( 'Configuration saved.' ));
$form_state [ 'redirect' ] = 'admin/config/regional/date-time/locale' ;
}
/**
* Returns HTML for a locale date format form .
*
* @ param $variables
* An associative array containing :
* - form : A render element representing the form .
*
* @ ingroup themeable
*/
function theme_system_date_format_localize_form ( $variables ) {
$form = $variables [ 'form' ];
$header = array (
2012-11-29 07:37:55 +00:00
'machine_name' => t ( 'Machine Name' ),
'pattern' => t ( 'Format' ),
2012-06-16 14:38:11 +00:00
);
foreach ( element_children ( $form [ 'date_formats' ]) as $key ) {
$row = array ();
$row [] = $form [ 'date_formats' ][ $key ][ '#title' ];
unset ( $form [ 'date_formats' ][ $key ][ '#title' ]);
$row [] = array ( 'data' => drupal_render ( $form [ 'date_formats' ][ $key ]));
$rows [] = $row ;
}
$output = drupal_render ( $form [ 'language' ]);
$output .= theme ( 'table' , array ( 'header' => $header , 'rows' => $rows ));
$output .= drupal_render_children ( $form );
return $output ;
}
/**
* Save locale specific date formats to the database .
*
* @ param $langcode
* Language code , can be 2 characters , e . g . 'en' or 5 characters , e . g .
* 'en-CA' .
2012-11-29 07:37:55 +00:00
* @ param $date_format_id
* Date format id , e . g . 'short' , 'medium' .
2012-06-16 14:38:11 +00:00
* @ param $format
* The date format string .
*/
2012-11-29 07:37:55 +00:00
function system_date_format_localize_form_save ( $langcode , $date_format_id , $format ) {
config ( 'locale.config.' . $langcode . '.system.date' )
-> set ( 'formats.' . $date_format_id . '.pattern' , $format )
-> save ();
2012-06-16 14:38:11 +00:00
}