| [ Index ] |
PHP Cross Reference of Drupal 6 (gatewave) |
[Summary view] [Print] [Text view]
1 <?php 2 // $Id: aggregator.admin.inc,v 1.7.2.1 2008/04/25 21:11:57 goba Exp $ 3 4 /** 5 * @file 6 * Admin page callbacks for the aggregator module. 7 */ 8 9 /** 10 * Menu callback; displays the aggregator administration page. 11 */ 12 function aggregator_admin_overview() { 13 return aggregator_view(); 14 } 15 16 /** 17 * Displays the aggregator administration page. 18 * 19 * @return 20 * The page HTML. 21 */ 22 function aggregator_view() { 23 $result = db_query('SELECT f.*, COUNT(i.iid) AS items FROM {aggregator_feed} f LEFT JOIN {aggregator_item} i ON f.fid = i.fid GROUP BY f.fid, f.title, f.url, f.refresh, f.checked, f.link, f.description, f.etag, f.modified, f.image, f.block ORDER BY f.title'); 24 25 $output = '<h3>'. t('Feed overview') .'</h3>'; 26 27 $header = array(t('Title'), t('Items'), t('Last update'), t('Next update'), array('data' => t('Operations'), 'colspan' => '3')); 28 $rows = array(); 29 while ($feed = db_fetch_object($result)) { 30 $rows[] = array(l($feed->title, "aggregator/sources/$feed->fid"), format_plural($feed->items, '1 item', '@count items'), ($feed->checked ? t('@time ago', array('@time' => format_interval(time() - $feed->checked))) : t('never')), ($feed->checked ? t('%time left', array('%time' => format_interval($feed->checked + $feed->refresh - time()))) : t('never')), l(t('edit'), "admin/content/aggregator/edit/feed/$feed->fid"), l(t('remove items'), "admin/content/aggregator/remove/$feed->fid"), l(t('update items'), "admin/content/aggregator/update/$feed->fid")); 31 } 32 $output .= theme('table', $header, $rows); 33 34 $result = db_query('SELECT c.cid, c.title, count(ci.iid) as items FROM {aggregator_category} c LEFT JOIN {aggregator_category_item} ci ON c.cid = ci.cid GROUP BY c.cid, c.title ORDER BY title'); 35 36 $output .= '<h3>'. t('Category overview') .'</h3>'; 37 38 $header = array(t('Title'), t('Items'), t('Operations')); 39 $rows = array(); 40 while ($category = db_fetch_object($result)) { 41 $rows[] = array(l($category->title, "aggregator/categories/$category->cid"), format_plural($category->items, '1 item', '@count items'), l(t('edit'), "admin/content/aggregator/edit/category/$category->cid")); 42 } 43 $output .= theme('table', $header, $rows); 44 45 return $output; 46 } 47 48 /** 49 * Form builder; Generate a form to add/edit feed sources. 50 * 51 * @ingroup forms 52 * @see aggregator_form_feed_validate() 53 * @see aggregator_form_feed_submit() 54 */ 55 function aggregator_form_feed(&$form_state, $edit = array('refresh' => 900, 'title' => '', 'url' => '', 'fid' => NULL)) { 56 $period = drupal_map_assoc(array(900, 1800, 3600, 7200, 10800, 21600, 32400, 43200, 64800, 86400, 172800, 259200, 604800, 1209600, 2419200), 'format_interval'); 57 58 if ($edit['refresh'] == '') { 59 $edit['refresh'] = 3600; 60 } 61 62 $form['title'] = array('#type' => 'textfield', 63 '#title' => t('Title'), 64 '#default_value' => $edit['title'], 65 '#maxlength' => 255, 66 '#description' => t('The name of the feed (or the name of the website providing the feed).'), 67 '#required' => TRUE, 68 ); 69 $form['url'] = array('#type' => 'textfield', 70 '#title' => t('URL'), 71 '#default_value' => $edit['url'], 72 '#maxlength' => 255, 73 '#description' => t('The fully-qualified URL of the feed.'), 74 '#required' => TRUE, 75 ); 76 $form['refresh'] = array('#type' => 'select', 77 '#title' => t('Update interval'), 78 '#default_value' => $edit['refresh'], 79 '#options' => $period, 80 '#description' => t('The length of time between feed updates. (Requires a correctly configured <a href="@cron">cron maintenance task</a>.)', array('@cron' => url('admin/reports/status'))), 81 ); 82 83 // Handling of categories: 84 $options = array(); 85 $values = array(); 86 $categories = db_query('SELECT c.cid, c.title, f.fid FROM {aggregator_category} c LEFT JOIN {aggregator_category_feed} f ON c.cid = f.cid AND f.fid = %d ORDER BY title', $edit['fid']); 87 while ($category = db_fetch_object($categories)) { 88 $options[$category->cid] = check_plain($category->title); 89 if ($category->fid) $values[] = $category->cid; 90 } 91 if ($options) { 92 $form['category'] = array('#type' => 'checkboxes', 93 '#title' => t('Categorize news items'), 94 '#default_value' => $values, 95 '#options' => $options, 96 '#description' => t('New feed items are automatically filed in the checked categories.'), 97 ); 98 } 99 $form['submit'] = array('#type' => 'submit', '#value' => t('Save')); 100 101 if ($edit['fid']) { 102 $form['delete'] = array('#type' => 'submit', '#value' => t('Delete')); 103 $form['fid'] = array('#type' => 'hidden', '#value' => $edit['fid']); 104 } 105 106 return $form; 107 } 108 109 /** 110 * Validate aggregator_form_feed form submissions. 111 */ 112 function aggregator_form_feed_validate($form, &$form_state) { 113 if ($form_state['values']['op'] == t('Save')) { 114 // Ensure URL is valid. 115 if (!valid_url($form_state['values']['url'], TRUE)) { 116 form_set_error('url', t('The URL %url is invalid. Please enter a fully-qualified URL, such as http://www.example.com/feed.xml.', array('%url' => $form_state['values']['url']))); 117 } 118 // Check for duplicate titles. 119 if (isset($form_state['values']['fid'])) { 120 $result = db_query("SELECT title, url FROM {aggregator_feed} WHERE (title = '%s' OR url = '%s') AND fid <> %d", $form_state['values']['title'], $form_state['values']['url'], $form_state['values']['fid']); 121 } 122 else { 123 $result = db_query("SELECT title, url FROM {aggregator_feed} WHERE title = '%s' OR url = '%s'", $form_state['values']['title'], $form_state['values']['url']); 124 } 125 while ($feed = db_fetch_object($result)) { 126 if (strcasecmp($feed->title, $form_state['values']['title']) == 0) { 127 form_set_error('title', t('A feed named %feed already exists. Please enter a unique title.', array('%feed' => $form_state['values']['title']))); 128 } 129 if (strcasecmp($feed->url, $form_state['values']['url']) == 0) { 130 form_set_error('url', t('A feed with this URL %url already exists. Please enter a unique URL.', array('%url' => $form_state['values']['url']))); 131 } 132 } 133 } 134 } 135 136 /** 137 * Process aggregator_form_feed form submissions. 138 * 139 * @todo Add delete confirmation dialog. 140 */ 141 function aggregator_form_feed_submit($form, &$form_state) { 142 if ($form_state['values']['op'] == t('Delete')) { 143 $title = $form_state['values']['title']; 144 // Unset the title: 145 unset($form_state['values']['title']); 146 } 147 aggregator_save_feed($form_state['values']); 148 if (isset($form_state['values']['fid'])) { 149 if (isset($form_state['values']['title'])) { 150 drupal_set_message(t('The feed %feed has been updated.', array('%feed' => $form_state['values']['title']))); 151 if (arg(0) == 'admin') { 152 $form_state['redirect'] = 'admin/content/aggregator/'; 153 return; 154 } 155 else { 156 $form_state['redirect'] = 'aggregator/sources/'. $form_state['values']['fid']; 157 return; 158 } 159 } 160 else { 161 watchdog('aggregator', 'Feed %feed deleted.', array('%feed' => $title)); 162 drupal_set_message(t('The feed %feed has been deleted.', array('%feed' => $title))); 163 if (arg(0) == 'admin') { 164 $form_state['redirect'] = 'admin/content/aggregator/'; 165 return; 166 } 167 else { 168 $form_state['redirect'] = 'aggregator/sources/'; 169 return; 170 } 171 } 172 } 173 else { 174 watchdog('aggregator', 'Feed %feed added.', array('%feed' => $form_state['values']['title']), WATCHDOG_NOTICE, l(t('view'), 'admin/content/aggregator')); 175 drupal_set_message(t('The feed %feed has been added.', array('%feed' => $form_state['values']['title']))); 176 } 177 } 178 179 function aggregator_admin_remove_feed($form_state, $feed) { 180 return confirm_form( 181 array( 182 'feed' => array( 183 '#type' => 'value', 184 '#value' => $feed, 185 ), 186 ), 187 t('Are you sure you want to remove all items from the feed %feed?', array('%feed' => $feed['title'])), 188 'admin/content/aggregator', 189 t('This action cannot be undone.'), 190 t('Remove items'), 191 t('Cancel') 192 ); 193 } 194 195 /** 196 * Remove all items from a feed and redirect to the overview page. 197 * 198 * @param $feed 199 * An associative array describing the feed to be cleared. 200 */ 201 function aggregator_admin_remove_feed_submit($form, &$form_state) { 202 aggregator_remove($form_state['values']['feed']); 203 $form_state['redirect'] = 'admin/content/aggregator'; 204 } 205 206 /** 207 * Menu callback; refreshes a feed, then redirects to the overview page. 208 * 209 * @param $feed 210 * An associative array describing the feed to be refreshed. 211 */ 212 function aggregator_admin_refresh_feed($feed) { 213 aggregator_refresh($feed); 214 drupal_goto('admin/content/aggregator'); 215 } 216 217 /** 218 * Form builder; Configure the aggregator system. 219 * 220 * @ingroup forms 221 * @see system_settings_form() 222 */ 223 function aggregator_admin_settings() { 224 $items = array(0 => t('none')) + drupal_map_assoc(array(3, 5, 10, 15, 20, 25), '_aggregator_items'); 225 $period = drupal_map_assoc(array(3600, 10800, 21600, 32400, 43200, 86400, 172800, 259200, 604800, 1209600, 2419200, 4838400, 9676800), 'format_interval'); 226 227 $form['aggregator_allowed_html_tags'] = array( 228 '#type' => 'textfield', '#title' => t('Allowed HTML tags'), '#size' => 80, '#maxlength' => 255, 229 '#default_value' => variable_get('aggregator_allowed_html_tags', '<a> <b> <br> <dd> <dl> <dt> <em> <i> <li> <ol> <p> <strong> <u> <ul>'), 230 '#description' => t('A space-separated list of HTML tags allowed in the content of feed items. (Tags in this list are not removed by Drupal.)') 231 ); 232 233 $form['aggregator_summary_items'] = array( 234 '#type' => 'select', '#title' => t('Items shown in sources and categories pages') , 235 '#default_value' => variable_get('aggregator_summary_items', 3), '#options' => $items, 236 '#description' => t('Number of feed items displayed in feed and category summary pages.') 237 ); 238 239 $form['aggregator_clear'] = array( 240 '#type' => 'select', '#title' => t('Discard items older than'), 241 '#default_value' => variable_get('aggregator_clear', 9676800), '#options' => $period, 242 '#description' => t('The length of time to retain feed items before discarding. (Requires a correctly configured <a href="@cron">cron maintenance task</a>.)', array('@cron' => url('admin/reports/status'))) 243 ); 244 245 $form['aggregator_category_selector'] = array( 246 '#type' => 'radios', '#title' => t('Category selection type'), '#default_value' => variable_get('aggregator_category_selector', 'checkboxes'), 247 '#options' => array('checkboxes' => t('checkboxes'), 'select' => t('multiple selector')), 248 '#description' => t('The type of category selection widget displayed on categorization pages. (For a small number of categories, checkboxes are easier to use, while a multiple selector work well with large numbers of categories.)') 249 ); 250 251 return system_settings_form($form); 252 } 253 254 /** 255 * Form builder; Generate a form to add/edit/delete aggregator categories. 256 * 257 * @ingroup forms 258 * @see aggregator_form_category_validate() 259 * @see aggregator_form_category_submit() 260 */ 261 function aggregator_form_category(&$form_state, $edit = array('title' => '', 'description' => '', 'cid' => NULL)) { 262 $form['title'] = array('#type' => 'textfield', 263 '#title' => t('Title'), 264 '#default_value' => $edit['title'], 265 '#maxlength' => 64, 266 '#required' => TRUE, 267 ); 268 $form['description'] = array('#type' => 'textarea', 269 '#title' => t('Description'), 270 '#default_value' => $edit['description'], 271 ); 272 $form['submit'] = array('#type' => 'submit', '#value' => t('Save')); 273 274 if ($edit['cid']) { 275 $form['delete'] = array('#type' => 'submit', '#value' => t('Delete')); 276 $form['cid'] = array('#type' => 'hidden', '#value' => $edit['cid']); 277 } 278 279 return $form; 280 } 281 282 /** 283 * Validate aggregator_form_feed form submissions. 284 */ 285 function aggregator_form_category_validate($form, &$form_state) { 286 if ($form_state['values']['op'] == t('Save')) { 287 // Check for duplicate titles 288 if (isset($form_state['values']['cid'])) { 289 $category = db_fetch_object(db_query("SELECT cid FROM {aggregator_category} WHERE title = '%s' AND cid <> %d", $form_state['values']['title'], $form_state['values']['cid'])); 290 } 291 else { 292 $category = db_fetch_object(db_query("SELECT cid FROM {aggregator_category} WHERE title = '%s'", $form_state['values']['title'])); 293 } 294 if ($category) { 295 form_set_error('title', t('A category named %category already exists. Please enter a unique title.', array('%category' => $form_state['values']['title']))); 296 } 297 } 298 } 299 300 /** 301 * Process aggregator_form_category form submissions. 302 * 303 * @todo Add delete confirmation dialog. 304 */ 305 function aggregator_form_category_submit($form, &$form_state) { 306 if ($form_state['values']['op'] == t('Delete')) { 307 $title = $form_state['values']['title']; 308 // Unset the title: 309 unset($form_state['values']['title']); 310 } 311 aggregator_save_category($form_state['values']); 312 if (isset($form_state['values']['cid'])) { 313 if (isset($form_state['values']['title'])) { 314 drupal_set_message(t('The category %category has been updated.', array('%category' => $form_state['values']['title']))); 315 if (arg(0) == 'admin') { 316 $form_state['redirect'] = 'admin/content/aggregator/'; 317 return; 318 } 319 else { 320 $form_state['redirect'] = 'aggregator/categories/'. $form_state['values']['cid']; 321 return; 322 } 323 } 324 else { 325 watchdog('aggregator', 'Category %category deleted.', array('%category' => $title)); 326 drupal_set_message(t('The category %category has been deleted.', array('%category' => $title))); 327 if (arg(0) == 'admin') { 328 $form_state['redirect'] = 'admin/content/aggregator/'; 329 return; 330 } 331 else { 332 $form_state['redirect'] = 'aggregator/categories/'; 333 return; 334 } 335 } 336 } 337 else { 338 watchdog('aggregator', 'Category %category added.', array('%category' => $form_state['values']['title']), WATCHDOG_NOTICE, l(t('view'), 'admin/content/aggregator')); 339 drupal_set_message(t('The category %category has been added.', array('%category' => $form_state['values']['title']))); 340 } 341 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated: Thu Mar 24 11:18:33 2011 | Cross-referenced by PHPXref 0.7 |