Projet

Général

Profil

Paste
Télécharger (3,25 ko) Statistiques
| Branche: | Révision:

root / drupal7 / sites / all / modules / field_collection / field_collection.diff.inc @ 950416da

1
<?php
2

    
3
/**
4
 * @file
5
 * Provide diff field functions for the Field collection module.
6
 */
7

    
8
/**
9
 * Diff field callback for parsing Field collection fields comparative values.
10
 */
11
function field_collection_field_diff_view($items, $context) {
12
  $diff_items = array();
13
  foreach ($items as $delta => $item) {
14
    $diff_items[$delta] = field_collection_field_render_revision($item, $context);
15
  }
16
  return $diff_items;
17
}
18

    
19
/**
20
 * Renders a field collection fields revision.
21
 */
22
function field_collection_field_render_revision($item, $context) {
23
  $entity_type = 'field_collection_item';
24
  $bundle_name = $context['field']['field_name'];
25
  $view_mode = $context['view_mode'];
26
  $entity = entity_revision_load($entity_type, $item['revision_id']);
27

    
28
  if(empty($entity)) {
29
    return array();
30
  }
31

    
32
  $field_context = $context;
33
  $field_context['entity_type'] = $entity_type;
34
  $field_context['bundle'] = $bundle_name;
35
  $field_context['entity'] = $entity;
36

    
37
  // Some fields piggy back the display settings, so we need to fake these by
38
  // ensuring that the field mode is always set.
39
  if (empty($view_mode)) {
40
    $field_context['custom_settings'] = FALSE;
41
  }
42
  $view_mode_settings = field_view_mode_settings($entity_type, $bundle_name);
43
  $actual_mode = (!empty($view_mode_settings[$view_mode]['custom_settings'])) ? $view_mode : 'default';
44
  if (!isset($field_context['custom_settings'])) {
45
    $field_context['custom_settings'] = $actual_mode && $actual_mode == $view_mode;
46
  }
47

    
48
  $instances = field_info_instances($entity_type, $field_context['bundle']);
49
  usort($instances, '_field_collection_sort_items');
50

    
51
  $result = array();
52
  foreach ($instances as $instance) {
53
    // Any view mode is supported in relation to hiding fields, but only if selected.
54
    if ($actual_mode && $instance['display'][$actual_mode]['type'] == 'hidden') {
55
      continue;
56
    }
57

    
58
    $field_name = $instance['field_name'];
59
    $field = field_info_field($field_name);
60

    
61
    // We provide a loose check on the field access.
62
    if (field_access('view', $field, $entity_type) || field_access('edit', $field, $entity_type)) {
63
      $langcode = !empty($entity) ? field_language($entity_type, $entity, $field_name) : LANGUAGE_NONE;
64
      $field_context['language'] = $langcode;
65
      $field_context['field'] = $field;
66
      $field_context['instance'] = $instance;
67
      $field_context['settings'] = diff_get_field_settings($field_context);
68
      $field_context['display'] = $instance['display'][$actual_mode];
69

    
70
      $func = $field['module'] . '_field_diff_view';
71
      if (!function_exists($func)) {
72
        $func = 'diff_field_diff_view';
73
      }
74

    
75
      if (!empty($entity->{$field_name}[$langcode])) {
76
        $raw_values = $func($entity->{$field_name}[$langcode], $field_context);
77
        $values = array();
78
        foreach ($raw_values as $raw_value) {
79
          $values[] = is_array($raw_value) ? implode(", ", $raw_value) : $raw_value;
80
        }
81

    
82
        $result[] = check_plain($instance['label'] . ': ' . implode(", ", $values));
83
      }
84
    }
85
  }
86

    
87
  return $result;
88
}
89

    
90
/**
91
 * Sort function for items order.
92
 */
93
function _field_collection_sort_items($a, $b) {
94
  $a_weight = (!empty($a['widget']['weight']) ? $a['widget']['weight'] : 0);
95
  $b_weight = (!empty($b['widget']['weight']) ? $b['widget']['weight'] : 0);
96
  return $a_weight - $b_weight;
97
}