view->display[$display_id]->handler; $url_options = array(); $input = $this->view->get_exposed_input(); if ($input) { $url_options['query'] = $input; } $url_options['absolute'] = TRUE; $url = url($this->view->get_url(NULL, $path), $url_options); if ($display->has_path()) { if (empty($this->preview)) { drupal_add_feed($url, $title); } } else { if (empty($this->view->feed_icon)) { $this->view->feed_icon = ''; } $this->view->feed_icon .= theme('feed_icon', array('url' => $url, 'title' => $title)); drupal_add_html_head_link(array( 'rel' => 'alternate', 'type' => 'application/rss+xml', 'title' => $title, 'href' => $url, )); } } /** * {@inheritdoc} */ public function option_definition() { $options = parent::option_definition(); $options['description'] = array('default' => '', 'translatable' => TRUE); return $options; } /** * {@inheritdoc} */ public function options_form(&$form, &$form_state) { parent::options_form($form, $form_state); $form['description'] = array( '#type' => 'textfield', '#title' => t('RSS description'), '#default_value' => $this->options['description'], '#description' => t('This will appear in the RSS feed itself.'), '#maxlength' => 1024, ); } /** * Return an array of additional XHTML elements to add to the channel. * * @return * An array that can be passed to format_xml_elements(). */ public function get_channel_elements() { return array(); } /** * Return an atom:link XHTML element to add to the channel to comply with * the RSS 2.0 specification. * * @see http://validator.w3.org/feed/docs/warning/MissingAtomSelfLink.html * * @return * An array that can be passed to format_xml_elements(). */ public function get_channel_elements_atom_link() { $url_options = array('absolute' => TRUE); $input = $this->view->get_exposed_input(); if ($input) { $url_options['query'] = $input; } $url = url($this->view->get_url(), $url_options); return array( array( 'namespace' => array('xmlns:atom' => 'http://www.w3.org/2005/Atom'), 'key' => 'atom:link', 'attributes' => array( 'href' => $url, 'rel' => 'self', 'type' => 'application/rss+xml', ), ), ); } /** * Get RSS feed description. * * @return string * The string containing the description with the tokens replaced. */ public function get_description() { $description = $this->options['description']; // Allow substitutions from the first row. $description = $this->tokenize_value($description, 0); return $description; } /** * {@inheritdoc} */ public function render() { if (empty($this->row_plugin)) { vpr('views_plugin_style_default: Missing row plugin'); return; } $rows = ''; // This will be filled in by the row plugin and is used later on in the // theming output. $this->namespaces = array('xmlns:dc' => 'http://purl.org/dc/elements/1.1/'); // Fetch any additional elements for the channel and merge in their // namespaces. $this->channel_elements = array_merge( $this->get_channel_elements(), $this->get_channel_elements_atom_link() ); foreach ($this->channel_elements as $element) { if (isset($element['namespace'])) { $this->namespaces = array_merge($this->namespaces, $element['namespace']); } } foreach ($this->view->result as $row_index => $row) { $this->view->row_index = $row_index; $rows .= $this->row_plugin->render($row); } $output = theme($this->theme_functions(), array( 'view' => $this->view, 'options' => $this->options, 'rows' => $rows, )); unset($this->view->row_index); return $output; } }