1 |
31a5a6d6
|
Assos Assos
|
<?php
|
2 |
|
|
|
3 |
|
|
/**
|
4 |
|
|
* @file
|
5 |
a1cafe7e
|
Assos Assos
|
* Provide diff field functions for the Field Collection.
|
6 |
31a5a6d6
|
Assos Assos
|
*/
|
7 |
|
|
|
8 |
|
|
/**
|
9 |
a1cafe7e
|
Assos Assos
|
* Diff field callback for parsing Field Collection fields comparative values.
|
10 |
31a5a6d6
|
Assos Assos
|
*/
|
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 |
a1cafe7e
|
Assos Assos
|
if (empty($entity)) {
|
29 |
950416da
|
Assos Assos
|
return array();
|
30 |
|
|
}
|
31 |
|
|
|
32 |
31a5a6d6
|
Assos Assos
|
$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 |
a1cafe7e
|
Assos Assos
|
$actual_mode = !empty($view_mode_settings[$view_mode]['custom_settings']) ? $view_mode : 'default';
|
44 |
31a5a6d6
|
Assos Assos
|
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 |
a1cafe7e
|
Assos Assos
|
// Any view mode is supported in relation to hiding fields, but only if
|
54 |
|
|
// selected.
|
55 |
31a5a6d6
|
Assos Assos
|
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 |
950416da
|
Assos Assos
|
$langcode = !empty($entity) ? field_language($entity_type, $entity, $field_name) : LANGUAGE_NONE;
|
65 |
31a5a6d6
|
Assos Assos
|
$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 |
a1cafe7e
|
Assos Assos
|
$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 |
31a5a6d6
|
Assos Assos
|
$func = $field['module'] . '_field_diff_view';
|
83 |
|
|
if (!function_exists($func)) {
|
84 |
|
|
$func = 'diff_field_diff_view';
|
85 |
|
|
}
|
86 |
|
|
|
87 |
a1cafe7e
|
Assos Assos
|
if (!empty($new_items)) {
|
88 |
|
|
$raw_values = $func($new_items, $field_context);
|
89 |
31a5a6d6
|
Assos Assos
|
$values = array();
|
90 |
|
|
foreach ($raw_values as $raw_value) {
|
91 |
a1cafe7e
|
Assos Assos
|
$values[] = is_array($raw_value) ? implode(', ', $raw_value) : $raw_value;
|
92 |
31a5a6d6
|
Assos Assos
|
}
|
93 |
|
|
|
94 |
a1cafe7e
|
Assos Assos
|
$result[] = check_plain($instance['label'] . ': ' . implode(', ', $values));
|
95 |
31a5a6d6
|
Assos Assos
|
}
|
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 |
|
|
} |