summaryrefslogtreecommitdiff
path: root/modules/field/field.api.php
diff options
context:
space:
mode:
authorAngie Byron <webchick@24967.no-reply.drupal.org>2009-10-16 03:21:23 +0000
committerAngie Byron <webchick@24967.no-reply.drupal.org>2009-10-16 03:21:23 +0000
commit087a47ba5c8cdf5b0f79d9a121b7b9dcbbe7e992 (patch)
treeb223ccb070c29008ef9098484bb44894c2f53410 /modules/field/field.api.php
parent13d3072f418835569f37f65b5055e5b3180fad2e (diff)
downloadbrdo-087a47ba5c8cdf5b0f79d9a121b7b9dcbbe7e992.tar.gz
brdo-087a47ba5c8cdf5b0f79d9a121b7b9dcbbe7e992.tar.bz2
#493314 by yched and catch: Add multiple hook for formatters.
Diffstat (limited to 'modules/field/field.api.php')
-rw-r--r--modules/field/field.api.php70
1 files changed, 68 insertions, 2 deletions
diff --git a/modules/field/field.api.php b/modules/field/field.api.php
index ee80409a8..3728ba226 100644
--- a/modules/field/field.api.php
+++ b/modules/field/field.api.php
@@ -248,8 +248,11 @@ function hook_field_schema($field) {
* For performance reasons, information for all available objects should be
* loaded in a single query where possible.
*
- * Note that the changes made to the field values get cached by the
- * field cache for subsequent loads.
+ * Note that the changes made to the field values get cached by the field cache
+ * for subsequent loads. You should never use this hook to load fieldable
+ * entities, since this is likely to cause infinite recursions when
+ * hook_field_load() is run on those as well. Use
+ * hook_field_formatter_prepare_view() instead.
*
* @param $obj_type
* The type of $object.
@@ -826,6 +829,34 @@ function theme_field_formatter_FORMATTER_MULTIPLE($variables) {
}
/**
+ * Allow formatters to load information for multiple objects.
+ *
+ * This should be used when a formatter needs to load additional information
+ * from the database in order to render a field, for example a reference field
+ * which displays properties of the referenced objects such as name or type.
+ *
+ * @param $obj_type
+ * The type of $object.
+ * @param $objects
+ * Array of objects being displayed, keyed by object id.
+ * @param $field
+ * The field structure for the operation.
+ * @param $instances
+ * Array of instance structures for $field for each object, keyed by object id.
+ * @param $langcode
+ * The language the field values are to be shown in. If no language is
+ * provided the current language is used.
+ * @param $items
+ * Array of field values for the objects, keyed by object id.
+ * @return
+ * Changes or additions to field values are done by altering the $items
+ * parameter by reference.
+ */
+function hook_field_formatter_prepare_view($obj_type, $objects, $field, $instances, $langcode, &$items, $build_mode) {
+
+}
+
+/**
* @} End of "ingroup field_type"
*/
@@ -842,6 +873,41 @@ function theme_field_formatter_FORMATTER_MULTIPLE($variables) {
* See field_attach_form() for details and arguments.
*/
function hook_field_attach_form($obj_type, $object, &$form, &$form_state, $langcode) {
+ $tids = array();
+
+ // Collect every possible term attached to any of the fieldable entities.
+ foreach ($objects as $id => $object) {
+ foreach ($items[$id] as $delta => $item) {
+ // Force the array key to prevent duplicates.
+ $tids[$item['value']] = $item['value'];
+ }
+ }
+ if ($tids) {
+ $terms = array();
+
+ // Avoid calling taxonomy_term_load_multiple because it could lead to
+ // circular references.
+ $query = db_select('taxonomy_term_data', 't');
+ $query->fields('t');
+ $query->condition('t.tid', $tids, 'IN');
+ $query->addTag('term_access');
+ $terms = $query->execute()->fetchAllAssoc('tid');
+
+ // Iterate through the fieldable entities again to attach the loaded term data.
+ foreach ($objects as $id => $object) {
+ foreach ($items[$id] as $delta => $item) {
+ // Check whether the taxonomy term field instance value could be loaded.
+ if (isset($terms[$item['value']])) {
+ // Replace the instance value with the term data.
+ $items[$id][$delta]['taxonomy_term'] = $terms[$item['value']];
+ }
+ // Otherwise, unset the instance value, since the term does not exist.
+ else {
+ unset($items[$id][$delta]);
+ }
+ }
+ }
+ }
}
/**