1 field.api.php hook_field_storage_load($entity_type, $entities, $age, $fields, $options)

Load field data for a set of entities.

This hook is invoked from field_attach_load() to ask the field storage module to load field data.

Modules implementing this hook should load field values and add them to objects in $entities. Fields with no values should be added as empty arrays.

Parameters

$entity_type: The type of entity, such as 'node' or 'user'.

$entities: The array of entity objects to add fields to, keyed by entity ID.

$age: FIELD_LOAD_CURRENT to load the most recent revision for all fields, or FIELD_LOAD_REVISION to load the version indicated by each entity.

$fields: An array listing the fields to be loaded. The keys of the array are field names, and the values of the array are the entity IDs (or revision IDs, depending on the $age parameter) to add each field to. Note that deleted data may need to be loaded, so requests to field_info_fields() should the $include_deleted flag to ensure the field definition is loaded.

$options: An associative array of additional options, with the following keys:

  • deleted: If TRUE, deleted fields should be loaded as well as non-deleted fields. If unset or FALSE, only non-deleted fields should be loaded.

Related topics

File

core/modules/field/field.api.php, line 1838
Hooks provided by the Field module.

Code

function hook_field_storage_load($entity_type, $entities, $age, $fields, $options) {
  $field_info = field_info_fields(TRUE);
  $load_current = $age == FIELD_LOAD_CURRENT;

  foreach ($fields as $field_name => $entity_ids) {
    $field = $field_info[$field_name];
    $field_name = $field['field_name'];
    $table = $load_current ? _field_sql_storage_tablename($field) : _field_sql_storage_revision_tablename($field);

    $query = db_select($table, 't')
      ->fields('t')
      ->condition('entity_type', $entity_type)
      ->condition($load_current ? 'entity_id' : 'revision_id', $entity_ids, 'IN')
      ->condition('language', field_available_languages($entity_type, $field), 'IN')
      ->orderBy('delta');

    if (empty($options['deleted'])) {
      $query->condition('deleted', 0);
    }

    $results = $query->execute();

    $delta_count = array();
    foreach ($results as $row) {
      if (!isset($delta_count[$row->entity_id][$row->language])) {
        $delta_count[$row->entity_id][$row->language] = 0;
      }

      if ($field['cardinality'] == FIELD_CARDINALITY_UNLIMITED || $delta_count[$row->entity_id][$row->language] < $field['cardinality']) {
        $item = array();
        // For each column declared by the field, populate the item
        // from the prefixed database column.
        foreach ($field['columns'] as $column => $attributes) {
          $column_name = _field_sql_storage_columnname($field_name, $column);
          $item[$column] = $row->$column_name;
        }

        // Add the item to the field values for the entity.
        $entities[$row->entity_id]->{$field_name}[$row->language][] = $item;
        $delta_count[$row->entity_id][$row->language]++;
      }
    }
  }
}