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