You are here

class calendar_plugin_display_attachment in Calendar 6.2

Same name and namespace in other branches
  1. 7 includes/calendar_plugin_display_attachment.inc \calendar_plugin_display_attachment
  2. 7.2 includes/calendar_plugin_display_attachment.inc \calendar_plugin_display_attachment

The plugin that handles calendar attachment displays.

Adding year/month/day/week pages as attachments makes it possible to use any style type, so they could be tables, lists, teasers, or nodes as well as traditional calendar pages.

Force 'inherit_arguments' and 'inherit_filters' to TRUE, and 'attachment_position' to 'after', and don't display those options in the UI.

Allows paging (regular attachments do not), and adds an option to choose what calendar period this display represents.

Hierarchy

Expanded class hierarchy of calendar_plugin_display_attachment

1 string reference to 'calendar_plugin_display_attachment'
calendar_views_plugins in includes/calendar.views.inc
Implementation of hook_views_plugins

File

includes/calendar_plugin_display_attachment.inc, line 17

View source
class calendar_plugin_display_attachment extends views_plugin_display_attachment {

  /**
   * Instead of going through the standard views_view.tpl.php, delegate this
   * to the style handler.
   */
  function render() {
    if (!empty($this->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)) {
      require_once './' . drupal_get_path('module', 'date_api') . '/date_api_sql.inc';
      $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);
  }

}

Members

Namesort descending Modifiers Type Description Overrides
calendar_plugin_display_attachment::attach_to function Attach only the appropriate displays for the current argument.
calendar_plugin_display_attachment::calendar_type function Identify the period of this display.
calendar_plugin_display_attachment::defaultable_sections function Take away the option to change these values.
calendar_plugin_display_attachment::display_granularity function 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.
calendar_plugin_display_attachment::display_types function Create an array of possible display periods.
calendar_plugin_display_attachment::options function Override some of the parent options.
calendar_plugin_display_attachment::options_form function
calendar_plugin_display_attachment::options_submit function Perform any necessary changes to the form values prior to storage. There is no need for this function to actually store the data.
calendar_plugin_display_attachment::options_summary function Provide the summary for attachment options in the views UI.
calendar_plugin_display_attachment::option_definition function Add custom option definitions.
calendar_plugin_display_attachment::pre_execute function
calendar_plugin_display_attachment::query function
calendar_plugin_display_attachment::render function Instead of going through the standard views_view.tpl.php, delegate this to the style handler.
calendar_plugin_display_attachment::validate function Display validation.