1
|
<?php
|
2
|
|
3
|
/**
|
4
|
* @file
|
5
|
* Provide diff field functions for the Field Collection.
|
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
|
54
|
// selected.
|
55
|
if ($actual_mode && $instance['display'][$actual_mode]['type'] == 'hidden') {
|
56
|
continue;
|
57
|
}
|
58
|
|
59
|
$field_name = $instance['field_name'];
|
60
|
$field = field_info_field($field_name);
|
61
|
|
62
|
// We provide a loose check on the field access.
|
63
|
if (field_access('view', $field, $entity_type) || field_access('edit', $field, $entity_type)) {
|
64
|
$langcode = !empty($entity) ? field_language($entity_type, $entity, $field_name) : LANGUAGE_NONE;
|
65
|
$field_context['language'] = $langcode;
|
66
|
$field_context['field'] = $field;
|
67
|
$field_context['instance'] = $instance;
|
68
|
$field_context['settings'] = diff_get_field_settings($field_context);
|
69
|
$field_context['display'] = $instance['display'][$actual_mode];
|
70
|
|
71
|
$old_items = array();
|
72
|
$new_items = array();
|
73
|
if (!empty($entity->{$field_name}[$langcode])) {
|
74
|
$new_items = $entity->{$field_name}[$langcode];
|
75
|
}
|
76
|
|
77
|
$func = $field['module'] . '_field_diff_view_prepare';
|
78
|
if (function_exists($func)) {
|
79
|
$func($old_items, $new_items, $field_context);
|
80
|
}
|
81
|
|
82
|
$func = $field['module'] . '_field_diff_view';
|
83
|
if (!function_exists($func)) {
|
84
|
$func = 'diff_field_diff_view';
|
85
|
}
|
86
|
|
87
|
if (!empty($new_items)) {
|
88
|
$raw_values = $func($new_items, $field_context);
|
89
|
$values = array();
|
90
|
foreach ($raw_values as $raw_value) {
|
91
|
$values[] = is_array($raw_value) ? implode(', ', $raw_value) : $raw_value;
|
92
|
}
|
93
|
|
94
|
$result[] = check_plain($instance['label'] . ': ' . implode(', ', $values));
|
95
|
}
|
96
|
}
|
97
|
}
|
98
|
|
99
|
return $result;
|
100
|
}
|
101
|
|
102
|
/**
|
103
|
* Sort function for items order.
|
104
|
*/
|
105
|
function _field_collection_sort_items($a, $b) {
|
106
|
$a_weight = (!empty($a['widget']['weight']) ? $a['widget']['weight'] : 0);
|
107
|
$b_weight = (!empty($b['widget']['weight']) ? $b['widget']['weight'] : 0);
|
108
|
return $a_weight - $b_weight;
|
109
|
}
|