You are here

function node_reference_field_formatter_view in References 7.2

Implements hook_field_formatter_view().

File

node_reference/node_reference.module, line 437
Defines a field type for referencing one node from another.

Code

function node_reference_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
  $settings = $display['settings'];
  $result = array();
  switch ($display['type']) {
    case 'node_reference_default':
    case 'node_reference_plain':
      foreach ($items as $delta => $item) {
        if (!empty($item['access'])) {

          // Checking if exists the node. If not exists use node_load to load.
          if (!empty($item['node'])) {
            $node = $item['node'];
          }
          else {
            $node = node_load($item['nid']);
          }
          $label = entity_label('node', $node);
          if ($display['type'] == 'node_reference_default') {
            $uri = entity_uri('node', $node);
            $result[$delta] = array(
              '#type' => 'link',
              '#title' => $label,
              '#href' => $uri['path'],
              '#options' => $uri['options'],
            );
          }
          else {
            $result[$delta] = array(
              '#markup' => check_plain($label),
            );
          }
          if (!$node->status) {
            $result[$delta]['#prefix'] = '<span class="node-unpublished">';
            $result[$delta]['#suffix'] = '</span>';
          }
        }
      }
      break;
    case 'node_reference_node':

      // To prevent infinite recursion caused by reference cycles, we store
      // diplayed nodes in a recursion queue.
      $recursion_queue =& drupal_static(__FUNCTION__, array());

      // If no 'referencing entity' is set, we are starting a new 'reference
      // thread' and need to reset the queue.
      // @todo Bug: $entity->referencing_entity on nodes referenced in a
      // different thread on the page. E.g: 1 references 1+2 / 2 references 1+2
      // visit homepage.
      // We'd need a more accurate way...
      if (!isset($entity->referencing_entity)) {
        $recursion_queue = array();
      }

      // The recursion queue only needs to track nodes.
      if ($entity_type == 'node') {
        list($id) = entity_extract_ids($entity_type, $entity);
        $recursion_queue[$id] = $id;
      }

      // Check the recursion queue to determine which nodes should be fully
      // displayed, and which nodes will only be displayed as a title.
      $nodes_display = array();
      foreach ($items as $delta => $item) {
        if (!empty($item['access']) && !isset($recursion_queue[$item['nid']])) {
          if (!empty($item['node'])) {
            $nodes_display[$item['nid']] = $item['node'];
          }
          else {
            $nodes_display[$item['nid']] = node_load($item['nid']);
          }
        }
      }

      // Load and build the fully displayed nodes.
      if ($nodes_display) {
        foreach ($nodes_display as $nid => $node) {
          $nodes_display[$nid]->referencing_entity = $entity;
          $nodes_display[$nid]->referencing_field = $field['field_name'];
        }
        $nodes_built = node_view_multiple($nodes_display, $settings['node_reference_view_mode']);
      }

      // Assemble the render array.
      foreach ($items as $delta => $item) {
        if (!empty($item['access'])) {
          if (isset($nodes_display[$item['nid']])) {
            $result[$delta] = $nodes_built['nodes'][$item['nid']];
          }
          else {
            $node = $item['node'];
            $label = entity_label('node', $node);
            $uri = entity_uri('node', $node);
            $result[$delta] = array(
              '#type' => 'link',
              '#title' => $label,
              '#href' => $uri['path'],
              '#options' => $uri['options'],
            );
            if (!$node->status) {
              $result[$delta]['#prefix'] = '<span class="node-unpublished">';
              $result[$delta]['#suffix'] = '</span>';
            }
          }
        }
      }
      break;
    case 'node_reference_nid':
      foreach ($items as $delta => $item) {
        if (!empty($item['access'])) {
          $result[$delta] = array(
            '#markup' => $item['nid'],
          );
        }
      }
      break;
    case 'node_reference_path':
      foreach ($items as $delta => $item) {
        if (!empty($item['access'])) {
          $uri = entity_uri('node', $item['node']);
          $options = array(
            'absolute' => $settings['absolute'],
            'alias' => !$settings['alias'],
          );
          $options += $uri['options'];
          $result[$delta] = array(
            '#markup' => url($uri['path'], $options),
          );
        }
      }
      break;
  }
  return $result;
}