_field_info_collate_fields

7 field.info.inc _field_info_collate_fields($reset = FALSE)
8 field.info.inc _field_info_collate_fields()

Collates all information on existing fields and instances.

Parameters

$reset: If TRUE, clear the cache. The information will be rebuilt from the database next time it is needed. Defaults to FALSE.

Return value

If $reset is TRUE, nothing. If $reset is FALSE, an array containing the following elements:

  • fields: Array of existing fields, keyed by field ID. This element lists deleted and non-deleted fields, but not inactive ones. Each field has an additional element, 'bundles', which is an array of all non-deleted instances of that field.
  • field_ids: Array of field IDs, keyed by field name. This element only lists non-deleted, active fields.
  • instances: Array of existing instances, keyed by entity type, bundle name and field name. This element only lists non-deleted instances whose field is active.

Related topics

10 calls to _field_info_collate_fields()

File

modules/field/field.info.inc, line 183
Field Info API, providing information about available fields and field types.

Code

function _field_info_collate_fields($reset = FALSE) {
  static $info;

  if ($reset) {
    $info = NULL;
    cache_clear_all('field_info_fields', 'cache_field');
    return;
  }

  if (!isset($info)) {
    if ($cached = cache_get('field_info_fields', 'cache_field')) {
      $info = $cached->data;
    }
    else {
      $definitions = array(
        'field_ids' => field_read_fields(array(), array('include_deleted' => 1)), 
        'instances' => field_read_instances(),
      );

      // Populate 'fields' with all fields, keyed by ID.
      $info['fields'] = array();
      foreach ($definitions['field_ids'] as $key => $field) {
        $info['fields'][$key] = $definitions['field_ids'][$key] = _field_info_prepare_field($field);
      }

      // Build an array of field IDs for non-deleted fields, keyed by name.
      $info['field_ids'] = array();
      foreach ($info['fields'] as $key => $field) {
        if (!$field['deleted']) {
          $info['field_ids'][$field['field_name']] = $key;
        }
      }

      // Populate 'instances'. Only non-deleted instances are considered.
      $info['instances'] = array();
      foreach (field_info_bundles() as $entity_type => $bundles) {
        foreach ($bundles as $bundle => $bundle_info) {
          $info['instances'][$entity_type][$bundle] = array();
        }
      }
      foreach ($definitions['instances'] as $instance) {
        $field = $info['fields'][$instance['field_id']];
        $instance = _field_info_prepare_instance($instance, $field);
        $info['instances'][$instance['entity_type']][$instance['bundle']][$instance['field_name']] = $instance;
        // Enrich field definitions with the list of bundles where they have
        // instances. NOTE: Deleted fields in $info['field_ids'] are not
        // enriched because all of their instances are deleted, too, and
        // are thus not in $definitions['instances'].
        $info['fields'][$instance['field_id']]['bundles'][$instance['entity_type']][] = $instance['bundle'];
      }

      // Populate 'extra_fields'.
      $extra = module_invoke_all('field_extra_fields');
      drupal_alter('field_extra_fields', $extra);
      // Merge in saved settings.
      foreach ($extra as $entity_type => $bundles) {
        foreach ($bundles as $bundle => $extra_fields) {
          $extra_fields = _field_info_prepare_extra_fields($extra_fields, $entity_type, $bundle);
          $info['extra_fields'][$entity_type][$bundle] = $extra_fields;
        }
      }

      cache_set('field_info_fields', $info, 'cache_field');
    }
  }

  return $info;
}
Login or register to post comments