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;
}