view->date_info->forbid)) { return ''; } return $this->view->style_plugin->render($this->view->result); } /** * Create an array of possible display periods. */ function display_types($type = 'month') { $types = calendar_display_types(); return $types[$type]; } /** * Identify the period of this display. */ function calendar_type() { $types = calendar_display_types(); $default = $this->get_option('calendar_type'); if (!array_key_exists($default, $types)) $default = 'month'; return $default; } /** * Inspect argument and view information to see which calendar * period we should show. The argument tells us what to use * if there is no value, the view args tell us what to use * if there are values. */ function display_granularity($display_id) { $arguments = $this->view->get_items('argument', $display_id); $wildcard = ''; $argument = ''; $default_granularity = ''; $i = 0; foreach ($arguments as $argument) { if ($argument['id'] == 'date_argument') { $pos = $i; $default_granularity = $argument['granularity']; $wildcard = $argument['wildcard']; $argument = !empty($this->view->args) && !empty($this->view->args[$pos]) ? $this->view->args[$pos] : ''; break; } $i++; } // TODO Anything else we need to do for 'all' arguments? if ($argument == $wildcard) { $view_granularity = $default_granularity; } elseif (!empty($argument)) { module_load_include('inc', 'date_api', 'date_api_sql'); $date_handler = new date_sql_handler(); $view_granularity = $date_handler->arg_granularity($argument); } else { $view_granularity = $default_granularity; } return $view_granularity; } /** * Display validation. */ function validate() { $errors = parent::validate(); $arguments = $this->display->handler->get_option('arguments'); if (!in_array('date_argument', array_keys($arguments))) { if (empty($this->view->date_info->arg_missing)) { $errors[] = t("A Calendar period display will not work without a Date argument."); } $this->view->date_info->arg_missing = TRUE; } elseif ($arguments['date_argument']['default_action'] != 'default' || $arguments['date_argument']['default_argument_type'] != 'date') { if (empty($this->view->date_info->arg_missing_default)) { $errors[] = calendar_errors('missing_argument_default'); } $this->view->date_info->arg_missing_default = TRUE; } return $errors; } /** * Attach only the appropriate displays for the current argument. */ function attach_to($display_id) { $display_granularity = $this->calendar_type(); $view_granularity = $this->display_granularity($display_id); // If this is not the right display to show, // don't attach it, just exit. if ($view_granularity != $display_granularity) { unset($this->display); return; } $this->view->date_info->parent_id = $display_id; // See if we're attaching to a block rather than a page. if (substr($display_id, 0, 14) == 'calendar_block') { $this->view->date_info->mini = TRUE; $this->view->date_info->block = TRUE; $this->view->date_info->calendar_popup = FALSE; if (!isset($this->view->date_info->block_identifier)) { $this->view->date_info->block_identifier = 'mini'; } } elseif (substr($display_id, 0, 9) == 'calendar_') { $this->view->date_info->calendar_colors = $this->view->display[$display_id]->handler->options['calendar_colors']; $this->view->date_info->calendar_colors_taxonomy = $this->view->display[$display_id]->handler->options['calendar_colors_taxonomy']; $this->view->date_info->calendar_colors_group = $this->view->display[$display_id]->handler->options['calendar_colors_group']; $this->view->date_info->calendar_popup = $this->view->display[$display_id]->handler->options['calendar_popup']; $this->view->date_info->calendar_date_link = $this->view->display[$display_id]->handler->options['calendar_date_link']; } parent::attach_to($display_id); } function pre_execute() { // Make sure parent function is called so things like items per page get set. parent::pre_execute(); $this->view->date_info->display_granularity = $this->calendar_type(); $this->view->date_info->calendar_type = $this->calendar_type(); } function query() { // If we are using legend colors based on taxonomy, make sure the // node vid field is added to the query so the theme can use it. if (!empty($this->view->date_info->calendar_colors_taxonomy)) { if (empty($this->additional_fields)) $this->additional_fields = array(); $this->view->query->add_field('node', 'vid'); } parent::query(); } /** * Override some of the parent options. */ function options(&$display) { parent::options($display); $display['inherit_argments'] = TRUE; $display['inherit_filters'] = TRUE; $display['attachment_position'] = 'after'; } /** * Add custom option definitions. */ function option_definition() { $options = parent::option_definition(); $options['calendar_type'] = array('default' => $this->calendar_type()); return $options; } function options_form(&$form, &$form_state) { // It is very important to call the parent function here: parent::options_form($form, $form_state); switch ($form_state['section']) { case 'calendar_type': $form['#title'] .= t('Calendar period'); $form['calendar_type'] = array( '#type' => 'select', '#description' => t('Select the calendar time period for this display.'), '#default_value' => $this->calendar_type(), '#options' => calendar_display_types(), ); break; } } /** * Perform any necessary changes to the form values prior to storage. * There is no need for this function to actually store the data. */ function options_submit(&$form, &$form_state) { // It is very important to call the parent function here: parent::options_submit($form, $form_state); switch ($form_state['section']) { case 'calendar_type': $this->set_option($form_state['section'], $form_state['values'][$form_state['section']]); break; } } /** * Provide the summary for attachment options in the views UI. * * This output is returned as an array. */ function options_summary(&$categories, &$options) { parent::options_summary($categories, $options); $types = calendar_display_types(); $categories['calendar_settings'] = array( 'title' => t('Calendar settings'), ); $options['calendar_type'] = array( 'category' => 'calendar_settings', 'title' => t('Calendar period'), 'value' => $types[$this->calendar_type()], ); } /** * Take away the option to change these values. */ function defaultable_sections($section = NULL) { if (in_array($section, array('inherit_argments', 'inherit_filters', 'attachment_position'))) { return FALSE; } return parent::defaultable_sections($section); } }