1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
|
<?php
/**
* @file
* Contains the RSS style plugin.
*/
/**
* Default style plugin to render an RSS feed.
*
* @ingroup views_style_plugins
*/
class views_plugin_style_rss extends views_plugin_style {
function attach_to($display_id, $path, $title) {
$display = $this->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
));
}
}
function option_definition() {
$options = parent::option_definition();
$options['description'] = array('default' => '', 'translatable' => TRUE);
return $options;
}
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().
*/
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().
*/
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.
*/
function get_description() {
$description = $this->options['description'];
// Allow substitutions from the first row.
$description = $this->tokenize_value($description, 0);
return $description;
}
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;
}
}
|