diff --git a/features.module b/features.module index 2756bd5..4645630 100644 --- a/features.module +++ b/features.module @@ -262,6 +262,30 @@ function features_help($path, $arg) { } /** + * Implements hook_modules_disabled(). + */ +function features_modules_disabled($modules) { + // Find any features modules that were disabled. + if ($modules = array_intersect(array_keys(features_get_features()), $modules)) { + foreach ($modules as $module) { + features_disable($module); + } + } +} + +/** + * Implements hook_modules_enabled(). + */ +function features_modules_enabled($modules) { + // Find any features modules that were enabled. + if ($modules = array_intersect(array_keys(features_get_features()), $modules)) { + foreach ($modules as $module) { + features_enable($module); + } + } +} + +/** * Load includes for any modules that implement the features API and * load includes for those provided by features. */ @@ -682,6 +706,14 @@ function _features_restore($op, $items = array()) { $restore_hook = 'features_rebuild'; $log_action = 'Rebuild'; break; + case 'disable': + $restore_hook = 'features_disable'; + $log_action = 'Disable'; + break; + case 'enable': + $restore_hook = 'features_enable'; + $log_action = 'Enable'; + break; } if (empty($items)) { @@ -727,6 +759,24 @@ function features_rebuild($rebuild = array()) { } /** + * Wrapper around _features_restore(). + */ +function features_disable($module) { + $feature = feature_load($module); + $items[$module] = array_keys($feature->info['features']); + return _features_restore('disable', $items); +} + +/** + * Wrapper around _features_restore(). + */ +function features_enable($module) { + $feature = feature_load($module); + $items[$module] = array_keys($feature->info['features']); + return _features_restore('enable', $items); +} + +/** * Utility functions ================================================== */ diff --git a/includes/features.node.inc b/includes/features.node.inc index 8e54827..2d2add6 100644 --- a/includes/features.node.inc +++ b/includes/features.node.inc @@ -113,3 +113,49 @@ function node_features_revert($module = NULL) { menu_rebuild(); } } + +/** + * Implements hook_features_disable(). + * + * When a features module is disabled, modify any node types it provides so + * they can be deleted manually through the content types UI. + * + * @param $module + * Name of module that has been disabled. + */ +function node_features_disable($module) { + if ($default_types = features_get_default('node', $module)) { + foreach ($default_types as $type_name => $type_info) { + $type_info = node_type_load($type_name); + $type_info->module = 'node'; + $type_info->custom = 1; + $type_info->modified = 1; + $type_info->locked = 0; + node_type_save($type_info); + } + } +} + +/** + * Implements hook_features_enable(). + * + * When a features module is enabled, modify any node types it provides so + * they can no longer be deleted manually through the content types UI. + * + * @param $module + * Name of module that has been enabled. + */ +function node_features_enable($module) { + if ($default_types = features_get_default('node', $module)) { + foreach ($default_types as $type_name => $type_info) { + // Ensure the type exists. + if ($type_info = node_type_load($type_name)) { + $type_info->module = $module; + $type_info->custom = 0; + $type_info->modified = 0; + $type_info->locked = 1; + node_type_save($type_info); + } + } + } +}