field_collection.diff.inc 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <?php
  2. /**
  3. * @file
  4. * Provide diff field functions for the Field collection module.
  5. */
  6. /**
  7. * Diff field callback for parsing Field collection fields comparative values.
  8. */
  9. function field_collection_field_diff_view($items, $context) {
  10. $diff_items = array();
  11. foreach ($items as $delta => $item) {
  12. $diff_items[$delta] = field_collection_field_render_revision($item, $context);
  13. }
  14. return $diff_items;
  15. }
  16. /**
  17. * Renders a field collection fields revision.
  18. */
  19. function field_collection_field_render_revision($item, $context) {
  20. $entity_type = 'field_collection_item';
  21. $bundle_name = $context['field']['field_name'];
  22. $view_mode = $context['view_mode'];
  23. $entity = entity_revision_load($entity_type, $item['revision_id']);
  24. $field_context = $context;
  25. $field_context['entity_type'] = $entity_type;
  26. $field_context['bundle'] = $bundle_name;
  27. $field_context['entity'] = $entity;
  28. // Some fields piggy back the display settings, so we need to fake these by
  29. // ensuring that the field mode is always set.
  30. if (empty($view_mode)) {
  31. $field_context['custom_settings'] = FALSE;
  32. }
  33. $view_mode_settings = field_view_mode_settings($entity_type, $bundle_name);
  34. $actual_mode = (!empty($view_mode_settings[$view_mode]['custom_settings'])) ? $view_mode : 'default';
  35. if (!isset($field_context['custom_settings'])) {
  36. $field_context['custom_settings'] = $actual_mode && $actual_mode == $view_mode;
  37. }
  38. $instances = field_info_instances($entity_type, $field_context['bundle']);
  39. usort($instances, '_field_collection_sort_items');
  40. $result = array();
  41. foreach ($instances as $instance) {
  42. // Any view mode is supported in relation to hiding fields, but only if selected.
  43. if ($actual_mode && $instance['display'][$actual_mode]['type'] == 'hidden') {
  44. continue;
  45. }
  46. $field_name = $instance['field_name'];
  47. $field = field_info_field($field_name);
  48. // We provide a loose check on the field access.
  49. if (field_access('view', $field, $entity_type) || field_access('edit', $field, $entity_type)) {
  50. $langcode = field_language($entity_type, $entity, $field_name);
  51. $field_context['language'] = $langcode;
  52. $field_context['field'] = $field;
  53. $field_context['instance'] = $instance;
  54. $field_context['settings'] = diff_get_field_settings($field_context);
  55. $field_context['display'] = $instance['display'][$actual_mode];
  56. $func = $field['module'] . '_field_diff_view';
  57. if (!function_exists($func)) {
  58. $func = 'diff_field_diff_view';
  59. }
  60. if (!empty($entity->{$field_name}[$langcode])) {
  61. $raw_values = $func($entity->{$field_name}[$langcode], $field_context);
  62. $values = array();
  63. foreach ($raw_values as $raw_value) {
  64. $values[] = is_array($raw_value) ? implode(", ", $raw_value) : $raw_value;
  65. }
  66. $result[] = check_plain($instance['label'] . ': ' . implode(", ", $values));
  67. }
  68. }
  69. }
  70. return $result;
  71. }
  72. /**
  73. * Sort function for items order.
  74. */
  75. function _field_collection_sort_items($a, $b) {
  76. $a_weight = (!empty($a['widget']['weight']) ? $a['widget']['weight'] : 0);
  77. $b_weight = (!empty($b['widget']['weight']) ? $b['widget']['weight'] : 0);
  78. return $a_weight - $b_weight;
  79. }