diff --git a/modules/field/field.api.php b/modules/field/field.api.php index f905fa0..d2d10e0 100644 --- a/modules/field/field.api.php +++ b/modules/field/field.api.php @@ -124,6 +124,10 @@ function hook_field_extra_fields_alter(&$info) { /** * Define Field API field types. * + * Note that fields and their instances should never be created in the same + * module that defines their field type, because disabling the module will mark + * the fields as inactive, preventing them from being removed on uninstall. + * * @return * An array whose keys are field type names and whose values are arrays * describing the field type, with the following key/value pairs: diff --git a/modules/field/field.crud.inc b/modules/field/field.crud.inc index 7361164..df7c0b5 100644 --- a/modules/field/field.crud.inc +++ b/modules/field/field.crud.inc @@ -23,6 +23,10 @@ * This function does not bind the field to any bundle; use * field_create_instance() for that. * + * Note that fields and their instances should never be created in the same + * module that defines their field type, because disabling the module will mark + * the fields as inactive, preventing them from being removed on uninstall. + * * @param $field * A field definition array. The field_name and type properties are required. * Other properties, if omitted, will be given the following default values: @@ -415,6 +419,10 @@ function field_delete_field($field_name) { /** * Creates an instance of a field, binding it to a bundle. * + * Note that fields and their instances should never be created in the same + * module that defines their field type, because disabling the module will mark + * the fields as inactive, preventing them from being removed on uninstall. + * * @param $instance * A field instance definition array. The field_name, entity_type and * bundle properties are required. Other properties, if omitted, diff --git a/modules/field/field.module b/modules/field/field.module index 163f448..30a91d3 100644 --- a/modules/field/field.module +++ b/modules/field/field.module @@ -415,6 +415,22 @@ function field_modules_disabled($modules) { } /** + * Implements hook_system_info_alter(). + * + * Goes through a list of all modules that provide a field type, and makes them + * required if there are any active fields of that type. + */ +function field_system_info_alter(&$info, $file, $type) { + if ($type == 'module' && module_hook($file->name, 'field_info')) { + $fields = field_read_fields(array('module' => $file->name)); + if (count($fields) > 0) { + $info['required'] = TRUE; + $info['required_by'] = 'Field'; + } + } +} + +/** * Allows a module to update the database for fields and columns it controls. * * @param string $module diff --git a/modules/system/system.admin.inc b/modules/system/system.admin.inc index 0fe88ea..21b34ce 100644 --- a/modules/system/system.admin.inc +++ b/modules/system/system.admin.inc @@ -791,7 +791,7 @@ function system_modules($form, $form_state = array()) { $extra['enabled'] = (bool) $module->status; if (!empty($module->info['required'] )) { $extra['disabled'] = TRUE; - $extra['required_by'][] = $distribution_name; + $extra['required_by'][] = !empty($module->info['required_by']) ? $module->info['required_by'] : $distribution_name; } // If this module requires other modules, add them to the array.