1 taxonomy.module taxonomy_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display)

Implements hook_field_formatter_view().

File

core/modules/taxonomy/taxonomy.module, line 1584
Enables the organization of content into categories.

Code

function taxonomy_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
  $element = array();
  $settings = $display['settings'];

  // Terms whose tid is 'autocreate' do not exist
  // yet and $item['taxonomy_term'] is not set. Theme such terms as
  // just their name.

  switch ($display['type']) {
    case 'taxonomy_term_reference_link':
      foreach ($items as $delta => $item) {
        if ($item['tid'] == 'autocreate') {
          $element[$delta] = array(
            '#markup' => check_plain($item['name']),
          );
        }
        else {
          $term = $item['taxonomy_term'];
          $uri = entity_uri('taxonomy_term', $term);
          $element[$delta] = array(
            '#type' => 'link',
            '#title' => $term->name,
            '#href' => $uri['path'],
            '#options' => $uri['options'],
          );
        }
      }
      break;

    case 'taxonomy_term_reference_plain':
      foreach ($items as $delta => $item) {
        $name = ($item['tid'] != 'autocreate' ? $item['taxonomy_term']->name : $item['name']);
        $element[$delta] = array(
          '#markup' => check_plain($name),
        );
      }
      break;

    case 'taxonomy_term_reference_rss_category':
      foreach ($items as $delta => $item) {
        $entity->rss_elements[] = array(
          'key' => 'category',
          'value' => $item['tid'] != 'autocreate' ? $item['taxonomy_term']->name : $item['name'],
          'attributes' => array(
            'domain' => $item['tid'] != 'autocreate' ? url('taxonomy/term/' . $item['tid'], array('absolute' => TRUE)) : '',
          ),
        );
      }
      break;

    case 'taxonomy_term_reference_rendered':
      // To prevent infinite recursion caused by reference cycles, we store
      // displayed terms in a recursion queue.
      $recursion_queue = &backdrop_static(__FUNCTION__, array());

      // If no 'referencing entity' is set, we are starting a new 'reference
      // thread' and need to reset the queue.
      if (!isset($entity->referencing_entity)) {
        $recursion_queue = array();
      }

      // The recursion queue only needs to track terms.
      if (in_array($entity_type, array('taxonomy_term'))) {
        $recursion_queue[$entity->id()] = $entity->id();
      }

      // Check the recursion queue to determine which terms should be fully
      // displayed, and which terms will only be displayed as a title.
      $terms_display = array();
      foreach ($items as $delta => $item) {
        if (!isset($recursion_queue[$item['tid']])) {
          $terms_display[$item['tid']] = $item['taxonomy_term'];
        }
      }

      // Load and build the fully displayed terms.
      if ($terms_display) {
        foreach ($terms_display as $tid => $term) {
          $terms_display[$tid]->referencing_entity = $entity;
          $terms_display[$tid]->referencing_field = $field['field_name'];
        }
        $terms_built = taxonomy_term_view_multiple($terms_display, $settings['view_mode']);
      }

      // Assemble the render array.
      foreach ($items as $delta => $item) {
        if (isset($terms_display[$item['tid']])) {
          $element[$delta] = $terms_built['taxonomy_terms'][$item['tid']];
        }
        else {
          $term = $item['taxonomy_term'];
          $label = entity_label('taxonomy_term', $term);
          $uri = entity_uri('taxonomy_term', $term);
          $element[$delta] = array(
            '#type' => 'link',
            '#title' => $label,
            '#href' => $uri['path'],
            '#options' => $uri['options'],
          );
        }
      }

      break;
  }

  return $element;
}