views_plugin_row_rss_fields.inc
6.81 KB
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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
<?php
/**
* @file
* Contains an implementation of RSS items based on fields on a row plugin.
*/
/**
* Renders an RSS item based on fields.
*/
class views_plugin_row_rss_fields extends views_plugin_row {
function option_definition() {
$options = parent::option_definition();
$options['title_field'] = array('default' => '');
$options['link_field'] = array('default' => '');
$options['description_field'] = array('default' => '');
$options['creator_field'] = array('default' => '');
$options['date_field'] = array('default' => '');
$options['guid_field_options']['guid_field'] = array('default' => '');
$options['guid_field_options']['guid_field_is_permalink'] = array('default' => TRUE, 'bool' => TRUE);
return $options;
}
function options_form(&$form, &$form_state) {
parent::options_form($form, $form_state);
$initial_labels = array('' => t('- None -'));
$view_fields_labels = $this->display->handler->get_field_labels();
$view_fields_labels = array_merge($initial_labels, $view_fields_labels);
$form['title_field'] = array(
'#type' => 'select',
'#title' => t('Title field'),
'#description' => t('The field that is going to be used as the RSS item title for each row.'),
'#options' => $view_fields_labels,
'#default_value' => $this->options['title_field'],
'#required' => TRUE,
);
$form['link_field'] = array(
'#type' => 'select',
'#title' => t('Link field'),
'#description' => t('The field that is going to be used as the RSS item link for each row. This must be a drupal relative path.'),
'#options' => $view_fields_labels,
'#default_value' => $this->options['link_field'],
'#required' => TRUE,
);
$form['description_field'] = array(
'#type' => 'select',
'#title' => t('Description field'),
'#description' => t('The field that is going to be used as the RSS item description for each row.'),
'#options' => $view_fields_labels,
'#default_value' => $this->options['description_field'],
'#required' => TRUE,
);
$form['creator_field'] = array(
'#type' => 'select',
'#title' => t('Creator field'),
'#description' => t('The field that is going to be used as the RSS item creator for each row.'),
'#options' => $view_fields_labels,
'#default_value' => $this->options['creator_field'],
'#required' => TRUE,
);
$form['date_field'] = array(
'#type' => 'select',
'#title' => t('Publication date field'),
'#description' => t('The field that is going to be used as the RSS item pubDate for each row. It needs to be in RFC 2822 format.'),
'#options' => $view_fields_labels,
'#default_value' => $this->options['date_field'],
'#required' => TRUE,
);
$form['guid_field_options'] = array(
'#type' => 'fieldset',
'#title' => t('GUID settings'),
'#collapsible' => FALSE,
'#collapsed' => FALSE,
);
$form['guid_field_options']['guid_field'] = array(
'#type' => 'select',
'#title' => t('GUID field'),
'#description' => t('The globally unique identifier of the RSS item.'),
'#options' => $view_fields_labels,
'#default_value' => $this->options['guid_field_options']['guid_field'],
'#required' => TRUE,
);
$form['guid_field_options']['guid_field_is_permalink'] = array(
'#type' => 'checkbox',
'#title' => t('GUID is permalink'),
'#description' => t('The RSS item GUID is a permalink.'),
'#default_value' => $this->options['guid_field_options']['guid_field_is_permalink'],
);
}
function validate() {
$errors = parent::validate();
$required_options = array('title_field', 'link_field', 'description_field', 'creator_field', 'date_field');
foreach ($required_options as $required_option) {
if (empty($this->options[$required_option])) {
$errors[] = t('Row style plugin requires specifying which views fields to use for RSS item.');
break;
}
}
// Once more for guid.
if (empty($this->options['guid_field_options']['guid_field'])) {
$errors[] = t('Row style plugin requires specifying which views fields to use for RSS item.');
}
return $errors;
}
function render($row) {
static $row_index;
if (!isset($row_index)) {
$row_index = 0;
}
if (function_exists('rdf_get_namespaces')) {
// Merge RDF namespaces in the XML namespaces in case they are used
// further in the RSS content.
$xml_rdf_namespaces = array();
foreach (rdf_get_namespaces() as $prefix => $uri) {
$xml_rdf_namespaces['xmlns:' . $prefix] = $uri;
}
$this->view->style_plugin->namespaces += $xml_rdf_namespaces;
}
// Create the RSS item object.
$item = new stdClass();
$item->title = $this->get_field($row_index, $this->options['title_field']);
$item->link = url($this->get_field($row_index, $this->options['link_field']), array('absolute' => TRUE));
$item->description = $this->get_field($row_index, $this->options['description_field']);
$item->elements = array(
array('key' => 'pubDate', 'value' => $this->get_field($row_index, $this->options['date_field'])),
array(
'key' => 'dc:creator',
'value' => $this->get_field($row_index, $this->options['creator_field']),
'namespace' => array('xmlns:dc' => 'http://purl.org/dc/elements/1.1/'),
),
);
$guid_is_permalink_string = 'false';
$item_guid = $this->get_field($row_index, $this->options['guid_field_options']['guid_field']);
if ($this->options['guid_field_options']['guid_field_is_permalink']) {
$guid_is_permalink_string = 'true';
$item_guid = url($item_guid, array('absolute' => TRUE));
}
$item->elements[] = array(
'key' => 'guid',
'value' => $item_guid,
'attributes' => array('isPermaLink' => $guid_is_permalink_string),
);
$row_index++;
foreach ($item->elements as $element) {
if (isset($element['namespace'])) {
$this->view->style_plugin->namespaces = array_merge($this->view->style_plugin->namespaces, $element['namespace']);
}
}
return theme($this->theme_functions(),
array(
'view' => $this->view,
'options' => $this->options,
'row' => $item,
'field_alias' => isset($this->field_alias) ? $this->field_alias : '',
));
}
/**
* Retrieves a views field value from the style plugin.
*
* @param $index
* The index count of the row as expected by views_plugin_style::get_field().
* @param $field_id
* The ID assigned to the required field in the display.
*/
function get_field($index, $field_id) {
if (empty($this->view->style_plugin) || !is_object($this->view->style_plugin) || empty($field_id)) {
return '';
}
return $this->view->style_plugin->get_field($index, $field_id);
}
}