Error message
You are browsing documentation for drupal 7.x, which is not supported anymore. Read the updated version of this page for drupal 11.x (the latest version).function system_modules
Menu callback; provides module enable/disable interface.
The list of modules gets populated by module.info 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 descriptors.
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.
Parameters
$form_state: An associative array containing the current state of the form.
Return value
The form array.
See also
theme_system_modules()
Related topics
- Form builder functions
- Functions that build an abstract representation of a HTML form.
1 string reference to 'system_modules'
- system_menu in modules/
system/ system.module - Implements hook_menu().
File
-
modules/
system/ system.admin.inc, line 791
Code
function system_modules ($form, $form_state = array()) {
// Get current list of modules.
$files = system_rebuild_module_data ();
// Remove hidden modules from display list.
$visible_files = $files;
foreach ($visible_files as $filename => $file) {
if (!empty($file->info['hidden'])) {
unset($visible_files[$filename]);
}
}
uasort ($visible_files, 'system_sort_modules_by_info_name');
// If the modules form was submitted, then system_modules_submit() runs first
// and if there are unfilled required modules, then $form_state['storage'] is
// filled, triggering a rebuild. In this case we need to display a
// confirmation form.
if (!empty($form_state['storage'])) {
return system_modules_confirm_form ($visible_files, $form_state['storage']);
}
$modules = array();
$form['modules'] = array(
'#tree' => TRUE,
);
// Used when checking if module implements a help page.
$help_arg = module_exists ('help') ? drupal_help_arg () : FALSE;
// Used when displaying modules that are required by the installation profile.
require_once DRUPAL_ROOT . '/includes/install.inc';
$distribution_name = check_plain (drupal_install_profile_distribution_name ());
// Iterate through each of the modules.
foreach ($visible_files as $filename => $module) {
$extra = array();
$extra['enabled'] = (bool) $module->status;
if (!empty($module->info['required'])) {
$extra['disabled'] = TRUE;
$extra['required_by'][] = $distribution_name . (!empty($module->info['explanation']) ? ' (' . $module->info['explanation'] . ')' : '');
}
// 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),
));
$extra['disabled'] = TRUE;
}
elseif (isset($visible_files[$requires])) {
$requires_name = $files[$requires]->info['name'];
// Disable this module if it is incompatible with the dependency's version.
if ($incompatible_version = drupal_check_incompatibility ($v, str_replace (DRUPAL_CORE_COMPATIBILITY . '-', '', (string) $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;
}
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;
}
elseif ($files[$requires]->status) {
$extra['requires'][$requires] = t ('@module (<span class="admin-enabled">enabled</span>)', array(
'@module' => $requires_name,
));
}
else {
$extra['requires'][$requires] = t ('@module (<span class="admin-disabled">disabled</span>)', array(
'@module' => $requires_name,
));
}
}
}
// Generate link for module's help page, if there is one.
if ($help_arg && $module->status && in_array ($filename, module_implements ('help'))) {
if (module_invoke ($filename, 'help', "admin/help#{$filename}", $help_arg)) {
$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'),
),
),
);
}
}
// 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'),
'#href' => 'admin/people/permissions',
'#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 === FALSE) {
watchdog ('system', 'Module %module specifies an invalid path for configuration: %configure', array(
'%module' => $module->info['name'],
'%configure' => $module->info['configure'],
));
}
else {
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'],
),
),
);
}
}
}
// 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) {
// Hidden modules are unset already.
if (isset($visible_files[$required_by])) {
if ($files[$required_by]->status == 1 && $module->status == 1) {
$extra['required_by'][] = t ('@module (<span class="admin-enabled">enabled</span>)', array(
'@module' => $files[$required_by]->info['name'],
));
$extra['disabled'] = TRUE;
}
else {
$extra['required_by'][] = t ('@module (<span class="admin-disabled">disabled</span>)', array(
'@module' => $files[$required_by]->info['name'],
));
}
}
}
$form['modules'][$module->info['package']][$filename] = _system_modules_build_row ($module->info, $extra);
}
// Add basic information to the fieldsets.
foreach (element_children ($form['modules']) as $package) {
$form['modules'][$package] += array(
'#type' => 'fieldset',
'#title' => t ($package),
'#collapsible' => TRUE,
'#theme' => 'system_modules_fieldset',
'#header' => array(
array(
'data' => t ('Enabled'),
'class' => array(
'checkbox',
),
),
t ('Name'),
t ('Version'),
t ('Description'),
array(
'data' => t ('Operations'),
'colspan' => 3,
),
),
// Ensure that the "Core" package fieldset comes first.
'#weight' => $package == 'Core' ? -10 : NULL,
// Hide this package unless we're running a test.
'#access' => !($package == 'Only For Testing' && !drupal_valid_test_ua ()),
);
}
// Lastly, sort all fieldsets by title.
uasort ($form['modules'], 'element_sort_by_title');
$form['actions'] = array(
'#type' => 'actions',
);
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => t ('Save configuration'),
);
$form['#action'] = url ('admin/modules/list/confirm');
return $form;
}
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.