/[drupal]/contributions/modules/event_views/event_views.module
ViewVC logotype

Contents of /contributions/modules/event_views/event_views.module

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.26 - (show annotations) (download) (as text)
Sun Jun 28 11:16:06 2009 UTC (5 months ago) by killes
Branch: MAIN
CVS Tags: HEAD
Changes since 1.25: +10 -1 lines
File MIME type: text/x-php
add views_api hook
1 <?php
2 // $Id: event_views.module,v 1.25 2008/01/06 00:31:11 killes Exp $
3 /**
4 * @file
5 * Views-enables the event module.
6 */
7
8 /**
9 * Implementation of hook_help().
10 */
11 function event_views_help($section) {
12 switch ($section) {
13 case 'admin/help#event_views':
14 $output = t('<p>The Event Views module makes the event fields available to the Views module, and creates default event views that filter dates using a drop-down date selector, the jscalendar selector, or by arguments in the url. Set up a default event view by going to %link and select <strong>add</strong>. Save the default views as-is or make any changes you like.</p>', array('%link' => l('admin/views', 'admin/views')));
15 $output .= t('<p>You can change the format of the output. The default views display a list of events, but you can change it to a table or a teaser list in the <strong>Page</strong> settings. You can also add or remove fields from the view.</p>');
16 $output .= t('<p>You can filter events in several ways. Use filters to pre-select a date range, expose those filters to allow the viewer to select a date range, or eliminate the filters and give the view year, month, and day arguments to filter the events by the url (i.e. YYYY/MM/DD).</p>');
17 return $output;
18 }
19 }
20
21 /**
22 * Implementation of hook_views_api().
23 */
24 function event_views_views_api() {
25 return array(
26 'api' => 2,
27 );
28 }
29
30 /**
31 * Implementation of hook_views_tables().
32 * Expose event fields and filters to the views module.
33 */
34 function event_views_views_tables() {
35 // Create an option list of event content types.
36 $event_node_types = array_merge(event_get_types('all'), event_get_types('solo'));
37 $type_options = array();
38 foreach ($event_node_types as $type) {
39 $type_options[$type] = node_get_types('name', $type);
40 }
41
42 // Use this to default to current time.
43 $current = array('***CURRENT_DATETIME***' => t('now'));
44
45 // Limit years to years that have events.
46 $range_prev = variable_get('event_range_prev', array('year' => date('%Y')));
47 $range_next = variable_get('event_range_next', array('year' => date('%Y')));
48 $years = $current + drupal_map_assoc(range(intval($range_prev['year']), intval($range_next['year'])));
49 $months = ($current + drupal_map_assoc(range(1, 12), 'map_month'));
50 $days = ($current + drupal_map_assoc(range(1, 31)));
51
52 $tables['event'] = array(
53 'name' => 'event',
54 'join' => array(
55 'left' => array(
56 'table' => 'node',
57 'field' => 'nid'
58 ),
59 'right' => array(
60 'field' => 'nid'
61 ),
62 ),
63 'fields' => array(
64 'event_start' => array(
65 'name' => t('Event: Start Time'),
66 'sortable' => true,
67 'handler' => event_views_handler_field_dates_iso(),
68 'option' => 'string',
69 'addlfields' => array('event_start', 'event_end', 'timezone'),
70 ),
71 'event_end' => array(
72 'name' => t('Event: End Time'),
73 'sortable' => true,
74 'handler' => event_views_handler_field_dates_iso(),
75 'option' => 'string',
76 'addlfields' => array('event_start', 'event_end', 'timezone'),
77 ),
78 'timezone' => array(
79 'name' => t('Event: Timezone'),
80 'handler' => 'event_views_timezone_display_handler',
81 'query_handler' => 'event_views_query_handler',
82 'sortable' => true,
83 ),
84 ),
85 'sorts' => array(
86 'event_start' => array('name' => t('Event: Start Time')),
87 'event_end' => array('name' => t('Event: End Time')),
88 ),
89 'filters' => array(
90 'event_start' => array(
91 'field' => 'event_start',
92 'name' => t('Event: Start Date'),
93 'operator' => 'views_handler_operator_gtlt',
94 'value' => views_handler_filter_date_value_form(),
95 'option' => 'string',
96 'handler' => 'event_views_handler_filter_datetime',
97 'help' => t('This filter allows events to be filtered by their start date. Enter dates in the format: YYYY-MM-DD HH:MM:SS. Enter \'now\' to use the current time. You may enter a delta (in seconds) to the option that will be added to the time; this is most useful when combined with now. If you have the jscalendar module from jstools installed, you can use a popup date picker here.'),
98 ),
99 'event_end' => array(
100 'field' => 'event_end',
101 'name' => t('Event: End Date'),
102 'operator' => 'views_handler_operator_gtlt',
103 'value' => views_handler_filter_date_value_form(),
104 'option' => 'string',
105 'handler' => 'event_views_handler_filter_datetime',
106 'help' => t('This filter allows events to be filtered by their end date. Enter dates in the format: YYYY-MM-DD HH:MM:SS. Enter \'now\' to use the current time. You may enter a delta (in seconds) to the option that will be added to the time; this is most useful when combined with now. If you have the jscalendar module from jstools installed, you can use a popup date picker here.'),
107 ),
108 'year' => array(
109 'field' => 'event_start',
110 'name' => t('Event: Start Year'),
111 'operator' => 'views_handler_operator_gtlt',
112 'list' => $years,
113 'list-type' => 'select',
114 'handler' => 'event_views_handler_filter_ymd',
115 'type' => 'YEAR',
116 'help' => t('Filter by year. Use the option to select the date field to filter on.'),
117 ),
118 'month' => array(
119 'field' => 'event_start',
120 'name' => t('Event: Start Month'),
121 'operator' => 'views_handler_operator_gtlt',
122 'list' => $months,
123 'list-type' => 'select',
124 'handler' => 'event_views_handler_filter_ymd',
125 'type' => 'MONTH',
126 'help' => t('Filter by month. Use the option to select the date field to filter on.'),
127 ),
128 'day' => array(
129 'field' => 'event_start',
130 'name' => t('Event: Start Day'),
131 'operator' => 'views_handler_operator_gtlt',
132 'list' => $days,
133 'list-type' => 'select',
134 'handler' => 'event_views_handler_filter_ymd',
135 'type' => 'DAYOFMONTH',
136 'help' => t('Filter by day. Use the option to select the date field to filter on.'),
137 ),
138 ),
139 );
140
141 // add a pseudo table to set up additional fields and filters for node table
142 $tables['event_views'] = array(
143 'name' => 'node',
144 'join' => array(
145 'left' => array(
146 'table' => 'node',
147 'field' => 'nid'
148 ),
149 'right' => array(
150 'field' => 'nid'
151 ),
152 ),
153 // here's a filter that is limited to event content types to be used for exposed filters that should not contain other values
154 'filters' => array(
155 'event_type' => array(
156 'field' => 'type',
157 'name' => t('Event: Type'),
158 'list' => $type_options,
159 'list-type' => 'list',
160 'operator' => 'views_handler_operator_or',
161 'value-type' => 'array',
162 'help' => t('A node type selector that is limited to event-enabled node types. Use as exposed filter that only contains event node types.'),
163 ),
164 ),
165 );
166
167 return $tables;
168 }
169
170 /**
171 * Implementation of hook_views_arguments()
172 */
173 function event_views_views_arguments() {
174 $arguments = array(
175 'event_year' => array(
176 'name' => t('Event: Start Year'),
177 'handler' => 'event_views_handler_arg_year',
178 'help' => t('Filter by the event year (YYYY).'),
179 ),
180 'event_month' => array(
181 'name' => t('Event: Start Month'),
182 'handler' => 'event_views_handler_arg_month',
183 'help' => t("Filter by the event month (1-12). Place this argument after a 'Year' argument."),
184 ),
185 'event_day' => array(
186 'name' => t('Event: Start Day'),
187 'handler' => 'event_views_handler_arg_day',
188 'help' => t("Filter by the event day (1-31). Place this argument after a 'Year' and a 'Month' argument."),
189 ),
190 'event_week' => array(
191 'name' => t('Event: Start Week'),
192 'handler' => 'event_views_handler_arg_week',
193 'help' => t("Filter by the week number (1-52). Place this argument after a 'Year' argument."),
194 ),
195 );
196 return $arguments;
197 }
198
199 /**
200 * Handle a timestamp filter.
201 *
202 * Would use version in views.module except we have to ensure the
203 * events table is in the query.
204 */
205 function event_views_handler_filter_datetime($op, $filter, $filterinfo, &$query) {
206 $value = $filter['value'] == 'now' ? "***CURRENT_DATETIME***" : strtotime($filter['value']);
207
208 $field = $filter['field'];
209 $query->add_where("%s %s DATE_ADD('%s', INTERVAL %d SECOND)", $field, $filter['operator'], $value, $filter['options']);
210 $query->ensure_table('event');
211 }
212
213 /*
214 * Custom views handler for timezone, swap timezone name in for offset
215 */
216 function event_views_timezone_display_handler($fieldinfo, $fielddata, $value, $data) {
217 if (!$value) return;
218 $zone = event_zonelist_by_id($value);
219 return $zone['name'];
220 }
221
222 /**
223 * A handler to insert substitute date values into the calendar query
224 */
225 function event_views_calendar_query_handler(&$field, &$fieldinfo, &$query) {
226
227 $option = event_views_get_field($field['options']);
228
229 // make sure the table is joined into the query and have the selected field serve AS the calendar date
230 $query->ensure_table($option['table']);
231 $query->add_field($option['field'] ." AS ". $field[field] ."", $option['table']);
232 }
233
234 /*
235 * Custom views filter for year, month, day queries
236 *
237 * @param $filterinfo[operator] is =, >=, >, <=, <
238 * @param $filterinfo[type] is year, month, or day
239 */
240 function event_views_handler_filter_ymd($op, $filter, $filterinfo, &$query) {
241
242 switch(trim($filter['value'])) {
243 case '':
244 case 'all':
245 return;
246 break;
247 case '***CURRENT_DATETIME***':
248 $compare = strtoupper($filterinfo['type']) ."($filter[value])";
249 break;
250 default:
251 $compare = intval($filter['value']);
252 break;
253 }
254 $sql = $filterinfo['type'] ."(event.event_start)";
255 $query->ensure_table('event');
256 $query->add_where("$sql $filter[operator] $compare");
257 }
258
259 /**
260 * Substitute current time; this works with cached queries.
261 */
262 function event_views_views_query_substitutions($view) {
263 return array('***CURRENT_DATETIME***' => gmdate('Y-m-d H:i', time()));
264 }
265
266 /**
267 * Custom views handlers for the events arguments
268 */
269
270 function event_views_handler_arg_year($op, &$query, $argtype, $arg = '') {
271 return event_views_handler_arg_type($op, $query, $argtype, $arg, 'event_year', 'YEAR');
272 }
273
274 function event_views_handler_arg_month($op, &$query, $argtype, $arg = '') {
275 return event_views_handler_arg_type($op, $query, $argtype, $arg, 'event_month', 'MONTH');
276 }
277
278 function event_views_handler_arg_day($op, &$query, $argtype, $arg = '') {
279 return event_views_handler_arg_type($op, $query, $argtype, $arg, 'event_day', 'DAYOFMONTH');
280 }
281
282 function event_views_handler_arg_week($op, &$query, $argtype, $arg = '') {
283 return event_views_handler_arg_type($op, $query, $argtype, $arg, 'event_week', 'WEEK');
284 }
285
286 function event_views_handler_arg_type($op, &$query, $argtype, $arg, $field_name, $field_type) {
287
288 $timezone = _views_get_timezone();
289
290 switch ($field_type) {
291 case ('MONTH'):
292 $month = $arg ? $arg : $query->event_month ? $query->event_month : '';
293 $title = $month ? date('F', strtotime("2006-{$month}-01")) : $query->$field_name;
294 $sql_adj = '';
295 break;
296 case ('WEEK'):
297 $title = t('Week ') . $query->$field_name;
298 $sql_adj = ', 3';
299 default:
300 $title = $query->$field_name;
301 $sql_adj = '';
302 break;
303 }
304
305 if ($title == '') {
306 $title = t('N/A');
307 }
308
309 // not yet postgres compatible, goal is to get it working reliably,
310 // then try to figure out postgres support
311 $sql = "$field_type(event.event_start$sql_adj)";
312
313 switch($op) {
314 case 'summary':
315 $fieldinfo['field'] = $sql;
316 $fieldinfo['fieldname'] = $field_name;
317 $query->ensure_table('event');
318 return $fieldinfo;
319 break;
320 case 'sort':
321 $query->add_orderby(NULL, $field_name, $argtype);
322 break;
323 case 'filter':
324 $event_year = intval($arg);
325 $query->add_where("$sql = ". $arg);
326 $query->ensure_table('event');
327 break;
328 case 'link':
329 if ($title != t('N/A')) {
330 return l($title, $arg .'/'. $query->$field_name);
331 }
332 else {
333 return $title;
334 }
335 case 'title':
336 return $title;
337 }
338 }
339
340 /**
341 * Implementation of hook_views_default_views()
342 * Create default event views
343 */
344 function event_views_views_default_views() {
345
346 // avoid miscellaneous problems by forcing the cache to clear before creating a default view
347 views_invalidate_cache();
348
349 $event_node_types = array_merge(event_get_types('all'), event_get_types('solo'));
350
351 $view = new stdClass();
352 $view->name = t('event_select');
353 $view->description = t('Events list filtered by drop-down date selector.');
354 $view->disabled = TRUE;
355 $view->access = array (
356 );
357 $view->view_args_php = '';
358 $view->page = TRUE;
359 $view->page_title = t('event list');
360 $view->page_header = '';
361 $view->page_header_format = '1';
362 $view->page_footer = '';
363 $view->page_footer_format = '1';
364 $view->page_empty = '';
365 $view->page_empty_format = '1';
366 $view->page_type = 'table';
367 $view->url = 'event/select';
368 $view->use_pager = TRUE;
369 $view->nodes_per_page = '10';
370 $view->menu = FALSE;
371 $view->menu_title = '';
372 $view->menu_tab = FALSE;
373 $view->menu_tab_default = FALSE;
374 $view->menu_weight = '';
375 $view->sort = array (
376 );
377 $view->argument = array (
378 );
379 $view->field = array (
380 array (
381 'tablename' => 'node',
382 'field' => 'title',
383 'label' => t('Title'),
384 'handler' => 'views_handler_field_nodelink',
385 'sortable' => '1',
386 ),
387 array (
388 'tablename' => 'event',
389 'field' => 'event_start',
390 'label' => t('Start Time:'),
391 'handler' => 'views_handler_field_date_small_iso',
392 'sortable' => '1',
393 ),
394 array (
395 'tablename' => 'event',
396 'field' => 'event_end',
397 'label' => t('End Time:'),
398 'handler' => 'views_handler_field_date_small_iso',
399 'sortable' => '1',
400 ),
401 );
402 $view->filter = array (
403 array (
404 'tablename' => 'node',
405 'field' => 'status',
406 'operator' => '=',
407 'options' => '',
408 'value' => '1',
409 ),
410 array (
411 'tablename' => 'node',
412 'field' => 'type',
413 'operator' => 'OR',
414 'options' => '',
415 'value' => $event_node_types,
416 ),
417 array (
418 'tablename' => 'event',
419 'field' => 'year',
420 'operator' => '=',
421 'options' => '',
422 'value' => '***CURRENT_DATETIME***',
423 ),
424 array (
425 'tablename' => 'event',
426 'field' => 'month',
427 'operator' => '>=',
428 'options' => '',
429 'value' => '***CURRENT_DATETIME***',
430 ),
431 array (
432 'tablename' => 'event',
433 'field' => 'day',
434 'operator' => '>=',
435 'options' => '',
436 'value' => '1',
437 ),
438
439 );
440 $view->exposed_filter = array (
441 array (
442 'tablename' => 'event',
443 'field' => 'year',
444 'label' => t('Start Year:'),
445 'optional' => 0,
446 'is_default' => 0,
447 'operator' => 0,
448 'single' => 0,
449 ),
450 array (
451 'tablename' => 'event',
452 'field' => 'month',
453 'label' => t('Start Month:'),
454 'optional' => 0,
455 'is_default' => 0,
456 'operator' => 0,
457 'single' => 0,
458 ),
459 array (
460 'tablename' => 'event',
461 'field' => 'day',
462 'label' => t('Start Day:'),
463 'optional' => 0,
464 'is_default' => 0,
465 'operator' => 0,
466 'single' => 0,
467 ),
468 );
469 $view->requires = array('node', 'event');
470 $views[$view->name] = $view;
471
472 $view = new stdClass();
473 $view->name = t('event_js');
474 $view->description = t('Events list filtered by js date selector.');
475 $view->disabled = TRUE;
476 $view->access = array (
477 );
478 $view->view_args_php = '';
479 $view->page = TRUE;
480 $view->page_title = t('event list');;
481 $view->page_header = '';
482 $view->page_header_format = '1';
483 $view->page_footer = '';
484 $view->page_footer_format = '1';
485 $view->page_empty = '';
486 $view->page_empty_format = '1';
487 $view->page_type = 'table';
488 $view->url = 'event/selector';
489 $view->use_pager = TRUE;
490 $view->nodes_per_page = '10';
491 $view->menu = FALSE;
492 $view->menu_title = '';
493 $view->menu_tab = FALSE;
494 $view->menu_tab_default = FALSE;
495 $view->menu_weight = '';
496 $view->sort = array (
497 );
498 $view->argument = array (
499 );
500 $view->field = array (
501 array (
502 'tablename' => 'node',
503 'field' => 'title',
504 'label' => t('Title'),
505 'handler' => 'views_handler_field_nodelink',
506 'sortable' => '1',
507 ),
508 array (
509 'tablename' => 'event',
510 'field' => 'event_start',
511 'label' => t('Start Time:'),
512 'handler' => 'views_handler_field_date_small_iso',
513 'sortable' => '1',
514 ),
515 array (
516 'tablename' => 'event',
517 'field' => 'event_end',
518 'label' => t('End Time:'),
519 'handler' => 'views_handler_field_date_small_iso',
520 'sortable' => '1',
521 ),
522 );
523 $view->filter = array (
524 array (
525 'tablename' => 'node',
526 'field' => 'status',
527 'operator' => '=',
528 'options' => '',
529 'value' => '1',
530 ),
531 array (
532 'tablename' => 'node',
533 'field' => 'type',
534 'operator' => 'OR',
535 'options' => '',
536 'value' => $event_node_types,
537 ),
538 array (
539 'tablename' => 'event',
540 'field' => 'event_start',
541 'operator' => '>',
542 'options' => '',
543 'value' => 'now',
544 ),
545 array (
546 'tablename' => 'event',
547 'field' => 'event_end',
548 'operator' => '>',
549 'options' => '',
550 'value' => 'now',
551 ),
552 );
553 $view->exposed_filter = array (
554 array (
555 'tablename' => 'event',
556 'field' => 'event_start',
557 'label' => t('Start Date'),
558 'optional' => 0,
559 'is_default' => 0,
560 'operator' => 0,
561 'single' => 0,
562 ),
563 array (
564 'tablename' => 'event',
565 'field' => 'event_end',
566 'label' => t('End Date'),
567 'optional' => 0,
568 'is_default' => 0,
569 'operator' => 0,
570 'single' => 0,
571 ),
572 );
573
574 $view->requires = array('node', 'event');
575 $views[$view->name] = $view;
576
577
578 $view = new stdClass();
579 $view->name = t('event_date');
580 $view->description = t('Events list filtered by url arguments.');
581 $view->disabled = TRUE;
582 $view->access = array (
583 );
584 $view->view_args_php = '';
585 $view->page = TRUE;
586 $view->page_title = t('event list');;
587 $view->page_header = '';
588 $view->page_header_format = '1';
589 $view->page_footer = '';
590 $view->page_footer_format = '1';
591 $view->page_empty = '';
592 $view->page_empty_format = '1';
593 $view->page_type = 'table';
594 $view->url = 'event/date';
595 $view->use_pager = TRUE;
596 $view->nodes_per_page = '10';
597 $view->menu = FALSE;
598 $view->menu_title = '';
599 $view->menu_tab = FALSE;
600 $view->menu_tab_default = FALSE;
601 $view->menu_weight = '';
602 $view->sort = array (
603 );
604 $view->argument = array (
605 );
606 $view->field = array (
607 array (
608 'tablename' => 'node',
609 'field' => 'title',
610 'label' => t('Title'),
611 'handler' => 'views_handler_field_nodelink',
612 'sortable' => '1',
613 ),
614 array (
615 'tablename' => 'event',
616 'field' => 'event_start',
617 'label' => t('Start Time:'),
618 'handler' => 'views_handler_field_date_small_iso',
619 'sortable' => '1',
620 ),
621 array (
622 'tablename' => 'event',
623 'field' => 'event_end',
624 'label' => t('End Time:'),
625 'handler' => 'views_handler_field_date_small_iso',
626 'sortable' => '1',
627 ),
628 );
629 $view->filter = array (
630 array (
631 'tablename' => 'node',
632 'field' => 'status',
633 'operator' => '=',
634 'options' => '',
635 'value' => '1',
636 ),
637 array (
638 'tablename' => 'node',
639 'field' => 'type',
640 'operator' => 'OR',
641 'options' => '',
642 'value' => $event_node_types,
643 ),
644 );
645 $view->exposed_filter = array ();
646 $view->argument = array (
647 array (
648 'type' => 'event_year',
649 'argdefault' => '6',
650 'title' => t('Year'),
651 'options' => '',
652 ),
653 array (
654 'type' => 'event_month',
655 'argdefault' => '6',
656 'title' => t('Month'),
657 'options' => '',
658 ),
659 array (
660 'type' => 'event_day',
661 'argdefault' => '6',
662 'title' => t('Day'),
663 'options' => '',
664 ),
665 );
666 $view->requires = array('node', 'event');
667 $views[$view->name] = $view;
668
669 return $views;
670 }
671
672 /**
673 * Provide a list of all standard supported iso date output handlers.
674 */
675 function event_views_handler_field_dates_iso() {
676 return array(
677 'event_views_handler_field_date_small_iso' => t('As Short Date'),
678 'event_views_handler_field_date_iso' => t('As Medium Date'),
679 'event_views_handler_field_date_large_iso' => t('As Long Date'),
680 'event_views_handler_field_date_custom_iso' => t('As Custom Date'),
681 'event_views_handler_field_since_iso' => t('As Time Ago')
682 );
683 }
684
685 function event_views_handler_field_date_iso($fieldinfo, $fielddata, $value, $data) {
686 return $value ? event_format_date($value) : theme('views_nodate');
687 }
688
689
690 /**
691 * Format a date using small representation.
692 */
693 function event_views_handler_field_date_small_iso($fieldinfo, $fielddata, $value, $data) {
694 return $value ? event_format_date($value, 'small') : theme('views_nodate');
695 }
696
697 /**
698 * Format a date using large representation.
699 */
700 function event_views_handler_field_date_large_iso($fieldinfo, $fielddata, $value, $data) {
701 return $value ? event_format_date($value, 'large') : theme('views_nodate');
702 }
703
704 /**
705 * Format a date using custom representation.
706 */
707 function event_views_handler_field_date_custom_iso($fieldinfo, $fielddata, $value, $data) {
708 return $value ? event_format_date($value, 'custom', $fielddata['options']) : theme('views_nodate');
709 }

  ViewVC Help
Powered by ViewVC 1.1.2