diff --git includes/module.inc includes/module.inc index 1bef638..b3ad0e6 100644 --- includes/module.inc +++ includes/module.inc @@ -76,7 +76,58 @@ function module_list($refresh = FALSE, $sort = FALSE, $fixed_list = NULL) { } /** - * Find dependencies any level deep and fill in required by information too. + * Defines the available relationships. + * + * @return + * An associative array whose keys are available relationships and whose + * values are the keys for the built relationships. + */ +function _module_get_available_relationships() { + $relationships['dependencies'] = array( + 'relation_by' => array( + 'property' => 'required_by', + 'name' => t('Required by'), + ), + 'relation' => array( + 'property' => 'requires', + 'name' => t('Requires'), + ), + ); + $relationships['recommends'] = array( + 'relation_by' => array( + 'property' => 'recommended_by', + 'name' => t('Recommended by'), + ), + 'relation' => array( + 'property' => 'recommends', + 'name' => t('Recommends'), + ), + ); + $relationships['supports'] = array( + 'relation_by' => array( + 'property' => 'supported_by', + 'name' => t('Supported by'), + ), + 'relation' => array( + 'property' => 'supports', + 'name' => t('Supports'), + ), + ); + $relationships['enhances'] = array( + 'relation_by' => array( + 'property' => 'enhanced_by', + 'name' => t('Enhanced by'), + ), + 'relation' => array( + 'property' => 'enhances', + 'name' => t('Enhances'), + ), + ); + return $relationships; +} + +/** + * Find relationships any level deep and fill in required by information too. * * @param $files * The array of filesystem objects used to rebuild the cache. @@ -89,22 +140,29 @@ function module_list($refresh = FALSE, $sort = FALSE, $fixed_list = NULL) { */ function _module_build_dependencies($files) { require_once DRUPAL_ROOT . '/includes/graph.inc'; - $roots = $files; - foreach ($files as $filename => $file) { - $graph[$file->name]['edges'] = array(); - if (isset($file->info['dependencies']) && is_array($file->info['dependencies'])) { - foreach ($file->info['dependencies'] as $dependency_name) { - $graph[$file->name]['edges'][$dependency_name] = 1; - unset($roots[$dependency_name]); + + $relationships = _module_get_available_relationships(); + + foreach ($relationships as $relationship => $properties) { + $graph = array(); + $roots = $files; + foreach ($files as $filename => $file) { + $graph[$file->name]['edges'] = array(); + if (isset($file->info[$relationship]) && is_array($file->info[$relationship])) { + foreach ($file->info[$relationship] as $dependency_name) { + $graph[$file->name]['edges'][$dependency_name] = 1; + unset($roots[$dependency_name]); + } } } + drupal_depth_first_search($graph, array_keys($roots)); + foreach ($graph as $module => $data) { + $files[$module]->{$properties['relation_by']['property']} = isset($data['reverse_paths']) ? $data['reverse_paths'] : array(); + $files[$module]->{$properties['relation']['property']} = isset($data['paths']) ? $data['paths'] : array(); + $files[$module]->sort = $data['weight']; + } } - drupal_depth_first_search($graph, array_keys($roots)); - foreach ($graph as $module => $data) { - $files[$module]->required_by = isset($data['reverse_paths']) ? $data['reverse_paths'] : array(); - $files[$module]->requires = isset($data['paths']) ? $data['paths'] : array(); - $files[$module]->sort = $data['weight']; - } + return $files; } diff --git modules/system/system.admin.inc modules/system/system.admin.inc index bed9487..1e7dad0 100644 --- modules/system/system.admin.inc +++ modules/system/system.admin.inc @@ -581,6 +581,7 @@ function system_modules($form_state = array()) { cache_clear_all('schema', 'cache'); // Get current list of modules. $files = system_get_module_data(); + $relationships = _module_get_available_relationships(); // Remove hidden modules from display list. foreach ($files as $filename => $file) { @@ -609,17 +610,19 @@ function system_modules($form_state = array()) { foreach ($files as $filename => $module) { $extra = array(); $extra['enabled'] = (bool) $module->status; - // 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 (missing)', array('@module' => drupal_ucfirst($requires))); - $extra['disabled'] = TRUE; - } - elseif (!$files[$requires]->status) { - $extra['requires'][$requires] = t('@module (disabled)', array('@module' => $files[$requires]->info['name'])); + // If this module has a relation to other modules, add them to the array. + foreach ($relationships as $properties) { + foreach ($module->{$properties['relation']['property']} as $relation => $v) { + if (!isset($files[$relation])) { + $extra[$properties['relation']['property']][$relation] = t('@module (missing)', array('@module' => drupal_ucfirst($relation))); + $extra['disabled'] = TRUE; + } + elseif (!$files[$relation]->status) { + $extra[$properties['relation']['property']][$relation] = t('@module (disabled)', array('@module' => $files[$relation]->info['name'])); + } + else { + $extra[$properties['relation']['property']][$relation] = t('@module (enabled)', array('@module' => $files[$relation]->info['name'])); } - else { - $extra['requires'][$requires] = t('@module (enabled)', array('@module' => $files[$requires]->info['name'])); } } // Generate link for module's help page, if there is one. @@ -629,19 +632,21 @@ function system_modules($form_state = array()) { $extra['help'] = theme('more_help_link', url("admin/help/$filename")); } } - // Mark dependents disabled so the user cannot remove required modules. - $dependents = array(); - // 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($files[$required_by])) { - if ($files[$required_by]->status == 1) { - $extra['required_by'][] = t('@module (enabled)', array('@module' => $files[$required_by]->info['name'])); - $extra['disabled'] = TRUE; - } - else { - $extra['required_by'][] = t('@module (disabled)', array('@module' => $files[$required_by]->info['name'])); + // If this module has a relationship to other modules, list those, and then make it + // impossible to disable this one if required. + foreach ($relationships as $relationship => $properties) { + foreach ($module->{$properties['relation_by']['property']} as $relation => $v) { + // Hidden modules are unset already. + if (isset($files[$relation])) { + if ($files[$relation]->status == 1) { + $extra[$properties['relation_by']['property']][] = t('@module (enabled)', array('@module' => $files[$relation]->info['name'])); + if ($relationship === 'dependencies') { + $extra['disabled'] = TRUE; + } + } + else { + $extra[$properties['relation_by']['property']][] = t('@module (disabled)', array('@module' => $files[$relation]->info['name'])); + } } } } @@ -683,14 +688,19 @@ function system_sort_modules_by_info_name($a, $b) { * Build a table row for the system modules page. */ function _system_modules_build_row($info, $extra) { + $relationships = _module_get_available_relationships(); + // Add in the defaults. - $extra += array( - 'requires' => array(), - 'required_by' => array(), + $default = array( 'disabled' => FALSE, 'enabled' => FALSE, 'help' => '', ); + foreach ($relationships as $properties) { + $default[$properties['relation_by']['property']] = array(); + $default[$properties['relation']['property']] = array(); + } + $extra += $default; $form = array( '#tree' => TRUE, ); @@ -704,8 +714,28 @@ function _system_modules_build_row($info, $extra) { $form['version'] = array( '#markup' => $info['version'], ); - $form['#requires'] = $extra['requires']; - $form['#required_by'] = $extra['required_by']; + + $form['#relationships'] = array(); + $form['#requires'] = array(); + foreach ($relationships as $relationship => $properties) { + if (!empty($extra[$properties['relation']['property']])){ + $form['#relationships'][] = array( + 'name' => $properties['relation']['name'], + 'values' => $extra[$properties['relation']['property']], + 'relationship' => $relationship, + ); + if ($relationship === 'dependencies') { + $form['#requires'] = $extra[$properties['relation']['property']]; + } + } + if (!empty($extra[$properties['relation_by']['property']])){ + $form['#relationships'][] = array( + 'name' => $properties['relation_by']['name'], + 'values' => $extra[$properties['relation_by']['property']], + 'relationship' => $relationship, + ); + } + } // Check the compatibilities. $compatible = TRUE; @@ -2072,11 +2102,10 @@ function theme_system_modules_fieldset($form) { } // Add the description, along with any modules it requires. $description .= drupal_render($module['description']); - if ($module['#requires']) { - $description .= '
' . t('Requires: !module-list', array('!module-list' => implode(', ', $module['#requires']))) . '
'; - } - if ($module['#required_by']) { - $description .= '
' . t('Required by: !module-list', array('!module-list' => implode(', ', $module['#required_by']))) . '
'; + if ($module['#relationships']) { + foreach ($module['#relationships'] as $relationship) { + $description .= '
' . $relationship['name'] . ': ' . implode(', ', $relationship['values']) . '
'; + } } $row[] = array('data' => $description, 'class' => 'description'); $rows[] = $row; diff --git modules/system/system.module modules/system/system.module index 9a8ecaf..66a1c8d 100644 --- modules/system/system.module +++ modules/system/system.module @@ -1261,7 +1261,9 @@ function _system_get_module_data() { // Set defaults for module info. $defaults = array( 'dependencies' => array(), - 'dependents' => array(), + 'recommends' => array(), + 'supports' => array(), + 'enhances' => array(), 'description' => '', 'package' => 'Other', 'version' => NULL,