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 12:50:18 -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.6 diff -u -F^f -r1.6 admin.css --- modules/system/admin.css 1 Sep 2006 09:23:45 -0000 1.6 +++ modules/system/admin.css 1 Sep 2006 12:50:18 -0000 @@ -61,3 +61,8 @@ table.system-status-report tr.ok th { background-image: url('../../misc/watchdog-ok.png'); } + +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.362 diff -u -F^f -r1.362 system.module --- modules/system/system.module 1 Sep 2006 09:23:45 -0000 1.362 +++ modules/system/system.module 1 Sep 2006 12:50:21 -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) { + $missing_deps = array(); + // 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]) && $missing_deps) { + $form['description'][$filename]['missing_deps'] = array( + '#value' => t('Missing dependencies: %missing_deps', array('%missing_deps' => implode(', ', $missing_deps))), + '#prefix' => '
', + '#suffix' => '
', + ); + } + } + } + + // Third pass. Add reverse dependency strings to description. + foreach ($form['reverse_deps']['#value'] as $filename => $dependency) { + $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,35 @@ 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_value($form['status'][$filename], FALSE); + 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,6 +1350,8 @@ function theme_system_modules($form) { function system_modules_submit($form_id, $edit) { include_once './includes/install.inc'; $new_modules = array(); + // Merge in reverse deps since they should be enabled + $modules = array_merge($edit['status'], $edit['reverse_deps']); // Enable/disable modules that have already been installed foreach ($edit['status'] as $key => $choice) {