Index: modules/forum/forum.info =================================================================== RCS file: /cvs/drupal/drupal/modules/forum/forum.info,v retrieving revision 1.1 diff -u -F^f -r1.1 forum.info --- modules/forum/forum.info 31 Aug 2006 20:22:35 -0000 1.1 +++ modules/forum/forum.info 1 Sep 2006 03:02:24 -0000 @@ -1,4 +1,4 @@ ; $Id: forum.info,v 1.1 2006/08/31 20:22:35 dries Exp $ name = Forum description = Enables threaded discussions about general topics. - +dependencies = taxonomy comment Index: modules/system/admin.css =================================================================== RCS file: /cvs/drupal/drupal/modules/system/admin.css,v retrieving revision 1.4 diff -u -F^f -r1.4 admin.css --- modules/system/admin.css 28 Aug 2006 07:56:21 -0000 1.4 +++ modules/system/admin.css 1 Sep 2006 03:02:24 -0000 @@ -36,3 +36,8 @@ margin-right: 1em; padding-right: 4px; } + +div.admin-missing, div.admin-required { + font-size: 1.1em; + color: #444; +} \ No newline at end of file Index: modules/system/system.module =================================================================== RCS file: /cvs/drupal/drupal/modules/system/system.module,v retrieving revision 1.357 diff -u -F^f -r1.357 system.module --- modules/system/system.module 31 Aug 2006 20:22:36 -0000 1.357 +++ modules/system/system.module 1 Sep 2006 03:02:26 -0000 @@ -1217,6 +1217,7 @@ function system_modules() { // Get current list of modules $files = module_rebuild_cache(); + // First Pass. foreach ($files as $filename => $file) { $info = $file->info; $form['name'][$file->name] = array('#value' => $info['name']); @@ -1224,10 +1225,54 @@ function system_modules() { $options[$file->name] = ''; if ($file->status) { $status[] = $file->name; + // for later dependency checking. + $info['enabled'] = TRUE; } if ($file->throttle) { $throttle[] = $file->name; } + $modules[$file->name] = $info; + } + // Store modules list for validation hook. + $form['modules'] = array('#type' => 'value', '#value' => $modules); + + // Second pass. Dependency checking. + $form['reverse_deps'] = array('#type' => 'value', '#value' => array()); + foreach ($form['modules']['#value'] as $filename => $info) { + // Check missing dependencies. + if (isset($info['dependencies'])) { + foreach (explode(' ', $info['dependencies']) as $dependency) { + if (!isset($modules[$dependency]) || !isset($modules[$dependency]['enabled'])) { + // Store fact we need to disable so theme can handle it. + $form['disabled'][$filename] = array('#type' => 'value', '#value' => 1); + $missing_deps[] = isset($modules[$dependency]) ? $modules[$dependency]['name'] : $dependency; + } + else if (isset($info['enabled'])) { + // Store the fact we need to disable so the theme function can handle it. + $form['disabled'][$dependency] = array('#type' => 'value', '#value' => 1); + $form['reverse_deps']['#value'][$dependency][] = $info['name']; + } + } + + // Add text for missing dependencies. + if (isset($form['disabled'][$filename])) { + $form['description'][$filename]['missingdeps'] = array( + '#value' => t('Missing dependencies: %missingdeps', array('%missingdeps' => implode(', ', $missing_deps))), + '#prefix' => '
', + '#suffix' => '
', + ); + } + } + } + + // Third pass. Reverse dependency passing + foreach ($form['reverse_deps']['#value'] as $filename => $dependency) { + // Add reverse dependency text. + $form['description'][$filename]['required'] = array( + '#value' => t('Required by: %required', array('%required' => implode(', ', $dependency))), + '#prefix' => '
', + '#suffix' => '
', + ); } // Handle status checkboxes, including overriding the generated @@ -1254,11 +1299,34 @@ function system_modules() { return $form; } +function system_modules_validate($form_id, $form_values, $form) { + // Recheck values for submitted dependency errors. + foreach ($form_values['modules'] as $filename => $info) { + if (!isset($info['enabled']) && $form_values['status'][$filename] && !empty($info['dependencies'])) { + foreach (explode(' ', $info['dependencies']) as $dependency) { + if (!isset($form['status'][$dependency]) || !($form_values['status'][$dependency])) { + form_set_error("status][$filename", + t('You are attempting to enable %module, but it depends on %dependency.', + array( + '%module' => $info['name'], + '%dependency' => isset($form_values['modules'][$dependency]) ? $form_values['modules'][$dependency]['name'] : $dependency + ))); + } + } + } + } +} + function theme_system_modules($form) { foreach (element_children($form['name']) as $key) { $row = array(); $row[] = drupal_render($form['name'][$key]); $row[] = drupal_render($form['description'][$key]); + // Disable individual checkboxes. + if (isset($form['disabled'][$key])) { + $form['status'][$key]['#attributes'] = array('disabled' => 'disabled'); + } + $row[] = array('data' => drupal_render($form['status'][$key]), 'align' => 'center'); if (module_exists('throttle')) { @@ -1281,7 +1349,9 @@ function theme_system_modules($form) { function system_modules_submit($form_id, $edit) { include_once './includes/install.inc'; $new_modules = array(); - foreach ($edit['status'] as $key => $choice) { + // Merge in reverse deps since they should be enabled + $modules = array_merge($edit['status'], $edit['reverse_deps']); + foreach ($modules as $key => $choice) { if ($choice) { if (drupal_get_installed_schema_version($key) == SCHEMA_UNINSTALLED) { $new_modules[] = $key;