function taxonomy_field_formatter_prepare_view

Implements hook_field_formatter_prepare_view().

This preloads all taxonomy terms for multiple loaded objects at once and unsets values for invalid terms that do not exist.

File

modules/taxonomy/taxonomy.module, line 1674

Code

function taxonomy_field_formatter_prepare_view($entity_type, $entities, $field, $instances, $langcode, &$items, $displays) {
    $tids = array();
    // Collect every possible term attached to any of the fieldable entities.
    foreach ($entities as $id => $entity) {
        foreach ($items[$id] as $delta => $item) {
            // Force the array key to prevent duplicates.
            if ($item['tid'] !== 'autocreate') {
                $tids[$item['tid']] = $item['tid'];
            }
        }
    }
    if ($tids) {
        $terms = taxonomy_term_load_multiple(array_filter($tids));
        // Iterate through the fieldable entities again to attach the loaded term data.
        foreach ($entities as $id => $entity) {
            $rekey = FALSE;
            foreach ($items[$id] as $delta => $item) {
                // Check whether the taxonomy term field instance value could be loaded.
                if (isset($terms[$item['tid']])) {
                    // Replace the instance value with the term data.
                    $items[$id][$delta]['taxonomy_term'] = $terms[$item['tid']];
                }
                elseif ($item['tid'] === 'autocreate') {
                    // Leave the item in place.
                }
                else {
                    unset($items[$id][$delta]);
                    $rekey = TRUE;
                }
            }
            if ($rekey) {
                // Rekey the items array.
                $items[$id] = array_values($items[$id]);
            }
        }
    }
}

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