1 system.admin.inc | system_modules_submit($form, &$form_state) |
Submit callback; handles modules form submission.
File
- core/
modules/ system/ system.admin.inc, line 929 - Admin page callbacks for the System module.
Code
function system_modules_submit($form, &$form_state) {
include_once BACKDROP_ROOT . '/core/includes/install.inc';
// Builds list of modules.
$modules = array();
// If we're not coming from the confirmation form, build the list of modules.
if (empty($form_state['storage'])) {
// If we're not coming from the confirmation form, build the module list.
foreach ($form_state['values']['modules'] as $group_name => $group) {
foreach ($group as $module => $enabled) {
$modules[$module] = array('group' => $group_name, 'enabled' => $enabled['enable']);
}
}
}
else {
// If we are coming from the confirmation form, fetch
// the modules out of $form_state.
$modules = $form_state['storage']['modules'];
}
// Collect data for all modules to be able to determine dependencies.
$files = system_rebuild_module_data();
// Sorts modules by weight.
$sort = array();
foreach (array_keys($modules) as $module) {
$sort[$module] = $files[$module]->sort;
}
array_multisort($sort, $modules);
// Makes sure all required modules are set to be enabled.
$more_required = array();
$missing_modules = array();
foreach ($modules as $name => $module) {
if ($module['enabled']) {
// 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;
}
else {
$missing_modules[$required]['depends'][] = $name;
$modules[$name]['enabled'] = FALSE;
}
}
}
// 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,
);
}
}
}
// Redirects to confirmation form if more modules need to be enabled.
if ((!empty($more_required) || !empty($missing_modules)) && !isset($form_state['values']['confirm'])) {
$form_state['storage'] = array(
'more_required' => $more_required,
'modules' => $modules,
'missing_modules' => $missing_modules,
);
$form_state['rebuild'] = TRUE;
return;
}
// 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'] && backdrop_get_installed_schema_version($name) == SCHEMA_UNINSTALLED) {
if (!backdrop_check_module($name)) {
$modules[$name]['enabled'] = FALSE;
foreach (array_keys($files[$name]->required_by) as $required_by) {
$modules[$required_by]['enabled'] = FALSE;
}
}
}
}
// 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 (backdrop_get_installed_schema_version($name) == SCHEMA_UNINSTALLED) {
$actions['install'][] = $name;
$actions['enable'][] = $name;
}
elseif (!module_exists($name)) {
$actions['enable'][] = $name;
}
}
elseif (module_exists($name)) {
$actions['disable'][] = $name;
}
}
// Gets list of modules prior to install process, unsets $form_state['storage']
// so we don't get redirected back to the confirmation form.
$pre_install_list = module_list();
unset($form_state['storage']);
// Reverse the 'enable' list, to order dependencies before dependents.
krsort($actions['enable']);
// Installs, enables, and disables modules.
module_enable($actions['enable'], FALSE);
module_disable($actions['disable'], FALSE);
// Gets module list after install process, flushes caches and displays a
// message if there are changes.
$post_install_list = module_list(TRUE);
if ($pre_install_list != $post_install_list) {
backdrop_flush_all_caches();
backdrop_set_message(t('The configuration options have been saved.'));
// Display reminder about uninstalling disabled modules.
if (!empty($actions['disable'])) {
$disabled_modules = array();
foreach ($actions['disable'] as $module) {
$disabled_modules[] = $files[$module]->info['name'];
}
$disabled_message = t('You have disabled some modules. If they are no longer needed you might want to <a href="!uninstall">uninstall them</a>.', array('!uninstall' => url('admin/modules/uninstall')));
backdrop_set_message($disabled_message, 'info');
}
}
// Check if a previous search is present and preserve it on redirect.
if (!empty($form_state['values']['search'])) {
$parameter = $form_state['values']['search'];
$form_state['redirect'] = array(
'admin/modules',
array('query' => array('search' => $parameter)),
);
}
else {
$form_state['redirect'] = 'admin/modules';
}
}