summaryrefslogtreecommitdiff
path: root/modules/field
diff options
context:
space:
mode:
Diffstat (limited to 'modules/field')
-rw-r--r--modules/field/field.api.php3
-rw-r--r--modules/field/field.attach.inc6
-rw-r--r--modules/field/field.info.inc19
-rw-r--r--modules/field/modules/field_sql_storage/field_sql_storage.module3
4 files changed, 27 insertions, 4 deletions
diff --git a/modules/field/field.api.php b/modules/field/field.api.php
index d0e2d82bd..5315b7d3e 100644
--- a/modules/field/field.api.php
+++ b/modules/field/field.api.php
@@ -1522,11 +1522,12 @@ function hook_field_storage_details_alter(&$details, $field) {
* loaded.
*/
function hook_field_storage_load($entity_type, &$entities, $age, $fields, $options) {
+ $field_info = field_info_field_by_ids();
$etid = _field_sql_storage_etid($entity_type);
$load_current = $age == FIELD_LOAD_CURRENT;
foreach ($fields as $field_id => $ids) {
- $field = field_info_field_by_id($field_id);
+ $field = $field_info[$field_id];
$field_name = $field['field_name'];
$table = $load_current ? _field_sql_storage_tablename($field) : _field_sql_storage_revision_tablename($field);
diff --git a/modules/field/field.attach.inc b/modules/field/field.attach.inc
index faa8743c2..ed732329c 100644
--- a/modules/field/field.attach.inc
+++ b/modules/field/field.attach.inc
@@ -273,6 +273,7 @@ function _field_invoke_multiple($op, $entity_type, $entities, &$a = NULL, &$b =
'language' => NULL,
);
$options += $default_options;
+ $field_info = field_info_field_by_ids();
$fields = array();
$grouped_instances = array();
@@ -296,7 +297,7 @@ function _field_invoke_multiple($op, $entity_type, $entities, &$a = NULL, &$b =
foreach ($instances as $instance) {
$field_id = $instance['field_id'];
$field_name = $instance['field_name'];
- $field = field_info_field_by_id($field_id);
+ $field = $field_info[$field_id];
$function = $options['default'] ? 'field_default_' . $op : $field['module'] . '_field_' . $op;
if (function_exists($function)) {
// Add the field to the list of fields to invoke the hook on.
@@ -583,6 +584,7 @@ function field_attach_form($entity_type, $entity, &$form, &$form_state, $langcod
* non-deleted fields are operated on.
*/
function field_attach_load($entity_type, $entities, $age = FIELD_LOAD_CURRENT, $options = array()) {
+ $field_info = field_info_field_by_ids();
$load_current = $age == FIELD_LOAD_CURRENT;
// Merge default options.
@@ -660,7 +662,7 @@ function field_attach_load($entity_type, $entities, $age = FIELD_LOAD_CURRENT, $
}
// Collect the storage backend if the field has not been loaded yet.
if (!isset($skip_fields[$field_id])) {
- $field = field_info_field_by_id($field_id);
+ $field = $field_info[$field_id];
$storages[$field['storage']['type']][$field_id][] = $load_current ? $id : $vid;
}
}
diff --git a/modules/field/field.info.inc b/modules/field/field.info.inc
index 53d5a2049..d2d22bfe0 100644
--- a/modules/field/field.info.inc
+++ b/modules/field/field.info.inc
@@ -576,6 +576,25 @@ function field_info_field_by_id($field_id) {
}
/**
+ * Returns the same data as field_info_field_by_id() for every field.
+ *
+ * This function is typically used when handling all fields of some entities
+ * to avoid thousands of calls to field_info_field_by_id().
+ *
+ * @return
+ * An array, each key is a field ID and the values are field arrays as
+ * returned by field_read_fields(), with an additional element 'bundles',
+ * whose value is an array of all the bundle this field belongs to.
+ *
+ * @see field_info_field()
+ * @see field_info_field_by_id()
+ */
+function field_info_field_by_ids() {
+ $info = _field_info_collate_fields();
+ return $info['fields'];
+}
+
+/**
* Retrieves information about field instances.
*
* @param $entity_type
diff --git a/modules/field/modules/field_sql_storage/field_sql_storage.module b/modules/field/modules/field_sql_storage/field_sql_storage.module
index 8c1fe9ad5..65e6bdf38 100644
--- a/modules/field/modules/field_sql_storage/field_sql_storage.module
+++ b/modules/field/modules/field_sql_storage/field_sql_storage.module
@@ -309,11 +309,12 @@ function field_sql_storage_field_storage_delete_field($field) {
* Implements hook_field_storage_load().
*/
function field_sql_storage_field_storage_load($entity_type, $entities, $age, $fields, $options) {
+ $field_info = field_info_field_by_ids();
$etid = _field_sql_storage_etid($entity_type);
$load_current = $age == FIELD_LOAD_CURRENT;
foreach ($fields as $field_id => $ids) {
- $field = field_info_field_by_id($field_id);
+ $field = $field_info[$field_id];
$field_name = $field['field_name'];
$table = $load_current ? _field_sql_storage_tablename($field) : _field_sql_storage_revision_tablename($field);