function file_entity_field_formatter_view in D7 Media 7
Implements hook_field_formatter_view().
File
- file_entity/
file_entity.field.inc, line 61 - Field API integration for the file_entity module.
Code
function file_entity_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
$settings = $display['settings'];
$element = array();
if ($display['type'] == 'file_rendered') {
$view_mode = $settings['file_view_mode'];
// 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 files 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 files.
if ($entity_type == 'file') {
list($id) = entity_extract_ids($entity_type, $entity);
$recursion_queue[$id] = $id;
}
// Prevent 'empty' fields from causing a WSOD.
$items = array_filter($items);
// Check the recursion queue to determine which nodes should be fully
// displayed, and which nodes will only be displayed as a title.
$files_display = array();
foreach ($items as $delta => $item) {
if (!isset($recursion_queue[$item['fid']])) {
$files_display[$item['fid']] = file_load($item['fid']);
}
}
// Load and build the fully displayed nodes.
if ($files_display) {
foreach ($files_display as $fid => $file) {
$files_display[$fid]->referencing_entity = $entity;
$files_display[$fid]->referencing_field = $field['field_name'];
}
$files_built = file_view_multiple($files_display, $view_mode);
}
// Assemble the render array.
foreach ($items as $delta => $item) {
if (isset($files_built[$item['fid']])) {
$element[$delta] = $files_built[$item['fid']];
}
}
}
return $element;
}