function FieldInfo::getBundleInstances

Retrieves the instances for a bundle.

The function also populates the corresponding field definitions in the "static" cache.

Parameters

$entity_type: The entity type.

$bundle: The bundle name.

Return value

The array of instance definitions, keyed by field name.

File

modules/field/field.info.class.inc, line 350

Class

FieldInfo
Provides field and instance definitions for the current runtime environment.

Code

public function getBundleInstances($entity_type, $bundle) {
    // Read from the "static" cache.
    if (isset($this->bundleInstances[$entity_type][$bundle])) {
        return $this->bundleInstances[$entity_type][$bundle];
    }
    if (isset($this->emptyBundles[$entity_type][$bundle])) {
        return array();
    }
    // Read from the persistent cache.
    if ($cached = cache_get("field_info:bundle:{$entity_type}:{$bundle}", 'cache_field')) {
        $info = $cached->data;
        // Extract the field definitions and save them in the "static" cache.
        foreach ($info['fields'] as $field) {
            if (!isset($this->fieldsById[$field['id']])) {
                $this->fieldsById[$field['id']] = $field;
                if (!$field['deleted']) {
                    $this->fieldIdsByName[$field['field_name']] = $field['id'];
                }
            }
        }
        unset($info['fields']);
        // Store the instance definitions in the "static" cache'. Empty (or
        // non-existent) bundles are stored separately, so that they do not
        // pollute the global list returned by getInstances().
        if ($info['instances']) {
            $this->bundleInstances[$entity_type][$bundle] = $info['instances'];
        }
        else {
            $this->emptyBundles[$entity_type][$bundle] = TRUE;
        }
        return $info['instances'];
    }
    // Cache miss: collect from the definitions.
    $instances = array();
    // Collect the fields in the bundle.
    $params = array(
        'entity_type' => $entity_type,
        'bundle' => $bundle,
    );
    $fields = field_read_fields($params);
    // This iterates on non-deleted instances, so deleted fields are kept out of
    // the persistent caches.
    foreach (field_read_instances($params) as $instance) {
        $field = $fields[$instance['field_name']];
        $instance = $this->prepareInstance($instance, $field['type']);
        $instances[$field['field_name']] = $instance;
        // If the field is not in our global "static" list yet, add it.
        if (!isset($this->fieldsById[$field['id']])) {
            $field = $this->prepareField($field);
            $this->fieldsById[$field['id']] = $field;
            $this->fieldIdsByName[$field['field_name']] = $field['id'];
        }
    }
    // Store in the 'static' cache'. Empty (or non-existent) bundles are stored
    // separately, so that they do not pollute the global list returned by
    // getInstances().
    if ($instances) {
        $this->bundleInstances[$entity_type][$bundle] = $instances;
    }
    else {
        $this->emptyBundles[$entity_type][$bundle] = TRUE;
    }
    // The persistent cache additionally contains the definitions of the fields
    // involved in the bundle.
    $cache = array(
        'instances' => $instances,
        'fields' => array(),
    );
    foreach ($instances as $instance) {
        $cache['fields'][] = $this->fieldsById[$instance['field_id']];
    }
    if (lock_acquire("field_info:bundle:{$entity_type}:{$bundle}")) {
        cache_set("field_info:bundle:{$entity_type}:{$bundle}", $cache, 'cache_field');
        lock_release("field_info:bundle:{$entity_type}:{$bundle}");
    }
    return $instances;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.