event_views.module in Event Views 5
Same filename and directory in other branches
Views-enables the event module.
File
event_views.moduleView source
<?php
/**
* @file
* Views-enables the event module.
*/
/**
* Implementation of hook_help().
*/
function event_views_help($section) {
switch ($section) {
case 'admin/help#event_views':
$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'),
));
$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>');
$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>');
return $output;
}
}
/**
* Implementation of hook_views_tables().
* Expose event fields and filters to the views module.
*/
function event_views_views_tables() {
// Create an option list of event content types.
$event_node_types = array_merge(event_get_types('all'), event_get_types('solo'));
$type_options = array();
foreach ($event_node_types as $type) {
$type_options[$type] = node_get_types('name', $type);
}
// Use this to default to current time.
$current = array(
'***CURRENT_TIME***' => t('now'),
);
// Limit years to years that have events.
$years = $current + drupal_map_assoc(range(intval(date("Y", variable_get('event_range_prev', time()))), intval(date("Y", variable_get('event_range_next', time())))));
$months = $current + drupal_map_assoc(range(1, 12), 'map_month');
$days = $current + drupal_map_assoc(range(1, 31));
$tables['event'] = array(
'name' => 'event',
'join' => array(
'left' => array(
'table' => 'node',
'field' => 'nid',
),
'right' => array(
'field' => 'nid',
),
),
'fields' => array(
'event_start' => array(
'name' => t('Event: Start Time'),
'sortable' => true,
'handler' => views_handler_field_dates(),
'option' => 'string',
'addlfields' => array(
'event_start',
'event_end',
'timezone',
),
),
'event_end' => array(
'name' => t('Event: End Time'),
'sortable' => true,
'handler' => views_handler_field_dates(),
'option' => 'string',
'addlfields' => array(
'event_start',
'event_end',
'timezone',
),
),
'timezone' => array(
'name' => t('Event: Timezone'),
'handler' => 'event_timezone_display_handler',
'query_handler' => 'event_views_query_handler',
'sortable' => true,
),
),
'sorts' => array(
'event_start' => array(
'name' => t('Event: Start Time'),
),
'event_end' => array(
'name' => t('Event: End Time'),
),
),
'filters' => array(
'event_start' => array(
'field' => 'event_start',
'name' => t('Event: Start Date'),
'operator' => 'views_handler_operator_gtlt',
'value' => views_handler_filter_date_value_form(),
'option' => 'string',
'handler' => 'event_views_handler_filter_timestamp',
'help' => t('This filter allows events to be filtered by their start date. Enter dates in the format: CCYY-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.'),
),
'event_end' => array(
'field' => 'event_end',
'name' => t('Event: End Date'),
'operator' => 'views_handler_operator_gtlt',
'value' => views_handler_filter_date_value_form(),
'option' => 'string',
'handler' => 'event_views_handler_filter_timestamp',
'help' => t('This filter allows events to be filtered by their end date. Enter dates in the format: CCYY-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.'),
),
'year' => array(
'field' => 'event_start',
'name' => t('Event: Start Year'),
'operator' => 'views_handler_operator_gtlt',
'list' => $years,
'list-type' => 'select',
'handler' => 'event_views_handler_filter_ymd',
'type' => 'YEAR',
'help' => t('Filter by year. Use the option to select the date field to filter on.'),
),
'month' => array(
'field' => 'event_start',
'name' => t('Event: Start Month'),
'operator' => 'views_handler_operator_gtlt',
'list' => $months,
'list-type' => 'select',
'handler' => 'event_views_handler_filter_ymd',
'type' => 'MONTH',
'help' => t('Filter by month. Use the option to select the date field to filter on.'),
),
'day' => array(
'field' => 'event_start',
'name' => t('Event: Start Day'),
'operator' => 'views_handler_operator_gtlt',
'list' => $days,
'list-type' => 'select',
'handler' => 'event_views_handler_filter_ymd',
'type' => 'DAYOFMONTH',
'help' => t('Filter by day. Use the option to select the date field to filter on.'),
),
),
);
// add a pseudo table to set up additional fields and filters for node table
$tables['event_views'] = array(
'name' => 'node',
'join' => array(
'left' => array(
'table' => 'node',
'field' => 'nid',
),
'right' => array(
'field' => 'nid',
),
),
// here's a filter that is limited to event content types to be used for exposed filters that should not contain other values
'filters' => array(
'event_type' => array(
'field' => 'type',
'name' => t('Event: Type'),
'list' => $type_options,
'list-type' => 'list',
'operator' => 'views_handler_operator_or',
'value-type' => 'array',
'help' => t('A node type selector that is limited to event-enabled node types. Use as exposed filter that only contains event node types.'),
),
),
);
return $tables;
}
/**
* Implementation of hook_views_arguments()
*/
function event_views_views_arguments() {
$arguments = array(
'event_year' => array(
'name' => t('Event: Start Year'),
'handler' => 'event_views_handler_arg_year',
'help' => t('Filter by the event year (YYYY).'),
),
'event_month' => array(
'name' => t('Event: Start Month'),
'handler' => 'event_views_handler_arg_month',
'help' => t("Filter by the event month (1-12). Place this argument after a 'Year' argument."),
),
'event_day' => array(
'name' => t('Event: Start Day'),
'handler' => 'event_views_handler_arg_day',
'help' => t("Filter by the event day (1-31). Place this argument after a 'Year' and a 'Month' argument."),
),
'event_week' => array(
'name' => t('Event: Start Week'),
'handler' => 'event_views_handler_arg_week',
'help' => t("Filter by the week number (1-52). Place this argument after a 'Year' argument."),
),
);
return $arguments;
}
/**
* Handle a timestamp filter.
* would use version in views.module except we have to ensure the events table is in the query
*/
function event_views_handler_filter_timestamp($op, $filter, $filterinfo, &$query) {
$value = $filter['value'] == 'now' ? "***CURRENT_TIME***" : strtotime($filter['value']);
$field = $filter['field'];
if ($filterinfo['from_unixtime']) {
$field = "from_UNIXTIME({$field})";
}
$query
->add_where("%s %s (%s + %d)", $field, $filter['operator'], $value, $filter['options']);
$query
->ensure_table('event');
}
/*
* Custom views handler for timezone, swap timezone name in for offset
*/
function event_views_timezone_display_handler($fieldinfo, $fielddata, $value, $data) {
if (!$value) {
return;
}
$zones = event_zonelist();
return $zones[$value];
}
/**
* A handler to insert substitute date values into the calendar query
*/
function event_views_calendar_query_handler(&$field, &$fieldinfo, &$query) {
$option = event_views_get_field($field['options']);
// make sure the table is joined into the query and have the selected field serve AS the calendar date
$query
->ensure_table($option['table']);
$query
->add_field($option['field'] . " AS " . $field[field] . "", $option['table']);
}
/*
* Custom views filter for year, month, day queries
*
* @param $filterinfo[operator] is =, >=, >, <=, <
* @param $filterinfo[type] is year, month, or day
*/
function event_views_handler_filter_ymd($op, $filter, $filterinfo, &$query) {
switch (trim($filter[value])) {
case '':
case 'all':
return;
break;
case '***CURRENT_TIME***':
$compare = strtoupper($filterinfo['type']) . "(from_UNIXTIME({$filter['value']}))";
break;
default:
$compare = intval($filter['value']);
break;
}
$sql = $filterinfo['type'] . "(from_UNIXTIME(event.event_start))";
$query
->ensure_table('event');
$query
->add_where("{$sql} {$filter['operator']} {$compare}");
}
/**
* Custom views handlers for the events arguments
*/
function event_views_handler_arg_year($op, &$query, $argtype, $arg = '') {
return event_views_handler_arg_type($op, $query, $argtype, $arg, 'event_year', 'YEAR');
}
function event_views_handler_arg_month($op, &$query, $argtype, $arg = '') {
return event_views_handler_arg_type($op, $query, $argtype, $arg, 'event_month', 'MONTH');
}
function event_views_handler_arg_day($op, &$query, $argtype, $arg = '') {
return event_views_handler_arg_type($op, $query, $argtype, $arg, 'event_day', 'DAYOFMONTH');
}
function event_views_handler_arg_week($op, &$query, $argtype, $arg = '') {
return event_views_handler_arg_type($op, $query, $argtype, $arg, 'event_week', 'WEEK');
}
function event_views_handler_arg_type($op, &$query, $argtype, $arg, $field_name, $field_type) {
$timezone = _views_get_timezone();
switch ($field_type) {
case 'MONTH':
$month = $arg ? $arg : $query->event_month ? $query->event_month : '';
$title = $month ? date('F', strtotime("2006-{$month}-01")) : $query->{$field_name};
$sql_adj = '';
break;
case 'WEEK':
$title = t('Week ') . $query->{$field_name};
$sql_adj = ', 3';
default:
$title = $query->{$field_name};
$sql_adj = '';
break;
}
if ($title == '') {
$title = t('N/A');
}
// not yet postgres compatible, goal is to get it working reliably, then try to figure out
// postgres support
$sql = "{$field_type}(from_UNIXTIME(event.event_start){$sql_adj})";
switch ($op) {
case 'summary':
$fieldinfo['field'] = $sql;
$fieldinfo['fieldname'] = $field_name;
$query
->ensure_table('event');
return $fieldinfo;
break;
case 'sort':
$query
->add_orderby(NULL, $field_name, $argtype);
break;
case 'filter':
$event_year = intval($arg);
$query
->add_where("{$sql} = " . $arg);
$query
->ensure_table('event');
break;
case 'link':
if ($title != t('N/A')) {
return l($title, $arg . '/' . $query->{$field_name});
}
else {
return $title;
}
case 'title':
return $title;
}
}
/**
* Implementation of hook_views_default_views()
* Create default event views
*/
function event_views_views_default_views() {
// avoid miscellaneous problems by forcing the cache to clear before creating a default view
views_invalidate_cache();
$event_node_types = array_merge(event_get_types('all'), event_get_types('solo'));
$view = new stdClass();
$view->name = t('event_select');
$view->description = t('Events list filtered by drop-down date selector.');
$view->disabled = TRUE;
$view->access = array();
$view->view_args_php = '';
$view->page = TRUE;
$view->page_title = t('event list');
$view->page_header = '';
$view->page_header_format = '1';
$view->page_footer = '';
$view->page_footer_format = '1';
$view->page_empty = '';
$view->page_empty_format = '1';
$view->page_type = 'table';
$view->url = 'event/select';
$view->use_pager = TRUE;
$view->nodes_per_page = '10';
$view->menu = FALSE;
$view->menu_title = '';
$view->menu_tab = FALSE;
$view->menu_tab_default = FALSE;
$view->menu_weight = '';
$view->sort = array();
$view->argument = array();
$view->field = array(
array(
'tablename' => 'node',
'field' => 'title',
'label' => t('Title'),
'handler' => 'views_handler_field_nodelink',
'sortable' => '1',
),
array(
'tablename' => 'event',
'field' => 'event_start',
'label' => t('Start Time:'),
'handler' => 'views_handler_field_date_small',
'sortable' => '1',
),
array(
'tablename' => 'event',
'field' => 'event_end',
'label' => t('End Time:'),
'handler' => 'views_handler_field_date_small',
'sortable' => '1',
),
);
$view->filter = array(
array(
'tablename' => 'node',
'field' => 'status',
'operator' => '=',
'options' => '',
'value' => '1',
),
array(
'tablename' => 'node',
'field' => 'type',
'operator' => 'OR',
'options' => '',
'value' => $event_node_types,
),
array(
'tablename' => 'event',
'field' => 'year',
'operator' => '=',
'options' => '',
'value' => '***CURRENT_TIME***',
),
array(
'tablename' => 'event',
'field' => 'month',
'operator' => '>=',
'options' => '',
'value' => '***CURRENT_TIME***',
),
array(
'tablename' => 'event',
'field' => 'day',
'operator' => '>=',
'options' => '',
'value' => '1',
),
);
$view->exposed_filter = array(
array(
'tablename' => 'event',
'field' => 'year',
'label' => t('Start Year:'),
'optional' => 0,
'is_default' => 0,
'operator' => 0,
'single' => 0,
),
array(
'tablename' => 'event',
'field' => 'month',
'label' => t('Start Month:'),
'optional' => 0,
'is_default' => 0,
'operator' => 0,
'single' => 0,
),
array(
'tablename' => 'event',
'field' => 'day',
'label' => t('Start Day:'),
'optional' => 0,
'is_default' => 0,
'operator' => 0,
'single' => 0,
),
);
$view->requires = array(
node,
event,
);
$views[$view->name] = $view;
$view = new stdClass();
$view->name = t('event_js');
$view->description = t('Events list filtered by js date selector.');
$view->disabled = TRUE;
$view->access = array();
$view->view_args_php = '';
$view->page = TRUE;
$view->page_title = t('event list');
$view->page_header = '';
$view->page_header_format = '1';
$view->page_footer = '';
$view->page_footer_format = '1';
$view->page_empty = '';
$view->page_empty_format = '1';
$view->page_type = 'table';
$view->url = 'event/selector';
$view->use_pager = TRUE;
$view->nodes_per_page = '10';
$view->menu = FALSE;
$view->menu_title = '';
$view->menu_tab = FALSE;
$view->menu_tab_default = FALSE;
$view->menu_weight = '';
$view->sort = array();
$view->argument = array();
$view->field = array(
array(
'tablename' => 'node',
'field' => 'title',
'label' => t('Title'),
'handler' => 'views_handler_field_nodelink',
'sortable' => '1',
),
array(
'tablename' => 'event',
'field' => 'event_start',
'label' => t('Start Time:'),
'handler' => 'views_handler_field_date_small',
'sortable' => '1',
),
array(
'tablename' => 'event',
'field' => 'event_end',
'label' => t('End Time:'),
'handler' => 'views_handler_field_date_small',
'sortable' => '1',
),
);
$view->filter = array(
array(
'tablename' => 'node',
'field' => 'status',
'operator' => '=',
'options' => '',
'value' => '1',
),
array(
'tablename' => 'node',
'field' => 'type',
'operator' => 'OR',
'options' => '',
'value' => $event_node_types,
),
array(
'tablename' => 'event',
'field' => 'event_start',
'operator' => '>',
'options' => '',
'value' => 'now',
),
array(
'tablename' => 'event',
'field' => 'event_end',
'operator' => '>',
'options' => '',
'value' => 'now',
),
);
$view->exposed_filter = array(
array(
'tablename' => 'event',
'field' => 'event_start',
'label' => t('Start Date'),
'optional' => 0,
'is_default' => 0,
'operator' => 0,
'single' => 0,
),
array(
'tablename' => 'event',
'field' => 'event_end',
'label' => t('End Date'),
'optional' => 0,
'is_default' => 0,
'operator' => 0,
'single' => 0,
),
);
$view->requires = array(
node,
event,
);
$views[$view->name] = $view;
$view = new stdClass();
$view->name = t('event_date');
$view->description = t('Events list filtered by url arguments.');
$view->disabled = TRUE;
$view->access = array();
$view->view_args_php = '';
$view->page = TRUE;
$view->page_title = t('event list');
$view->page_header = '';
$view->page_header_format = '1';
$view->page_footer = '';
$view->page_footer_format = '1';
$view->page_empty = '';
$view->page_empty_format = '1';
$view->page_type = 'table';
$view->url = 'event/date';
$view->use_pager = TRUE;
$view->nodes_per_page = '10';
$view->menu = FALSE;
$view->menu_title = '';
$view->menu_tab = FALSE;
$view->menu_tab_default = FALSE;
$view->menu_weight = '';
$view->sort = array();
$view->argument = array();
$view->field = array(
array(
'tablename' => 'node',
'field' => 'title',
'label' => t('Title'),
'handler' => 'views_handler_field_nodelink',
'sortable' => '1',
),
array(
'tablename' => 'event',
'field' => 'event_start',
'label' => t('Start Time:'),
'handler' => 'views_handler_field_date_small',
'sortable' => '1',
),
array(
'tablename' => 'event',
'field' => 'event_end',
'label' => t('End Time:'),
'handler' => 'views_handler_field_date_small',
'sortable' => '1',
),
);
$view->filter = array(
array(
'tablename' => 'node',
'field' => 'status',
'operator' => '=',
'options' => '',
'value' => '1',
),
array(
'tablename' => 'node',
'field' => 'type',
'operator' => 'OR',
'options' => '',
'value' => $event_node_types,
),
);
$view->exposed_filter = array();
$view->argument = array(
array(
'type' => 'event_year',
'argdefault' => '6',
'title' => t('Year'),
'options' => '',
),
array(
'type' => 'event_month',
'argdefault' => '6',
'title' => t('Month'),
'options' => '',
),
array(
'type' => 'event_day',
'argdefault' => '6',
'title' => t('Day'),
'options' => '',
),
);
$view->requires = array(
node,
event,
);
$views[$view->name] = $view;
return $views;
}
Functions
Name![]() |
Description |
---|---|
event_views_calendar_query_handler | A handler to insert substitute date values into the calendar query |
event_views_handler_arg_day | |
event_views_handler_arg_month | |
event_views_handler_arg_type | |
event_views_handler_arg_week | |
event_views_handler_arg_year | Custom views handlers for the events arguments |
event_views_handler_filter_timestamp | Handle a timestamp filter. would use version in views.module except we have to ensure the events table is in the query |
event_views_handler_filter_ymd | |
event_views_help | Implementation of hook_help(). |
event_views_timezone_display_handler | |
event_views_views_arguments | Implementation of hook_views_arguments() |
event_views_views_default_views | Implementation of hook_views_default_views() Create default event views |
event_views_views_tables | Implementation of hook_views_tables(). Expose event fields and filters to the views module. |