webmaster@1
|
1 <?php |
webmaster@11
|
2 // $Id: aggregator.pages.inc,v 1.12.2.1 2008/08/16 21:13:48 dries Exp $ |
webmaster@1
|
3 |
webmaster@1
|
4 /** |
webmaster@1
|
5 * @file |
webmaster@1
|
6 * User page callbacks for the aggregator module. |
webmaster@1
|
7 */ |
webmaster@1
|
8 |
webmaster@1
|
9 /** |
webmaster@1
|
10 * Menu callback; displays the most recent items gathered from any feed. |
webmaster@1
|
11 * |
webmaster@1
|
12 * @return |
webmaster@1
|
13 * The items HTML. |
webmaster@1
|
14 */ |
webmaster@1
|
15 function aggregator_page_last() { |
webmaster@1
|
16 drupal_add_feed(url('aggregator/rss'), variable_get('site_name', 'Drupal') .' '. t('aggregator')); |
webmaster@1
|
17 |
webmaster@1
|
18 $items = aggregator_feed_items_load('SELECT i.*, f.title AS ftitle, f.link AS flink FROM {aggregator_item} i INNER JOIN {aggregator_feed} f ON i.fid = f.fid ORDER BY i.timestamp DESC, i.iid DESC'); |
webmaster@1
|
19 |
webmaster@1
|
20 return _aggregator_page_list($items, arg(1)); |
webmaster@1
|
21 } |
webmaster@1
|
22 |
webmaster@1
|
23 /** |
webmaster@1
|
24 * Menu callback; displays all the items captured from a particular feed. |
webmaster@1
|
25 * |
webmaster@1
|
26 * If there are two arguments then this function is the categorize form. |
webmaster@1
|
27 * |
webmaster@1
|
28 * @param $arg1 |
webmaster@1
|
29 * If there are two arguments then $arg1 is $form_state. Otherwise, $arg1 is $feed. |
webmaster@1
|
30 * @param $arg2 |
webmaster@1
|
31 * If there are two arguments then $arg2 is feed. |
webmaster@1
|
32 * @return |
webmaster@1
|
33 * The items HTML. |
webmaster@1
|
34 */ |
webmaster@1
|
35 function aggregator_page_source($arg1, $arg2 = NULL) { |
webmaster@1
|
36 // If there are two arguments then this function is the categorize form, and |
webmaster@1
|
37 // $arg1 is $form_state and $arg2 is $feed. Otherwise, $arg1 is $feed. |
webmaster@1
|
38 $feed = is_array($arg2) ? $arg2 : $arg1; |
webmaster@1
|
39 $feed = (object)$feed; |
webmaster@1
|
40 drupal_set_title(check_plain($feed->title)); |
webmaster@1
|
41 $feed_source = theme('aggregator_feed_source', $feed); |
webmaster@1
|
42 |
webmaster@1
|
43 // It is safe to include the fid in the query because it's loaded from the |
webmaster@1
|
44 // database by aggregator_feed_load. |
webmaster@1
|
45 $items = aggregator_feed_items_load('SELECT * FROM {aggregator_item} WHERE fid = '. $feed->fid .' ORDER BY timestamp DESC, iid DESC'); |
webmaster@1
|
46 |
webmaster@1
|
47 return _aggregator_page_list($items, arg(3), $feed_source); |
webmaster@1
|
48 } |
webmaster@1
|
49 |
webmaster@1
|
50 /** |
webmaster@1
|
51 * Menu callback; displays all the items aggregated in a particular category. |
webmaster@1
|
52 * |
webmaster@1
|
53 * If there are two arguments then this function is called as a form. |
webmaster@1
|
54 * |
webmaster@1
|
55 * @param $arg1 |
webmaster@1
|
56 * If there are two arguments then $arg1 is $form_state. Otherwise, $arg1 is $category. |
webmaster@1
|
57 * @param $arg2 |
webmaster@1
|
58 * If there are two arguments then $arg2 is $category. |
webmaster@1
|
59 * @return |
webmaster@1
|
60 * The items HTML. |
webmaster@1
|
61 */ |
webmaster@1
|
62 function aggregator_page_category($arg1, $arg2 = NULL) { |
webmaster@1
|
63 // If there are two arguments then we are called as a form, $arg1 is |
webmaster@1
|
64 // $form_state and $arg2 is $category. Otherwise, $arg1 is $category. |
webmaster@1
|
65 $category = is_array($arg2) ? $arg2 : $arg1; |
webmaster@1
|
66 |
webmaster@1
|
67 drupal_add_feed(url('aggregator/rss/'. $category['cid']), variable_get('site_name', 'Drupal') .' '. t('aggregator - @title', array('@title' => $category['title']))); |
webmaster@1
|
68 |
webmaster@1
|
69 // It is safe to include the cid in the query because it's loaded from the |
webmaster@1
|
70 // database by aggregator_category_load. |
webmaster@1
|
71 $items = aggregator_feed_items_load('SELECT i.*, f.title AS ftitle, f.link AS flink FROM {aggregator_category_item} c LEFT JOIN {aggregator_item} i ON c.iid = i.iid LEFT JOIN {aggregator_feed} f ON i.fid = f.fid WHERE cid = '. $category['cid'] .' ORDER BY timestamp DESC, i.iid DESC'); |
webmaster@1
|
72 |
webmaster@1
|
73 return _aggregator_page_list($items, arg(3)); |
webmaster@1
|
74 } |
webmaster@1
|
75 |
webmaster@1
|
76 /** |
webmaster@1
|
77 * Load feed items by passing a SQL query. |
webmaster@1
|
78 * |
webmaster@1
|
79 * @param $sql |
webmaster@1
|
80 * The query to be executed. |
webmaster@1
|
81 * @return |
webmaster@1
|
82 * An array of the feed items. |
webmaster@1
|
83 */ |
webmaster@1
|
84 function aggregator_feed_items_load($sql) { |
webmaster@1
|
85 $items = array(); |
webmaster@1
|
86 if (isset($sql)) { |
webmaster@1
|
87 $result = pager_query($sql, 20); |
webmaster@1
|
88 while ($item = db_fetch_object($result)) { |
webmaster@1
|
89 $result_category = db_query('SELECT c.title, c.cid FROM {aggregator_category_item} ci LEFT JOIN {aggregator_category} c ON ci.cid = c.cid WHERE ci.iid = %d ORDER BY c.title', $item->iid); |
webmaster@1
|
90 $item->categories = array(); |
webmaster@1
|
91 while ($item_categories = db_fetch_object($result_category)) { |
webmaster@1
|
92 $item->categories[] = $item_categories; |
webmaster@1
|
93 } |
webmaster@1
|
94 $items[$item->iid] = $item; |
webmaster@1
|
95 } |
webmaster@1
|
96 } |
webmaster@1
|
97 return $items; |
webmaster@1
|
98 } |
webmaster@1
|
99 |
webmaster@1
|
100 /** |
webmaster@1
|
101 * Prints an aggregator page listing a number of feed items. |
webmaster@1
|
102 * |
webmaster@1
|
103 * Various menu callbacks use this function to print their feeds. |
webmaster@1
|
104 * |
webmaster@1
|
105 * @param $items |
webmaster@1
|
106 * The items to be listed. |
webmaster@1
|
107 * @param $op |
webmaster@1
|
108 * Which form should be added to the items. Only 'categorize' is now recognized. |
webmaster@1
|
109 * @param $feed_source |
webmaster@1
|
110 * The feed source URL. |
webmaster@1
|
111 * @return |
webmaster@1
|
112 * The items HTML. |
webmaster@1
|
113 */ |
webmaster@1
|
114 function _aggregator_page_list($items, $op, $feed_source = '') { |
webmaster@1
|
115 if (user_access('administer news feeds') && ($op == 'categorize')) { |
webmaster@1
|
116 // Get form data. |
webmaster@1
|
117 $output = aggregator_categorize_items($items, $feed_source); |
webmaster@1
|
118 } |
webmaster@1
|
119 else { |
webmaster@1
|
120 // Assemble themed output. |
webmaster@1
|
121 $output = $feed_source; |
webmaster@1
|
122 foreach ($items as $item) { |
webmaster@1
|
123 $output .= theme('aggregator_item', $item); |
webmaster@1
|
124 } |
webmaster@1
|
125 $output = theme('aggregator_wrapper', $output); |
webmaster@1
|
126 } |
webmaster@1
|
127 return $output; |
webmaster@1
|
128 } |
webmaster@1
|
129 |
webmaster@1
|
130 /** |
webmaster@1
|
131 * Form builder; build the page list form. |
webmaster@1
|
132 * |
webmaster@1
|
133 * @param $items |
webmaster@1
|
134 * An array of the feed items. |
webmaster@1
|
135 * @param $feed_source |
webmaster@1
|
136 * The feed source URL. |
webmaster@1
|
137 * @return |
webmaster@1
|
138 * The form structure. |
webmaster@1
|
139 * @ingroup forms |
webmaster@1
|
140 * @see aggregator_categorize_items_validate() |
webmaster@1
|
141 * @see aggregator_categorize_items_submit() |
webmaster@1
|
142 */ |
webmaster@1
|
143 function aggregator_categorize_items($items, $feed_source = '') { |
webmaster@1
|
144 $form['#submit'][] = 'aggregator_categorize_items_submit'; |
webmaster@1
|
145 $form['#validate'][] = 'aggregator_categorize_items_validate'; |
webmaster@1
|
146 $form['#theme'] = 'aggregator_categorize_items'; |
webmaster@1
|
147 $form['feed_source'] = array('#value' => $feed_source); |
webmaster@1
|
148 $categories = array(); |
webmaster@1
|
149 $done = FALSE; |
webmaster@1
|
150 $form['items'] = array(); |
webmaster@1
|
151 $form['categories'] = array('#tree' => TRUE); |
webmaster@1
|
152 foreach ($items as $item) { |
webmaster@1
|
153 $form['items'][$item->iid] = array('#value' => theme('aggregator_item', $item)); |
webmaster@1
|
154 $form['categories'][$item->iid] = array(); |
webmaster@1
|
155 $categories_result = db_query('SELECT c.cid, c.title, ci.iid FROM {aggregator_category} c LEFT JOIN {aggregator_category_item} ci ON c.cid = ci.cid AND ci.iid = %d', $item->iid); |
webmaster@1
|
156 $selected = array(); |
webmaster@1
|
157 while ($category = db_fetch_object($categories_result)) { |
webmaster@1
|
158 if (!$done) { |
webmaster@1
|
159 $categories[$category->cid] = check_plain($category->title); |
webmaster@1
|
160 } |
webmaster@1
|
161 if ($category->iid) { |
webmaster@1
|
162 $selected[] = $category->cid; |
webmaster@1
|
163 } |
webmaster@1
|
164 } |
webmaster@1
|
165 $done = TRUE; |
webmaster@1
|
166 $form['categories'][$item->iid] = array( |
webmaster@1
|
167 '#type' => variable_get('aggregator_category_selector', 'checkboxes'), |
webmaster@1
|
168 '#default_value' => $selected, |
webmaster@1
|
169 '#options' => $categories, |
webmaster@1
|
170 '#size' => 10, |
webmaster@1
|
171 '#multiple' => TRUE |
webmaster@1
|
172 ); |
webmaster@1
|
173 } |
webmaster@1
|
174 $form['submit'] = array('#type' => 'submit', '#value' => t('Save categories')); |
webmaster@1
|
175 |
webmaster@1
|
176 return $form; |
webmaster@1
|
177 } |
webmaster@1
|
178 |
webmaster@1
|
179 /** |
webmaster@1
|
180 * Validate aggregator_categorize_items form submissions. |
webmaster@1
|
181 */ |
webmaster@1
|
182 function aggregator_categorize_items_validate($form, &$form_state) { |
webmaster@1
|
183 if (!user_access('administer news feeds')) { |
webmaster@1
|
184 form_error($form, t('You are not allowed to categorize this feed item.')); |
webmaster@1
|
185 } |
webmaster@1
|
186 } |
webmaster@1
|
187 |
webmaster@1
|
188 /** |
webmaster@1
|
189 * Process aggregator_categorize_items form submissions. |
webmaster@1
|
190 */ |
webmaster@1
|
191 function aggregator_categorize_items_submit($form, &$form_state) { |
webmaster@1
|
192 if (!empty($form_state['values']['categories'])) { |
webmaster@1
|
193 foreach ($form_state['values']['categories'] as $iid => $selection) { |
webmaster@1
|
194 db_query('DELETE FROM {aggregator_category_item} WHERE iid = %d', $iid); |
webmaster@1
|
195 foreach ($selection as $cid) { |
webmaster@1
|
196 if ($cid) { |
webmaster@1
|
197 db_query('INSERT INTO {aggregator_category_item} (cid, iid) VALUES (%d, %d)', $cid, $iid); |
webmaster@1
|
198 } |
webmaster@1
|
199 } |
webmaster@1
|
200 } |
webmaster@1
|
201 } |
webmaster@1
|
202 drupal_set_message(t('The categories have been saved.')); |
webmaster@1
|
203 } |
webmaster@1
|
204 |
webmaster@1
|
205 /** |
webmaster@1
|
206 * Theme the page list form for assigning categories. |
webmaster@1
|
207 * |
webmaster@1
|
208 * @param $form |
webmaster@1
|
209 * An associative array containing the structure of the form. |
webmaster@1
|
210 * @return |
webmaster@1
|
211 * The output HTML. |
webmaster@1
|
212 * @ingroup themeable |
webmaster@1
|
213 */ |
webmaster@1
|
214 function theme_aggregator_categorize_items($form) { |
webmaster@1
|
215 $output = drupal_render($form['feed_source']); |
webmaster@1
|
216 $rows = array(); |
webmaster@1
|
217 if ($form['items']) { |
webmaster@1
|
218 foreach (element_children($form['items']) as $key) { |
webmaster@1
|
219 if (is_array($form['items'][$key])) { |
webmaster@1
|
220 $rows[] = array( |
webmaster@1
|
221 drupal_render($form['items'][$key]), |
webmaster@1
|
222 array('data' => drupal_render($form['categories'][$key]), 'class' => 'categorize-item'), |
webmaster@1
|
223 ); |
webmaster@1
|
224 } |
webmaster@1
|
225 } |
webmaster@1
|
226 } |
webmaster@1
|
227 $output .= theme('table', array('', t('Categorize')), $rows); |
webmaster@1
|
228 $output .= drupal_render($form['submit']); |
webmaster@1
|
229 $output .= drupal_render($form); |
webmaster@1
|
230 return theme('aggregator_wrapper', $output); |
webmaster@1
|
231 } |
webmaster@1
|
232 |
webmaster@1
|
233 /** |
webmaster@1
|
234 * Process variables for aggregator-wrapper.tpl.php. |
webmaster@1
|
235 * |
webmaster@1
|
236 * @see aggregator-wrapper.tpl.php |
webmaster@1
|
237 */ |
webmaster@1
|
238 function template_preprocess_aggregator_wrapper(&$variables) { |
webmaster@1
|
239 $variables['pager'] = theme('pager', NULL, 20, 0); |
webmaster@1
|
240 } |
webmaster@1
|
241 |
webmaster@1
|
242 /** |
webmaster@1
|
243 * Process variables for aggregator-item.tpl.php. |
webmaster@1
|
244 * |
webmaster@1
|
245 * @see aggregator-item.tpl.php |
webmaster@1
|
246 */ |
webmaster@1
|
247 function template_preprocess_aggregator_item(&$variables) { |
webmaster@1
|
248 $item = $variables['item']; |
webmaster@1
|
249 |
webmaster@1
|
250 $variables['feed_url'] = check_url($item->link); |
webmaster@1
|
251 $variables['feed_title'] = check_plain($item->title); |
webmaster@1
|
252 $variables['content'] = aggregator_filter_xss($item->description); |
webmaster@1
|
253 |
webmaster@1
|
254 $variables['source_url'] = ''; |
webmaster@1
|
255 $variables['source_title'] = ''; |
webmaster@1
|
256 if (isset($item->ftitle) && isset($item->fid)) { |
webmaster@1
|
257 $variables['source_url'] = url("aggregator/sources/$item->fid"); |
webmaster@1
|
258 $variables['source_title'] = check_plain($item->ftitle); |
webmaster@1
|
259 } |
webmaster@1
|
260 if (date('Ymd', $item->timestamp) == date('Ymd')) { |
webmaster@1
|
261 $variables['source_date'] = t('%ago ago', array('%ago' => format_interval(time() - $item->timestamp))); |
webmaster@1
|
262 } |
webmaster@1
|
263 else { |
webmaster@1
|
264 $variables['source_date'] = format_date($item->timestamp, 'custom', variable_get('date_format_medium', 'D, m/d/Y - H:i')); |
webmaster@1
|
265 } |
webmaster@1
|
266 |
webmaster@1
|
267 $variables['categories'] = array(); |
webmaster@1
|
268 foreach ($item->categories as $category) { |
webmaster@1
|
269 $variables['categories'][$category->cid] = l($category->title, 'aggregator/categories/'. $category->cid); |
webmaster@1
|
270 } |
webmaster@1
|
271 } |
webmaster@1
|
272 |
webmaster@1
|
273 /** |
webmaster@1
|
274 * Menu callback; displays all the feeds used by the aggregator. |
webmaster@1
|
275 */ |
webmaster@1
|
276 function aggregator_page_sources() { |
webmaster@1
|
277 $result = db_query('SELECT f.fid, f.title, f.description, f.image, MAX(i.timestamp) AS last FROM {aggregator_feed} f LEFT JOIN {aggregator_item} i ON f.fid = i.fid GROUP BY f.fid, f.title, f.description, f.image ORDER BY last DESC, f.title'); |
webmaster@1
|
278 |
webmaster@1
|
279 $output = ''; |
webmaster@1
|
280 while ($feed = db_fetch_object($result)) { |
webmaster@1
|
281 // Most recent items: |
webmaster@1
|
282 $summary_items = array(); |
webmaster@1
|
283 if (variable_get('aggregator_summary_items', 3)) { |
webmaster@1
|
284 $items = db_query_range('SELECT i.title, i.timestamp, i.link FROM {aggregator_item} i WHERE i.fid = %d ORDER BY i.timestamp DESC', $feed->fid, 0, variable_get('aggregator_summary_items', 3)); |
webmaster@1
|
285 while ($item = db_fetch_object($items)) { |
webmaster@1
|
286 $summary_items[] = theme('aggregator_summary_item', $item); |
webmaster@1
|
287 } |
webmaster@1
|
288 } |
webmaster@1
|
289 $feed->url = url('aggregator/sources/'. $feed->fid); |
webmaster@1
|
290 $output .= theme('aggregator_summary_items', $summary_items, $feed); |
webmaster@1
|
291 } |
webmaster@1
|
292 $output .= theme('feed_icon', url('aggregator/opml'), t('OPML feed')); |
webmaster@1
|
293 |
webmaster@1
|
294 return theme('aggregator_wrapper', $output); |
webmaster@1
|
295 } |
webmaster@1
|
296 |
webmaster@1
|
297 /** |
webmaster@1
|
298 * Menu callback; displays all the categories used by the aggregator. |
webmaster@1
|
299 */ |
webmaster@1
|
300 function aggregator_page_categories() { |
webmaster@1
|
301 $result = db_query('SELECT c.cid, c.title, c.description FROM {aggregator_category} c LEFT JOIN {aggregator_category_item} ci ON c.cid = ci.cid LEFT JOIN {aggregator_item} i ON ci.iid = i.iid GROUP BY c.cid, c.title, c.description'); |
webmaster@1
|
302 |
webmaster@1
|
303 $output = ''; |
webmaster@1
|
304 while ($category = db_fetch_object($result)) { |
webmaster@1
|
305 if (variable_get('aggregator_summary_items', 3)) { |
webmaster@1
|
306 $summary_items = array(); |
webmaster@1
|
307 $items = db_query_range('SELECT i.title, i.timestamp, i.link, f.title as feed_title, f.link as feed_link FROM {aggregator_category_item} ci LEFT JOIN {aggregator_item} i ON i.iid = ci.iid LEFT JOIN {aggregator_feed} f ON i.fid = f.fid WHERE ci.cid = %d ORDER BY i.timestamp DESC', $category->cid, 0, variable_get('aggregator_summary_items', 3)); |
webmaster@1
|
308 while ($item = db_fetch_object($items)) { |
webmaster@1
|
309 $summary_items[] = theme('aggregator_summary_item', $item); |
webmaster@1
|
310 } |
webmaster@1
|
311 } |
webmaster@1
|
312 $category->url = url('aggregator/categories/'. $category->cid); |
webmaster@1
|
313 $output .= theme('aggregator_summary_items', $summary_items, $category); |
webmaster@1
|
314 } |
webmaster@1
|
315 |
webmaster@1
|
316 return theme('aggregator_wrapper', $output); |
webmaster@1
|
317 } |
webmaster@1
|
318 |
webmaster@1
|
319 /** |
webmaster@1
|
320 * Menu callback; generate an RSS 0.92 feed of aggregator items or categories. |
webmaster@1
|
321 */ |
webmaster@1
|
322 function aggregator_page_rss() { |
webmaster@1
|
323 $result = NULL; |
webmaster@1
|
324 // arg(2) is the passed cid, only select for that category |
webmaster@1
|
325 if (arg(2)) { |
webmaster@1
|
326 $category = db_fetch_object(db_query('SELECT cid, title FROM {aggregator_category} WHERE cid = %d', arg(2))); |
webmaster@1
|
327 $sql = 'SELECT i.*, f.title AS ftitle, f.link AS flink FROM {aggregator_category_item} c LEFT JOIN {aggregator_item} i ON c.iid = i.iid LEFT JOIN {aggregator_feed} f ON i.fid = f.fid WHERE cid = %d ORDER BY timestamp DESC, i.iid DESC'; |
webmaster@1
|
328 $result = db_query_range($sql, $category->cid, 0, variable_get('feed_default_items', 10)); |
webmaster@1
|
329 } |
webmaster@1
|
330 // or, get the default aggregator items |
webmaster@1
|
331 else { |
webmaster@1
|
332 $category = NULL; |
webmaster@1
|
333 $sql = 'SELECT i.*, f.title AS ftitle, f.link AS flink FROM {aggregator_item} i INNER JOIN {aggregator_feed} f ON i.fid = f.fid ORDER BY i.timestamp DESC, i.iid DESC'; |
webmaster@1
|
334 $result = db_query_range($sql, 0, variable_get('feed_default_items', 10)); |
webmaster@1
|
335 } |
webmaster@1
|
336 |
webmaster@1
|
337 $feeds = array(); |
webmaster@1
|
338 while ($item = db_fetch_object($result)) { |
webmaster@1
|
339 $feeds[] = $item; |
webmaster@1
|
340 } |
webmaster@1
|
341 return theme('aggregator_page_rss', $feeds, $category); |
webmaster@1
|
342 } |
webmaster@1
|
343 |
webmaster@1
|
344 /** |
webmaster@1
|
345 * Theme the RSS output. |
webmaster@1
|
346 * |
webmaster@1
|
347 * @param $feeds |
webmaster@1
|
348 * An array of the feeds to theme. |
webmaster@1
|
349 * @param $category |
webmaster@1
|
350 * A common category, if any, for all the feeds. |
webmaster@1
|
351 * @ingroup themeable |
webmaster@1
|
352 */ |
webmaster@1
|
353 function theme_aggregator_page_rss($feeds, $category = NULL) { |
webmaster@1
|
354 drupal_set_header('Content-Type: application/rss+xml; charset=utf-8'); |
webmaster@1
|
355 |
webmaster@1
|
356 $items = ''; |
webmaster@1
|
357 $feed_length = variable_get('feed_item_length', 'teaser'); |
webmaster@1
|
358 foreach ($feeds as $feed) { |
webmaster@1
|
359 switch ($feed_length) { |
webmaster@1
|
360 case 'teaser': |
webmaster@1
|
361 $teaser = node_teaser($feed->description); |
webmaster@1
|
362 if ($teaser != $feed->description) { |
webmaster@1
|
363 $teaser .= '<p><a href="'. check_url($feed->link) .'">'. t('read more') ."</a></p>\n"; |
webmaster@1
|
364 } |
webmaster@1
|
365 $feed->description = $teaser; |
webmaster@1
|
366 break; |
webmaster@1
|
367 case 'title': |
webmaster@1
|
368 $feed->description = ''; |
webmaster@1
|
369 break; |
webmaster@1
|
370 } |
webmaster@1
|
371 $items .= format_rss_item($feed->ftitle .': '. $feed->title, $feed->link, $feed->description, array('pubDate' => date('r', $feed->timestamp))); |
webmaster@1
|
372 } |
webmaster@1
|
373 |
webmaster@1
|
374 $site_name = variable_get('site_name', 'Drupal'); |
webmaster@1
|
375 $url = url((isset($category) ? 'aggregator/categories/'. $category->cid : 'aggregator'), array('absolute' => TRUE)); |
webmaster@1
|
376 $description = isset($category) ? t('@site_name - aggregated feeds in category @title', array('@site_name' => $site_name, '@title' => $category->title)) : t('@site_name - aggregated feeds', array('@site_name' => $site_name)); |
webmaster@1
|
377 |
webmaster@1
|
378 $output = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"; |
webmaster@1
|
379 $output .= "<rss version=\"2.0\">\n"; |
webmaster@1
|
380 $output .= format_rss_channel(t('@site_name aggregator', array('@site_name' => $site_name)), $url, $description, $items); |
webmaster@1
|
381 $output .= "</rss>\n"; |
webmaster@1
|
382 |
webmaster@1
|
383 print $output; |
webmaster@1
|
384 } |
webmaster@1
|
385 |
webmaster@1
|
386 /** |
webmaster@1
|
387 * Menu callback; generates an OPML representation of all feeds. |
webmaster@1
|
388 * |
webmaster@1
|
389 * @param $cid |
webmaster@1
|
390 * If set, feeds are exported only from a category with this ID. Otherwise, all feeds are exported. |
webmaster@1
|
391 * @return |
webmaster@1
|
392 * The output XML. |
webmaster@1
|
393 */ |
webmaster@1
|
394 function aggregator_page_opml($cid = NULL) { |
webmaster@1
|
395 if ($cid) { |
webmaster@1
|
396 $result = db_query('SELECT f.title, f.url FROM {aggregator_feed} f LEFT JOIN {aggregator_category_feed} c on f.fid = c.fid WHERE c.cid = %d ORDER BY title', $cid); |
webmaster@1
|
397 } |
webmaster@1
|
398 else { |
webmaster@1
|
399 $result = db_query('SELECT * FROM {aggregator_feed} ORDER BY title'); |
webmaster@1
|
400 } |
webmaster@1
|
401 |
webmaster@1
|
402 $feeds = array(); |
webmaster@1
|
403 while ($item = db_fetch_object($result)) { |
webmaster@1
|
404 $feeds[] = $item; |
webmaster@1
|
405 } |
webmaster@1
|
406 |
webmaster@1
|
407 return theme('aggregator_page_opml', $feeds); |
webmaster@1
|
408 } |
webmaster@1
|
409 |
webmaster@1
|
410 /** |
webmaster@1
|
411 * Theme the OPML feed output. |
webmaster@1
|
412 * |
webmaster@1
|
413 * @param $feeds |
webmaster@1
|
414 * An array of the feeds to theme. |
webmaster@1
|
415 * @ingroup themeable |
webmaster@1
|
416 */ |
webmaster@1
|
417 function theme_aggregator_page_opml($feeds) { |
webmaster@1
|
418 |
webmaster@1
|
419 drupal_set_header('Content-Type: text/xml; charset=utf-8'); |
webmaster@1
|
420 |
webmaster@1
|
421 $output = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"; |
webmaster@1
|
422 $output .= "<opml version=\"1.1\">\n"; |
webmaster@1
|
423 $output .= "<head>\n"; |
webmaster@1
|
424 $output .= '<title>'. check_plain(variable_get('site_name', 'Drupal')) ."</title>\n"; |
webmaster@1
|
425 $output .= '<dateModified>'. gmdate('r') ."</dateModified>\n"; |
webmaster@1
|
426 $output .= "</head>\n"; |
webmaster@1
|
427 $output .= "<body>\n"; |
webmaster@1
|
428 foreach ($feeds as $feed) { |
webmaster@1
|
429 $output .= '<outline text="'. check_plain($feed->title) .'" xmlUrl="'. check_url($feed->url) ."\" />\n"; |
webmaster@1
|
430 } |
webmaster@1
|
431 $output .= "</body>\n"; |
webmaster@1
|
432 $output .= "</opml>\n"; |
webmaster@1
|
433 |
webmaster@1
|
434 print $output; |
webmaster@1
|
435 } |
webmaster@1
|
436 |
webmaster@1
|
437 /** |
webmaster@1
|
438 * Process variables for aggregator-summary-items.tpl.php. |
webmaster@1
|
439 * |
webmaster@1
|
440 * @see aggregator-summary-item.tpl.php |
webmaster@1
|
441 */ |
webmaster@1
|
442 function template_preprocess_aggregator_summary_items(&$variables) { |
webmaster@1
|
443 $variables['title'] = check_plain($variables['source']->title); |
webmaster@1
|
444 $variables['summary_list'] = theme('item_list', $variables['summary_items']); |
webmaster@1
|
445 $variables['source_url'] = $variables['source']->url; |
webmaster@1
|
446 } |
webmaster@1
|
447 |
webmaster@1
|
448 /** |
webmaster@1
|
449 * Process variables for aggregator-summary-item.tpl.php. |
webmaster@1
|
450 * |
webmaster@1
|
451 * @see aggregator-summary-item.tpl.php |
webmaster@1
|
452 */ |
webmaster@1
|
453 function template_preprocess_aggregator_summary_item(&$variables) { |
webmaster@1
|
454 $item = $variables['item']; |
webmaster@1
|
455 |
webmaster@1
|
456 $variables['feed_url'] = check_url($item->link); |
webmaster@1
|
457 $variables['feed_title'] = check_plain($item->title); |
webmaster@1
|
458 $variables['feed_age'] = t('%age old', array('%age' => format_interval(time() - $item->timestamp))); |
webmaster@1
|
459 |
webmaster@1
|
460 $variables['source_url'] = ''; |
webmaster@1
|
461 $variables['source_title'] = ''; |
webmaster@1
|
462 if (!empty($item->feed_link)) { |
webmaster@1
|
463 $variables['source_url'] = check_url($item->feed_link); |
webmaster@1
|
464 $variables['source_title'] = check_plain($item->feed_title); |
webmaster@1
|
465 } |
webmaster@1
|
466 } |
webmaster@1
|
467 |
webmaster@1
|
468 /** |
webmaster@1
|
469 * Process variables for aggregator-feed-source.tpl.php. |
webmaster@1
|
470 * |
webmaster@1
|
471 * @see aggregator-feed-source.tpl.php |
webmaster@1
|
472 */ |
webmaster@1
|
473 function template_preprocess_aggregator_feed_source(&$variables) { |
webmaster@1
|
474 $feed = $variables['feed']; |
webmaster@1
|
475 |
webmaster@1
|
476 $variables['source_icon'] = theme('feed_icon', $feed->url, t('!title feed', array('!title' => $feed->title))); |
webmaster@1
|
477 $variables['source_image'] = $feed->image; |
webmaster@1
|
478 $variables['source_description'] = aggregator_filter_xss($feed->description); |
webmaster@1
|
479 $variables['source_url'] = check_url(url($feed->link, array('absolute' => TRUE))); |
webmaster@1
|
480 |
webmaster@1
|
481 if ($feed->checked) { |
webmaster@1
|
482 $variables['last_checked'] = t('@time ago', array('@time' => format_interval(time() - $feed->checked))); |
webmaster@1
|
483 } |
webmaster@1
|
484 else { |
webmaster@1
|
485 $variables['last_checked'] = t('never'); |
webmaster@1
|
486 } |
webmaster@1
|
487 |
webmaster@1
|
488 if (user_access('administer news feeds')) { |
webmaster@1
|
489 $variables['last_checked'] = l($variables['last_checked'], 'admin/content/aggregator'); |
webmaster@1
|
490 } |
webmaster@1
|
491 } |