You are here

class calendar_plugin_display_ical in Calendar 6.2

Same name and namespace in other branches
  1. 7 calendar_ical/calendar_plugin_display_ical.inc \calendar_plugin_display_ical
  2. 7.2 calendar_ical/calendar_plugin_display_ical.inc \calendar_plugin_display_ical

The plugin that handles a feed, such as RSS or atom.

For the most part, feeds are page displays but with some subtle differences.

Hierarchy

Expanded class hierarchy of calendar_plugin_display_ical

1 string reference to 'calendar_plugin_display_ical'
calendar_ical_views_plugins in calendar_ical/calendar_ical.views.inc
Implementation of hook_views_plugins

File

calendar_ical/calendar_plugin_display_ical.inc, line 7

View source
class calendar_plugin_display_ical extends views_plugin_display_page {
  function get_style_type() {
    return 'ical';
  }
  function uses_breadcrumb() {
    return FALSE;
  }

  /**
   * Feeds do not go through the normal page theming mechanism. Instead, they
   * go through their own little theme function and then return NULL so that
   * Drupal believes that the page has already rendered itself...which it has.
   */
  function execute() {
    $output = $this->view
      ->render();
    if (empty($output)) {
      return drupal_not_found();
    }
    print $output;
  }
  function preview() {
    return '<pre>' . check_plain($this->view
      ->render()) . '</pre>';
  }

  /**
   * Instead of going through the standard views_view.tpl.php, delegate this
   * to the style handler.
   */
  function render() {
    return $this->view->style_plugin
      ->render($this->view->result);
  }
  function defaultable_sections($section = NULL) {
    if (in_array($section, array(
      'style_options',
      'style_plugin',
      'row_options',
      'row_plugin',
    ))) {
      return FALSE;
    }
    $sections = parent::defaultable_sections($section);

    // Tell views our sitename_title option belongs in the title section.
    if ($section == 'title') {
      $sections[] = 'sitename_title';
    }
    elseif (!$section) {
      $sections['title'][] = 'sitename_title';
    }
    return $sections;
  }
  function option_definition() {
    $options = parent::option_definition();
    $options['displays'] = array(
      'default' => array(),
    );

    // Overrides for standard stuff:
    $options['style_plugin']['default'] = 'rss';
    $options['style_options']['default'] = array(
      'mission_description' => FALSE,
      'description' => '',
    );
    $options['sitename_title']['default'] = FALSE;
    $options['row_plugin']['default'] = '';
    $options['defaults']['default']['style_plugin'] = FALSE;
    $options['defaults']['default']['style_options'] = FALSE;
    $options['defaults']['default']['row_plugin'] = FALSE;
    $options['defaults']['default']['row_options'] = FALSE;
    return $options;
  }
  function options_summary(&$categories, &$options) {

    // It is very important to call the parent function here:
    parent::options_summary($categories, $options);

    // Since we're childing off the 'page' type, we'll still *call* our
    // category 'page' but let's override it so it says feed settings.
    $categories['page'] = array(
      'title' => t('iCal settings'),
    );
    if ($this
      ->get_option('sitename_title')) {
      $options['title']['value'] = t('Using the site name');
    }

    // I don't think we want to give feeds menus directly.
    unset($options['menu']);
    $displays = array_filter($this
      ->get_option('displays'));
    if (count($displays) > 1) {
      $attach_to = t('Multiple displays');
    }
    else {
      if (count($displays) == 1) {
        $display = array_shift($displays);
        if (!empty($this->view->display[$display])) {
          $attach_to = $this->view->display[$display]->display_title;
        }
      }
    }
    if (!isset($attach_to)) {
      $attach_to = t('None');
    }
    $options['displays'] = array(
      'category' => 'page',
      'title' => t('Attach to'),
      'value' => $attach_to,
    );
  }

  /**
   * Provide the default form for setting 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 'title':
        $title = $form['title'];

        // A little juggling to move the 'title' field beyond our checkbox.
        unset($form['title']);
        $form['sitename_title'] = array(
          '#type' => 'checkbox',
          '#title' => t('Use the site name for the title'),
          '#default_value' => $this
            ->get_option('sitename_title'),
        );
        $form['title'] = $title;
        $form['title']['#process'] = array(
          'views_process_dependency',
        );
        $form['title']['#dependency'] = array(
          'edit-sitename-title' => array(
            FALSE,
          ),
        );
        break;
      case 'displays':
        $form['#title'] .= t('Attach to');
        $displays = array();
        foreach ($this->view->display as $display_id => $display) {
          if (!empty($display->handler) && $display->handler
            ->accept_attachments()) {
            $displays[$display_id] = $display->display_title;
          }
        }
        $form['displays'] = array(
          '#type' => 'checkboxes',
          '#description' => t('The ical icon will be shown only on the selected displays.'),
          '#options' => $displays,
          '#default_value' => $this
            ->get_option('displays'),
        );
        break;
      case 'path':
        $form['path']['#description'] = t('This view will be displayed by visiting this path on your site. It is recommended that the path be something like "path/%/%/ical", putting one % in the path for each argument you have defined in the view.');
        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 'title':
        $this
          ->set_option('sitename_title', $form_state['values']['sitename_title']);
        break;
      case 'displays':
        $this
          ->set_option($form_state['section'], $form_state['values'][$form_state['section']]);
        break;
    }
  }

  /**
   * Attach to another view.
   */
  function attach_to($display_id) {
    $displays = $this
      ->get_option('displays');
    if (empty($displays[$display_id])) {
      return;
    }

    // Defer to the feed style; it may put in meta information, and/or
    // attach a feed icon.
    $plugin = $this
      ->get_plugin();
    if ($plugin) {
      $clone = $this->view
        ->clone_view();
      $clone
        ->set_display($this->display->id);
      $clone
        ->build_title();
      $plugin
        ->attach_to($display_id, $this
        ->get_path(), $clone
        ->get_title());
    }
  }

  /**
   * Display validation.
   */
  function validate() {
    $errors = parent::validate();
    $arguments = $this->display->handler
      ->get_option('arguments');
    $filters = $this->display->handler
      ->get_option('filters');
    if (!array_key_exists('date_argument', $arguments) && !array_key_exists('date_filter', $filters)) {
      if (empty($this->view->date_info->arg_missing)) {
        $errors[] = t("A Calendar period display will not work without a Date argument or a Date filter.");
      }
      $this->view->date_info->arg_missing = TRUE;
    }
    if (array_key_exists('date_argument', $arguments) && ($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;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
calendar_plugin_display_ical::attach_to function Attach to another view.
calendar_plugin_display_ical::defaultable_sections function
calendar_plugin_display_ical::execute function Feeds do not go through the normal page theming mechanism. Instead, they go through their own little theme function and then return NULL so that Drupal believes that the page has already rendered itself...which it has.
calendar_plugin_display_ical::get_style_type function
calendar_plugin_display_ical::options_form function Provide the default form for setting options.
calendar_plugin_display_ical::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_ical::options_summary function
calendar_plugin_display_ical::option_definition function
calendar_plugin_display_ical::preview function
calendar_plugin_display_ical::render function Instead of going through the standard views_view.tpl.php, delegate this to the style handler.
calendar_plugin_display_ical::uses_breadcrumb function
calendar_plugin_display_ical::validate function Display validation.