date_views_fields.inc 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. <?php
  2. /**
  3. * @file
  4. * Helper for identifying Date API fields for views.
  5. */
  6. /**
  7. * Identify all potential date/timestamp fields.
  8. *
  9. * @return
  10. * array with fieldname, type, and table.
  11. * @see
  12. * date_views_date_views_fields() which implements
  13. * the hook_date_views_fields() for the core date fields.
  14. */
  15. function _date_views_fields($base = 'node') {
  16. // Make sure $base is never empty.
  17. if (empty($base)) {
  18. $base = 'node';
  19. }
  20. $cid = 'date_views_fields_' . $base;
  21. cache_clear_all($cid, 'cache_views');
  22. // We use fields that provide filter handlers as our universe of possible
  23. // fields of interest.
  24. $all_fields = date_views_views_fetch_fields($base, 'filter');
  25. // Iterate over all the fields that Views knows about.
  26. $fields = array();
  27. foreach ((array) $all_fields as $alias => $val) {
  28. // Set up some default values.
  29. $granularity = array('year', 'month', 'day', 'hour', 'minute', 'second');
  30. $tz_handling = 'site';
  31. $related_fields = array();
  32. $timezone_field = '';
  33. $offset_field = '';
  34. $rrule_field = '';
  35. $delta_field = '';
  36. $sql_type = DATE_UNIX;
  37. $type = '';
  38. $name = $alias;
  39. $tmp = explode('.', $name);
  40. $field_name = $tmp[1];
  41. $table_name = $tmp[0];
  42. // Unset the date filter to avoid ugly recursion and broken values.
  43. if ($field_name == 'date_filter') {
  44. continue;
  45. }
  46. $fromto = array($name, $name);
  47. // If we don't have a filter handler, we don't need to do anything more.
  48. if (!$handler = views_get_handler($table_name, $field_name, 'filter')) {
  49. continue;
  50. }
  51. $handler = views_get_handler($table_name, $field_name, 'filter');
  52. $handler_name = $handler->definition['handler'];
  53. // We don't care about anything but date handlers
  54. if (empty($handler->definition['is date'])) {
  55. continue;
  56. }
  57. $is_field = FALSE;
  58. // For Field module fields, get the date type.
  59. $custom = array();
  60. if (isset($handler->definition['field_name'])) {
  61. $field = field_info_field($handler->definition['field_name']);
  62. $is_field = TRUE;
  63. switch ($field['type']) {
  64. case 'date':
  65. $sql_type = DATE_ISO;
  66. break;
  67. case 'datestamp':
  68. break;
  69. case 'datetime':
  70. $sql_type = DATE_DATETIME;
  71. break;
  72. default:
  73. // If this is not a date field, nothing more to do.
  74. continue;
  75. }
  76. $revision = in_array($base, array('node_revision')) ? FIELD_LOAD_REVISION : FIELD_LOAD_CURRENT;
  77. $db_info = date_api_database_info($field, $revision);
  78. $name = $table_name . "." . $field_name;
  79. $granularity = !empty($field['granularity']) ? $field['granularity'] : array('year', 'month', 'day', 'hour', 'minute', 'second');
  80. $fromto = array(
  81. $table_name . '.' . $db_info['columns'][$table_name]['value'],
  82. $table_name . '.' . (!empty($field['settings']['todate']) ? $db_info['columns'][$table_name]['value2'] : $db_info['columns'][$table_name]['value']),
  83. );
  84. if (isset($field['settings']['tz_handling'])) {
  85. $tz_handling = $field['settings']['tz_handling'];
  86. $db_info = date_api_database_info($field, $revision);
  87. if ($tz_handling == 'date') {
  88. $offset_field = $table_name . '.' . $db_info['columns'][$table_name]['offset'];
  89. }
  90. $related_fields = array(
  91. $table_name . '.' . $db_info['columns'][$table_name]['value']
  92. );
  93. if (isset($db_info['columns'][$table_name]['value2'])) {
  94. $related_fields = array_merge($related_fields, array($table_name . '.' . $db_info['columns'][$table_name]['value2']));
  95. }
  96. if (isset($db_info['columns'][$table_name]['timezone'])) {
  97. $related_fields = array_merge($related_fields, array($table_name . '.' . $db_info['columns'][$table_name]['timezone']));
  98. $timezone_field = $table_name . '.' . $db_info['columns'][$table_name]['timezone'];
  99. }
  100. if (isset($db_info['columns'][$table_name]['rrule'])) {
  101. $related_fields = array_merge($related_fields, array($table_name . '.' . $db_info['columns'][$table_name]['rrule']));
  102. $rrule_field = $table_name . '.' . $db_info['columns'][$table_name]['rrule'];
  103. }
  104. }
  105. // Get the delta value into the query.
  106. if ($field['cardinality'] != 1) {
  107. array_push($related_fields, "$table_name.delta");
  108. $delta_field = $table_name . '_delta';
  109. }
  110. }
  111. // Allow custom modules to provide date fields.
  112. else {
  113. foreach (module_implements('date_views_fields') as $module) {
  114. $function = $module . '_date_views_fields';
  115. if ($custom = $function("$table_name.$field_name")) {
  116. $type = 'custom';
  117. break;
  118. }
  119. }
  120. }
  121. // Don't do anything if this is not a date field we can handle.
  122. if (!empty($type) || empty($custom)) {
  123. $alias = str_replace('.', '_', $alias);
  124. $fields['name'][$name] = array(
  125. 'is_field' => $is_field,
  126. 'sql_type' => $sql_type,
  127. 'label' => $val['group'] . ': ' . $val['title'],
  128. 'granularity' => $granularity,
  129. 'fullname' => $name,
  130. 'table_name' => $table_name,
  131. 'field_name' => $field_name,
  132. 'query_name' => $alias,
  133. 'fromto' => $fromto,
  134. 'tz_handling' => $tz_handling,
  135. 'offset_field' => $offset_field,
  136. 'timezone_field' => $timezone_field,
  137. 'rrule_field' => $rrule_field,
  138. 'related_fields' => $related_fields,
  139. 'delta_field' => $delta_field,
  140. );
  141. // Allow the custom fields to over-write values.
  142. if (!empty($custom)) {
  143. foreach ($custom as $key => $val) {
  144. $fields['name'][$name][$key] = $val;
  145. }
  146. }
  147. $fields['name'][$name]['real_field_name'] = $field_name;
  148. $fields['alias'][$alias] = $fields['name'][$name];
  149. }
  150. }
  151. cache_set($cid, $fields, 'cache_views');
  152. return $fields;
  153. }