diff -u b/core/modules/field/field.module b/core/modules/field/field.module --- b/core/modules/field/field.module +++ b/core/modules/field/field.module @@ -543,72 +543,64 @@ - $deleted_fields = state()->get('field.field.deleted') ?: array(); + $module_handler = Drupal::service('module_handler'); $fields = field_read_fields(array(), array('include_deleted' => 1 ,'include_inactive' => 1)); - // Refresh the 'active' and 'storage[active]' values according to the current - // set of enabled modules. - $modules = array_keys(drupal_container()->get('module_handler')->getModuleList()); - foreach ($modules as $module_name) { - $fields = field_associate_fields($module_name, $fields); - } + $changed = array(); - foreach ($fields as $id => $field) { - if (!in_array($field['module'], $modules)) { - $fields[$id]['active'] = 0; + $modules = Drupal::service('module_handler')->getModuleList(); + // Set the 'module' and 'active' values for the current set of enabled + // modules. + foreach ($modules as $module => $module_info) { + // Collect field types and storage backends exposed by the module. + $field_types = (array) $module_handler->invoke($module, 'field_info'); + $storage_types = (array) $module_handler->invoke($module, 'field_storage_info'); + + if ($field_types || $storage_types) { + foreach ($fields as $id => &$field) { + // Associate field types. + if (isset($field_types[$field['type']]) && ($field['module'] !== $module || !$field['active'])) { + $field['module'] = $module; + $field['active'] = TRUE; + $changed[$id] = $field; + } + // Associate storage backends. + if (isset($storage_types[$field['storage']['type']]) && ($field['storage']['module'] !== $module || !$field['storage']['active'])) { + $field['storage']['module'] = $module; + $field['storage']['active'] = TRUE; + $changed[$id] = $field; + } + } } - if (!in_array($field['storage']['module'], $modules)) { - $fields[$id]['storage']['active'] = 0; + } + + // Set fields which field type module or storage module is absent to + // 'inactive'. + foreach ($fields as $id => &$field) { + if (!isset($modules[$field['module']]) && $field['active']) { + $field['active'] = FALSE; + $changed[$id] = $field; + } + if (!isset($modules[$field['storage']['module']]) && $field['storage']['active']) { + $field['storage']['active'] = FALSE; + $changed[$id] = $field; } } - foreach ($fields as $id => $field) { - if (!$field['deleted']) { - $field->save(); + // Store the updated field definitions. + $deleted_fields = state()->get('field.field.deleted') ?: array(); + foreach ($changed as $id => $field) { + if ($field['deleted']) { + $deleted_fields[$id] = $field; } else { - $deleted_fields[$field['uuid']] = $field; + config('field.field.' . $field['field_name']) + ->set('module', $field['module']) + ->set('active', $field['active']) + ->set('storage.module', $field['storage']['module']) + ->set('storage.active', $field['storage']['active']) + ->save(); } } - - // Save the deleted fields. state()->set('field.field.deleted', $deleted_fields); field_cache_clear(); } /** - * Allows a module to update the database for fields and columns it controls. - * - * @param $module - * The name of the module to update on. - * @param $fields - * A collection of fields. - */ -function field_associate_fields($module, $fields) { - - // Associate field types. - $field_types = (array) module_invoke($module, 'field_info'); - - if ($field_types) { - $field_types = array_keys($field_types); - foreach ($fields as $id => $field) { - if (in_array($field['type'], $field_types)) { - $fields[$id]['module'] = $module; - $fields[$id]['active'] = TRUE; - } - } - } - - // Associate storage backends. - $storage_types = (array) module_invoke($module, 'field_storage_info'); - if ($storage_types) { - $storage_types = array_keys($storage_types); - foreach ($fields as $id => $field) { - if (in_array($field['storage']['type'], $storage_types)) { - $fields[$id]['storage']['module'] = $module; - $fields[$id]['storage']['active'] = TRUE; - } - } - } - - return $fields; -} - -/** diff -u b/core/modules/field_sql_storage/field_sql_storage.module b/core/modules/field_sql_storage/field_sql_storage.module --- b/core/modules/field_sql_storage/field_sql_storage.module +++ b/core/modules/field_sql_storage/field_sql_storage.module @@ -242,7 +242,7 @@ /** * Implements hook_field_create_field(). */ -function field_sql_storage_create_field($field) { +function field_sql_storage_field_create_field($field) { // Rebuild the schema now that the field has been saved. if ($field['storage']['type'] == 'field_sql_storage') { drupal_get_schema(NULL, TRUE);