array( 'left_field' => 'nid', 'field' => 'nid', ), ); $data['event']['event_start'] = array( 'title' => t('Start Date'), 'help' => t('The start Date of the Event.'), 'field' => array( 'handler' => 'event_handler_field_date', 'click sortable' => TRUE, 'additional fields' => array('event_start', 'event_end', 'timezone'), 'option' => 'string', ), 'argument' => array( 'handler' => 'event_handler_argument_fulldate', 'field' => 'event_start', ), 'filter' => array( 'field' => 'event_start', 'label' => t('Start Date'), 'operator' => 'event_handler_filter_date', 'value' => array( '#type' => 'textfield', '#attributes' => array('class' => 'jscalendar'), ), 'option' => 'string', 'handler' => 'event_handler_filter_date', 'help' => t('This filter allows events to be filtered by their start date. '), ), 'sort' => array( 'handler' => 'views_handler_sort_date', 'label' => t('Start Date'), ), ); $data['event']['event_end'] = array( 'title' => t('End Date'), 'help' => t('The end date of the Event.'), 'field' => array( 'handler' => 'event_handler_field_date', 'click sortable' => TRUE, 'additional fields' => array('event_start', 'event_end', 'timezone'), 'option' => 'string', ), 'argument' => array( 'handler' => 'event_handler_argument_fulldate', 'field' => 'event_end', ), 'filter' => array( 'field' => 'event_end', 'label' => t('End Date'), 'operator' => 'event_handler_filter_date', 'value' => array( '#type' => 'textfield', '#attributes' => array('class' => 'jscalendar'), ), 'option' => 'string', 'handler' => 'event_handler_filter_date', 'help' => t('This filter allows events to be filtered by their end date.'), ), 'sort' => array( 'handler' => 'views_handler_sort_date', 'label' => t('End Date'), ), ); $data['event']['timezone'] = array( 'title' => t('Timezone'), 'help' => t('The timezone of the Event.'), 'field' => array( 'handler' => 'event_handler_field_timezone', 'click sortable' => TRUE, 'query handler' => 'event_views_query_handler', 'option' => 'string', ), ); $data['event']['start_year'] = array( 'title' => t('Start Year'), 'help' => t('Start Date Year'), 'real field' => 'event_start', 'filter' => array( 'field' => 'event_start', 'label' => t('Start Year'), 'handler' => 'event_handler_filter_year', 'help' => t('Filter by year.'), ), 'argument' => array( 'handler' => 'event_handler_argument_year', 'field' => 'event_start', ), ); $data['event']['start_month'] = array( 'title' => t('Start Month'), 'help' => t('Start Date Month'), 'real field' => 'event_start', 'filter' => array( 'field' => 'event_start', 'label' => t('Start Month'), 'handler' => 'event_handler_filter_month', 'help' => t('Filter by month.'), ), 'argument' => array( 'handler' => 'event_handler_argument_month', 'field' => 'event_start', ), ); $data['event']['start_day'] = array( 'title' => t('Start Day'), 'help' => t('Start Day'), 'real field' => 'event_start', 'filter' => array( 'field' => 'event_start', 'label' => t('Start Day'), 'handler' => 'event_handler_filter_day', 'help' => t('Filter by day.'), ), 'argument' => array( 'handler' => 'event_handler_argument_day', 'field' => 'event_start', ), ); $data['event']['start_week'] = array( 'title' => t('Start Week'), 'help' => t('Filter by the week number (1-52). Place this argument after a "Year" argument.'), 'real field' => 'event_start', 'argument' => array( 'handler' => 'event_handler_argument_week', 'field' => 'event_start', ), ); $data['event']['end_year'] = array( 'title' => t('End Year'), 'help' => t('End Date Year'), 'real field' => 'event_end', 'filter' => array( 'field' => 'event_end', 'label' => t('End Year'), 'handler' => 'event_handler_filter_year', 'help' => t('Filter by year.'), ), 'argument' => array( 'handler' => 'event_handler_argument_year', 'field' => 'event_end', ), ); $data['event']['end_month'] = array( 'title' => t('End Month'), 'help' => t('End Date Month'), 'real field' => 'event_end', 'filter' => array( 'field' => 'event_end', 'label' => t('End Month'), 'handler' => 'event_handler_filter_month', 'help' => t('Filter by month.'), ), 'argument' => array( 'handler' => 'event_handler_argument_month', 'field' => 'event_end', ), ); $data['event']['end_day'] = array( 'title' => t('End Day'), 'help' => t('End Day'), 'real field' => 'event_end', 'filter' => array( 'field' => 'event_end', 'label' => t('End Day'), 'handler' => 'event_handler_filter_day', 'help' => t('Filter by day.'), ), 'argument' => array( 'handler' => 'event_handler_argument_day', 'field' => 'event_end', ), ); $data['event']['end_week'] = array( 'title' => t('End Week'), 'help' => t('Filter by the week number (1-52). Place this argument after a "Year" argument.'), 'real field' => 'event_end', 'argument' => array( 'handler' => 'event_handler_argument_week', 'field' => 'event_end', ), ); return $data; } /** * Implementation of hook_views_data_alter(). */ function event_views_data_alter(&$data) { // event enabled node types $data['node']['event_types'] = array( 'group' => t('Event'), 'title' => t('Type'), 'help' => t('Event enabled node types'), 'real field' => 'type', 'filter' => array( 'handler' => 'event_handler_filter_node_type', ), ); } /** * Filter by event enabled node types */ class event_handler_filter_node_type extends views_handler_filter_node_type { function get_value_options() { if (!isset($this->value_options)) { $this->value_title = t('Event Enabled Node type'); // 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); } $this->value_options = $type_options; } } } /** * Simple year filter */ class event_handler_filter_year extends views_handler_filter_numeric { function query() { $this->ensure_my_table(); $field = "YEAR($this->table_alias.$this->real_field)"; $info = $this->operators(); if (!empty($info[$this->operator]['method'])) { $this->{$info[$this->operator]['method']}($field); } } } /** * Simple month filter */ class event_handler_filter_month extends views_handler_filter_numeric { function query() { $this->ensure_my_table(); $field = "MONTH($this->table_alias.$this->real_field)"; $info = $this->operators(); if (!empty($info[$this->operator]['method'])) { $this->{$info[$this->operator]['method']}($field); } } } /** * Simple day filter */ class event_handler_filter_day extends views_handler_filter_numeric { function query() { $this->ensure_my_table(); $field = "DAY($this->table_alias.$this->real_field)"; $info = $this->operators(); if (!empty($info[$this->operator]['method'])) { $this->{$info[$this->operator]['method']}($field); } } } class event_handler_filter_date extends views_handler_filter_date { function op_between($field) { if ($this->operator == 'between') { $a = intval(strtotime($this->value['min'], 0)); $b = intval(strtotime($this->value['max'], 0)); } else { $a = intval(strtotime($this->value['max'], 0)); $b = intval(strtotime($this->value['min'], 0)); } if ($this->value['type'] == 'offset') { $a = 'NOW()' . sprintf('%+d', $a); // keep sign $b = 'NOW()' . sprintf('%+d', $b); // keep sign } // %s is safe here because strtotime scrubbed the input and we might // have a string if using offset. $this->query->add_where($this->options['group'], "$field >= %s", $a); $this->query->add_where($this->options['group'], "$field <= %s", $b); } function op_simple($field) { $value = intval(strtotime($this->value['value'], 0)); if ($this->value['type'] == 'offset') { $value = 'NOW()' . sprintf('%+d', $value); // keep sign } $this->query->add_where($this->options['group'], "$field $this->operator %s", $value); } } /** * A handler to provide proper displays for dates. */ class event_handler_field_date extends views_handler_field_date { function render($values) { $value = $values->{$this->field_alias}; $format = $this->options['date_format']; if ($format == 'custom' || $format == 'time ago') { $custom_format = $this->options['custom_date_format']; } switch ($format) { case 'time ago': return $value ? t('%time ago', array('%time' => format_interval(time() - strtotime($value), is_numeric($custom_format) ? $custom_format : 2))) : theme('views_nodate'); case 'custom': return $value ? event_format_date($value, $format, $custom_format) : theme('views_nodate'); default: return $value ? event_format_date($value, $format) : theme('views_nodate'); } } } /** * Custom views handler for timezone, swap timezone name in for offset */ class event_handler_field_timezone extends views_handler_field { function render($values) { $value = $values->{$this->field_alias}; if (!$value) return; $zone = event_zonelist_by_id($value); return $zone['name']; } } class event_handler_argument_fulldate extends views_handler_argument_date { /** * Constructor implementation */ function construct() { $this->format = 'F j, Y'; $this->arg_format = 'Ymd'; $this->formula = views_date_sql_format($this->arg_format, "***table***.$this->real_field", 'datetime'); } /** * Provide a link to the next level of the view */ function summary_name($data) { $created = $data->{$this->name_alias}; return event_format_date(strtotime($created), 'custom', $this->format, 0); } /** * Provide a link to the next level of the view */ function title() { return event_format_date(strtotime($this->argument), 'custom', $this->format, 0); } } class event_handler_argument_year extends views_handler_argument_date { /** * Constructor implementation */ function construct() { $this->format = 'Y'; $this->arg_format = 'Y'; $this->formula = views_date_sql_format($this->arg_format, "***table***.$this->real_field", 'datetime'); } /** * Provide a link to the next level of the view */ function summary_name($data) { $created = $data->{$this->name_alias}; return event_format_date(strtotime($created), 'custom', $this->format, 0); } /** * Provide a link to the next level of the view */ function title() { return event_format_date(strtotime($this->argument), 'custom', $this->format, 0); } } class event_handler_argument_month extends views_handler_argument_date { /** * Constructor implementation */ function construct() { $this->format = 'F'; $this->arg_format = 'm'; $this->formula = views_date_sql_format($this->arg_format, "***table***.$this->real_field", 'datetime'); } /** * Provide a link to the next level of the view */ function summary_name($data) { $created = $data->{$this->name_alias}; return event_format_date(strtotime($created), 'custom', $this->format, 0); } /** * Provide a link to the next level of the view */ function title() { return event_format_date(strtotime($this->argument), 'custom', $this->format, 0); } } class event_handler_argument_day extends views_handler_argument_date { /** * Constructor implementation */ function construct() { $this->format = 'j'; $this->arg_format = 'd'; $this->formula = views_date_sql_format($this->arg_format, "***table***.$this->real_field", 'datetime'); } /** * Provide a link to the next level of the view */ function summary_name($data) { $created = $data->{$this->name_alias}; return event_format_date(strtotime($created), 'custom', $this->format, 0); } /** * Provide a link to the next level of the view */ function title() { return event_format_date(strtotime($this->argument), 'custom', $this->format, 0); } } class event_handler_argument_week extends views_handler_argument_date { /** * Constructor implementation */ function construct() { $this->format = 'W'; $this->arg_format = 'W'; $this->formula = views_date_sql_format($this->arg_format, "***table***.$this->real_field", 'datetime'); } /** * Provide a link to the next level of the view */ function summary_name($data) { $created = $data->{$this->name_alias}; return event_format_date(strtotime($created), 'custom', $this->format, 0); } /** * Provide a link to the next level of the view */ function title() { return event_format_date(strtotime($this->argument), 'custom', $this->format, 0); } }