summaryrefslogtreecommitdiff
path: root/modules/aggregator
diff options
context:
space:
mode:
authorDries Buytaert <dries@buytaert.net>2006-03-08 09:52:13 +0000
committerDries Buytaert <dries@buytaert.net>2006-03-08 09:52:13 +0000
commit89b9c26e00f5070731b8b846c9e0e23884c6e44e (patch)
tree9f54d59c3958aa1374fb3a210a40dc8894e9c8e7 /modules/aggregator
parent8fe244ff6aad639cfa04793d96dd82b050e49c36 (diff)
downloadbrdo-89b9c26e00f5070731b8b846c9e0e23884c6e44e.tar.gz
brdo-89b9c26e00f5070731b8b846c9e0e23884c6e44e.tar.bz2
- Patch #52932 by Zen: fapi conversion + fixes
* fapi conversion. * Adds status messages, comments and language fixes. * Adds watchdog messages for category and feed additions and deletions. * Edit forms: checks for duplicates - title for category, title + url for feeds.
Diffstat (limited to 'modules/aggregator')
-rw-r--r--modules/aggregator/aggregator.module707
1 files changed, 411 insertions, 296 deletions
diff --git a/modules/aggregator/aggregator.module b/modules/aggregator/aggregator.module
index 4247e68fe..f34c4013e 100644
--- a/modules/aggregator/aggregator.module
+++ b/modules/aggregator/aggregator.module
@@ -38,6 +38,153 @@ function aggregator_help($section) {
}
}
+/**
+ * Implementation of hook_menu().
+ */
+function aggregator_menu($may_cache) {
+ $items = array();
+ $edit = user_access('administer news feeds');
+ $view = user_access('access news feeds');
+
+ if ($may_cache) {
+ $items[] = array('path' => 'admin/aggregator',
+ 'title' => t('aggregator'),
+ 'callback' => 'aggregator_admin_overview',
+ 'access' => $edit);
+ $items[] = array('path' => 'admin/aggregator/add/feed',
+ 'title' => t('add feed'),
+ 'callback' => 'aggregator_form_feed',
+ 'access' => $edit,
+ 'type' => MENU_LOCAL_TASK);
+ $items[] = array('path' => 'admin/aggregator/add/category',
+ 'title' => t('add category'),
+ 'callback' => 'aggregator_form_category',
+ 'access' => $edit,
+ 'type' => MENU_LOCAL_TASK);
+ $items[] = array('path' => 'admin/aggregator/remove',
+ 'title' => t('remove items'),
+ 'callback' => 'aggregator_admin_remove_feed',
+ 'access' => $edit,
+ 'type' => MENU_CALLBACK);
+ $items[] = array('path' => 'admin/aggregator/update',
+ 'title' => t('update items'),
+ 'callback' => 'aggregator_admin_refresh_feed',
+ 'access' => $edit,
+ 'type' => MENU_CALLBACK);
+ $items[] = array('path' => 'admin/aggregator/list',
+ 'title' => t('list'),
+ 'type' => MENU_DEFAULT_LOCAL_TASK,
+ 'weight' => -10);
+ $items[] = array('path' => 'aggregator',
+ 'title' => t('news aggregator'),
+ 'callback' => 'aggregator_page_last',
+ 'access' => $view,
+ 'weight' => 5);
+ $items[] = array('path' => 'aggregator/sources',
+ 'title' => t('sources'),
+ 'callback' => 'aggregator_page_sources',
+ 'access' => $view);
+ $items[] = array('path' => 'aggregator/categories',
+ 'title' => t('categories'),
+ 'callback' => 'aggregator_page_categories',
+ 'access' => $view,
+ 'type' => MENU_ITEM_GROUPING);
+ $items[] = array('path' => 'aggregator/rss',
+ 'title' => t('RSS feed'),
+ 'callback' => 'aggregator_page_rss',
+ 'access' => $view,
+ 'type' => MENU_CALLBACK);
+ $items[] = array('path' => 'aggregator/opml',
+ 'title' => t('OPML feed'),
+ 'callback' => 'aggregator_page_opml',
+ 'access' => $view,
+ 'type' => MENU_CALLBACK);
+ }
+ else {
+ if (arg(0) == 'aggregator' && is_numeric(arg(2))) {
+ if (arg(1) == 'sources') {
+ $feed = aggregator_get_feed(arg(2));
+ if ($feed) {
+ $items[] = array('path' => 'aggregator/sources/'. $feed['fid'],
+ 'title' => $feed->title,
+ 'callback' => 'aggregator_page_source',
+ 'access' => $view);
+ $items[] = array('path' => 'aggregator/sources/'. $feed['fid'] .'/view',
+ 'title' => t('view'),
+ 'type' => MENU_DEFAULT_LOCAL_TASK,
+ 'weight' => -10);
+ $items[] = array('path' => 'aggregator/sources/'. $feed['fid'] .'/categorize',
+ 'title' => t('categorize'),
+ 'callback' => 'aggregator_page_source',
+ 'access' => $edit,
+ 'type' => MENU_LOCAL_TASK);
+ $items[] = array('path' => 'aggregator/sources/'. $feed['fid'] .'/configure',
+ 'title' => t('configure'),
+ 'callback' => 'aggregator_form_feed',
+ 'callback arguments' => array($feed),
+ 'access' => $edit,
+ 'type' => MENU_LOCAL_TASK,
+ 'weight' => 1);
+ }
+ }
+ else if (arg(1) == 'categories') {
+ $category = aggregator_get_category(arg(2));
+ if ($category) {
+ $items[] = array('path' => 'aggregator/categories/'. $category['cid'],
+ 'title' => $category->title,
+ 'callback' => 'aggregator_page_category',
+ 'access' => $view);
+ $items[] = array('path' => 'aggregator/categories/'. $category['cid'] .'/view',
+ 'title' => t('view'),
+ 'type' => MENU_DEFAULT_LOCAL_TASK,
+ 'weight' => -10);
+ $items[] = array('path' => 'aggregator/categories/'. $category['cid'] .'/categorize',
+ 'title' => t('categorize'),
+ 'callback' => 'aggregator_page_category',
+ 'access' => $edit,
+ 'type' => MENU_LOCAL_TASK);
+ $items[] = array('path' => 'aggregator/categories/'. $category['cid'] .'/configure',
+ 'title' => t('configure'),
+ 'callback' => 'aggregator_form_category',
+ 'callback arguments' => array($category),
+ 'access' => $edit,
+ 'type' => MENU_LOCAL_TASK,
+ 'weight' => 1);
+ }
+ }
+ }
+ else if (arg(1) == 'aggregator' && is_numeric(arg(4))) {
+ if (arg(3) == 'feed') {
+ $feed = aggregator_get_feed(arg(4));
+ if ($feed) {
+ $items[] = array('path' => 'admin/aggregator/edit/feed/'. $feed['fid'],
+ 'title' => t('edit feed'),
+ 'callback' => 'aggregator_form_feed',
+ 'callback arguments' => array($feed),
+ 'access' => $edit,
+ 'type' => MENU_CALLBACK);
+ }
+ }
+ else {
+ $category = aggregator_get_category(arg(4));
+ if ($category) {
+ $items[] = array('path' => 'admin/aggregator/edit/category/'. $category['cid'],
+ 'title' => t('edit category'),
+ 'callback' => 'aggregator_form_category',
+ 'callback arguments' => array($category),
+ 'access' => $edit,
+ 'type' => MENU_CALLBACK);
+ }
+ }
+ }
+ }
+
+ return $items;
+}
+
+/**
+ * Implementation of hook_settings().
+ */
function aggregator_settings() {
$items = array(0 => t('none')) + drupal_map_assoc(array(3, 5, 10, 15, 20, 25), '_aggregator_items');
$period = drupal_map_assoc(array(3600, 10800, 21600, 32400, 43200, 86400, 172800, 259200, 604800, 1209600, 2419200, 4838400, 9676800), 'format_interval');
@@ -69,13 +216,6 @@ function aggregator_settings() {
}
/**
- * Helper function for drupal_map_assoc.
- */
-function _aggregator_items($count) {
- return format_plural($count, '1 item', '%count items');
-}
-
-/**
* Implementation of hook_perm().
*/
function aggregator_perm() {
@@ -83,94 +223,6 @@ function aggregator_perm() {
}
/**
- * Implementation of hook_menu().
- */
-function aggregator_menu($may_cache) {
- $items = array();
- $edit = user_access('administer news feeds');
- $view = user_access('access news feeds');
-
- if ($may_cache) {
- $items[] = array('path' => 'admin/aggregator', 'title' => t('aggregator'),
- 'callback' => 'aggregator_admin_overview', 'access' => $edit);
- $items[] = array('path' => 'admin/aggregator/edit/feed', 'title' => t('edit feed'),
- 'callback' => 'aggregator_admin_edit_feed', 'access' => $edit,
- 'type' => MENU_CALLBACK);
- $items[] = array('path' => 'admin/aggregator/edit/category', 'title' => t('edit category'),
- 'callback' => 'aggregator_admin_edit_category', 'access' => $edit,
- 'type' => MENU_CALLBACK);
- $items[] = array('path' => 'admin/aggregator/remove', 'title' => t('remove items'),
- 'callback' => 'aggregator_admin_remove_feed', 'access' => $edit,
- 'type' => MENU_CALLBACK);
- $items[] = array('path' => 'admin/aggregator/update', 'title' => t('update items'),
- 'callback' => 'aggregator_admin_refresh_feed', 'access' => $edit,
- 'type' => MENU_CALLBACK);
-
- $items[] = array('path' => 'admin/aggregator/list', 'title' => t('list'),
- 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10);
- $items[] = array('path' => 'admin/aggregator/add/feed', 'title' => t('add feed'),
- 'callback' => 'aggregator_admin_edit_feed', 'access' => $edit,
- 'type' => MENU_LOCAL_TASK);
- $items[] = array('path' => 'admin/aggregator/add/category', 'title' => t('add category'),
- 'callback' => 'aggregator_admin_edit_category', 'access' => $edit,
- 'type' => MENU_LOCAL_TASK);
-
- $items[] = array('path' => 'aggregator', 'title' => t('news aggregator'),
- 'callback' => 'aggregator_page_last', 'access' => $view,
- 'weight' => 5);
- $items[] = array('path' => 'aggregator/sources', 'title' => t('sources'),
- 'callback' => 'aggregator_page_sources', 'access' => $view);
- $items[] = array('path' => 'aggregator/categories', 'title' => t('categories'),
- 'callback' => 'aggregator_page_categories', 'access' => $view,
- 'type' => MENU_ITEM_GROUPING);
- $items[] = array('path' => 'aggregator/rss', 'title' => t('RSS feed'),
- 'callback' => 'aggregator_page_rss', 'access' => $view,
- 'type' => MENU_CALLBACK);
- $items[] = array('path' => 'aggregator/opml', 'title' => t('OPML feed'),
- 'callback' => 'aggregator_page_opml', 'access' => $view,
- 'type' => MENU_CALLBACK);
- }
- else {
- if (arg(0) == 'aggregator' && is_numeric(arg(2))) {
- if (arg(1) == 'sources') {
- $feed = db_fetch_object(db_query('SELECT title, fid FROM {aggregator_feed} WHERE fid = %d', arg(2)));
- if ($feed) {
- $items[] = array('path' => 'aggregator/sources/'. $feed->fid, 'title' => $feed->title,
- 'callback' => 'aggregator_page_source', 'access' => $view);
- $items[] = array('path' => 'aggregator/sources/'. $feed->fid .'/view', 'title' => t('view'),
- 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10);
- $items[] = array('path' => 'aggregator/sources/'. $feed->fid .'/categorize', 'title' => t('categorize'),
- 'callback' => 'aggregator_page_source', 'access' => $edit,
- 'type' => MENU_LOCAL_TASK);
- $items[] = array('path' => 'aggregator/sources/'. $feed->fid .'/configure', 'title' => t('configure'),
- 'callback' => 'aggregator_edit', 'access' => $edit,
- 'type' => MENU_LOCAL_TASK,
- 'weight' => 1);
- }
- }
- else if (arg(1) == 'categories') {
- $category = db_fetch_object(db_query('SELECT title, cid FROM {aggregator_category} WHERE cid = %d', arg(2)));
- if ($category) {
- $items[] = array('path' => 'aggregator/categories/'. $category->cid, 'title' => $category->title,
- 'callback' => 'aggregator_page_category', 'access' => $view);
- $items[] = array('path' => 'aggregator/categories/'. $category->cid .'/view', 'title' => t('view'),
- 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10);
- $items[] = array('path' => 'aggregator/categories/'. $category->cid .'/categorize', 'title' => t('categorize'),
- 'callback' => 'aggregator_page_category', 'access' => $edit,
- 'type' => MENU_LOCAL_TASK);
- $items[] = array('path' => 'aggregator/categories/'. $category->cid .'/configure', 'title' => t('configure'),
- 'callback' => 'aggregator_edit', 'access' => $edit,
- 'type' => MENU_LOCAL_TASK,
- 'weight' => 1);
- }
- }
- }
- }
-
- return $items;
-}
-
-/**
* Implementation of hook_cron().
*
* Checks news feeds for updates once their refresh interval has elapsed.
@@ -248,6 +300,259 @@ function aggregator_block($op, $delta = 0, $edit = array()) {
}
}
+/**
+ * Generate a form to add/edit/delete aggregator categories.
+ */
+ function aggregator_form_category($edit = array()) {
+ $form['title'] = array('#type' => 'textfield',
+ '#title' => t('Title'),
+ '#default_value' => $edit['title'],
+ '#maxlength' => 64,
+ '#required' => TRUE,
+ );
+ $form['description'] = array('#type' => 'textarea',
+ '#title' => t('Description'),
+ '#default_value' => $edit['description'],
+ );
+ $form['submit'] = array('#type' => 'submit', '#value' =>t('Submit'));
+
+ if ($edit['cid']) {
+ $form['delete'] = array('#type' => 'submit', '#value' =>t('Delete'));
+ $form['cid'] = array('#type' => 'hidden', '#value' => $edit['cid']);
+ }
+
+ return drupal_get_form('aggregator_form_category', $form);
+}
+
+/**
+ * Validate aggregator_form_feed form submissions.
+ */
+function aggregator_form_category_validate($form_id, $form_values) {
+ if ($_POST['op'] == t('Submit')) {
+ // Check for duplicate titles
+ if (isset($form_values['cid'])) {
+ $category = db_fetch_object(db_query("SELECT cid FROM {aggregator_category} WHERE title = '%s' AND cid != %d", $form_values['title'], $form_values['cid']));
+ }
+ else {
+ $category = db_fetch_object(db_query("SELECT cid FROM {aggregator_category} WHERE title = '%s'", $form_values['title']));
+ }
+ if ($category) {
+ form_set_error('title', t('A category named %category already exists. Please enter a unique title.', array('%category' => theme('placeholder', $form_values['title']))));
+ }
+ }
+}
+
+/**
+ * Process aggregator_form_category form submissions.
+ * @todo Add delete confirmation dialog.
+ */
+function aggregator_form_category_submit($form_id, $form_values) {
+ if ($_POST['op'] == t('Delete')) {
+ $title = $form_values['title'];
+ // Unset the title:
+ unset($form_values['title']);
+ }
+ aggregator_save_category($form_values);
+ menu_rebuild();
+ if (isset($form_values['cid'])) {
+ if (isset($form_values['title'])) {
+ drupal_set_message(t('The category %category has been updated.', array('%category' => theme('placeholder', $form_values['title']))));
+ if (arg(0) == 'admin') {
+ return 'admin/aggregator/';
+ }
+ else {
+ return 'aggregator/categories/'. $form_values['cid'];
+ }
+ }
+ else {
+ watchdog('aggregator', t('Category %category deleted.', array('%category' => theme('placeholder', $title))));
+ drupal_set_message(t('The category %category has been deleted.', array('%category' => theme('placeholder', $title))));
+ if (arg(0) == 'admin') {
+ return 'admin/aggregator/';
+ }
+ else {
+ return 'aggregator/categories/';
+ }
+ }
+ }
+ else {
+ watchdog('aggregator', t('Category %category added.', array('%category' => theme('placeholder', $form_values['title']))), WATCHDOG_NOTICE, l(t('view'), 'admin/aggregator'));
+ drupal_set_message(t('The category %category has been added.', array('%category' => theme('placeholder', $form_values['title']))));
+ }
+}
+
+/**
+ * Add/edit/delete aggregator categories.
+ */
+function aggregator_save_category($edit) {
+ if ($edit['cid'] && $edit['title']) {
+ db_query("UPDATE {aggregator_category} SET title = '%s', description = '%s' WHERE cid = %d", $edit['title'], $edit['description'], $edit['cid']);
+ }
+ else if ($edit['cid']) {
+ db_query('DELETE FROM {aggregator_category} WHERE cid = %d', $edit['cid']);
+ }
+ else if ($edit['title']) {
+ // A single unique id for bundles and feeds, to use in blocks
+ $next_id = db_next_id('{aggregator_category}_cid');
+ db_query("INSERT INTO {aggregator_category} (cid, title, description, block) VALUES (%d, '%s', '%s', 5)", $next_id, $edit['title'], $edit['description']);
+ }
+}
+
+/**
+ * Generate a form to add/edit feed sources.
+ */
+function aggregator_form_feed($edit = array()) {
+ $period = drupal_map_assoc(array(900, 1800, 3600, 7200, 10800, 21600, 32400, 43200, 64800, 86400, 172800, 259200, 604800, 1209600, 2419200), 'format_interval');
+
+ if ($edit['refresh'] == '') {
+ $edit['refresh'] = 3600;
+ }
+
+ $form['title'] = array('#type' => 'textfield',
+ '#title' => t('Title'),
+ '#default_value' => $edit['title'],
+ '#maxlength' => 64,
+ '#description' => t('The name of the feed; typically the name of the web site you syndicate content from.'),
+ '#required' => TRUE,
+ );
+ $form['url'] = array('#type' => 'textfield',
+ '#title' => t('URL'),
+ '#default_value' => $edit['url'],
+ '#maxlength' => 255,
+ '#description' => t('The fully-qualified URL of the feed.'),
+ '#required' => TRUE,
+ );
+ $form['refresh'] = array('#type' => 'select',
+ '#title' => t('Update interval'),
+ '#default_value' => $edit['refresh'],
+ '#options' => $period,
+ '#description' => t('The refresh interval indicating how often you want to update this feed. Requires crontab.'),
+ );
+
+ // Handling of categories:
+ $options = array();
+ $values = array();
+ $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']);
+ while ($category = db_fetch_object($categories)) {
+ $options[$category->cid] = $category->title;
+ if ($category->fid) $values[] = check_plain($category->cid);
+ }
+ if ($options) {
+ $form['category'] = array('#type' => 'checkboxes',
+ '#title' => t('Categorize news items'),
+ '#default_value' => $values,
+ '#options' => $options,
+ '#description' => t('New items in this feed will be automatically filed in the checked categories as they are received.'),
+ );
+ }
+ $form['submit'] = array('#type' => 'submit', '#value' =>t('Submit'));
+
+ if ($edit['fid']) {
+ $form['delete'] = array('#type' => 'submit', '#value' =>t('Delete'));
+ $form['fid'] = array('#type' => 'hidden', '#value' => $edit['fid']);
+ }
+
+ return drupal_get_form('aggregator_form_feed', $form);
+}
+
+/**
+ * Validate aggregator_form_feed form submissions.
+ */
+function aggregator_form_feed_validate($form_id, $form_values) {
+ if ($_POST['op'] == t('Submit')) {
+ // Check for duplicate titles
+ if (isset($form_values['fid'])) {
+ $result = db_query("SELECT title, url FROM {aggregator_feed} WHERE (title = '%s' OR url='%s') AND fid != %d", $form_values['title'], $form_values['url'], $form_values['fid']);
+ }
+ else {
+ $result = db_query("SELECT title, url FROM {aggregator_feed} WHERE title = '%s' OR url='%s'", $form_values['title'], $form_values['url']);
+ }
+ while ($feed = db_fetch_object($result)) {
+ if (strcasecmp($feed->title, $form_values['title']) == 0) {
+ form_set_error('title', t('A feed named %feed already exists. Please enter a unique title.', array('%feed' => theme('placeholder', $form_values['title']))));
+ }
+ }
+ }
+}
+
+/**
+ * Process aggregator_form_feed form submissions.
+ * @todo Add delete confirmation dialog.
+ */
+function aggregator_form_feed_submit($form_id, $form_values) {
+ if ($_POST['op'] == t('Delete')) {
+ $title = $form_values['title'];
+ // Unset the title:
+ unset($form_values['title']);
+ }
+ aggregator_save_feed($form_values);
+ menu_rebuild();
+ if (isset($form_values['fid'])) {
+ if (isset($form_values['title'])) {
+ drupal_set_message(t('The feed %feed has been updated.', array('%feed' => theme('placeholder', $form_values['title']))));
+ if (arg(0) == 'admin') {
+ return 'admin/aggregator/';
+ }
+ else {
+ return 'aggregator/sources/'. $form_values['fid'];
+ }
+ }
+ else {
+ watchdog('aggregator', t('Feed %feed deleted.', array('%feed' => theme('placeholder', $title))));
+ drupal_set_message(t('The feed %feed has been deleted.', array('%feed' => theme('placeholder', $title))));
+ if (arg(0) == 'admin') {
+ return 'admin/aggregator/';
+ }
+ else {
+ return 'aggregator/sources/';
+ }
+ }
+ }
+ else {
+ watchdog('aggregator', t('Feed %feed added.', array('%feed' => theme('placeholder', $form_values['title']))), WATCHDOG_NOTICE, l(t('view'), 'admin/aggregator'));
+ drupal_set_message(t('The feed %feed has been added.', array('%feed' => theme('placeholder', $form_values['title']))));
+ }
+}
+
+/**
+ * Add/edit/delete an aggregator feed.
+ */
+function aggregator_save_feed($edit) {
+ if ($edit['fid']) {
+ // An existing feed is being modified, delete the category listings.
+ db_query('DELETE FROM {aggregator_category_feed} WHERE fid = %d', $edit['fid']);
+ }
+ if ($edit['fid'] && $edit['title']) {
+ db_query("UPDATE {aggregator_feed} SET title = '%s', url = '%s', refresh = %d WHERE fid = %d", $edit['title'], $edit['url'], $edit['refresh'], $edit['fid']);
+ }
+ else if ($edit['fid']) {
+ $result = db_query('SELECT iid FROM {aggregator_item} WHERE fid = %d', $edit['fid']);
+ while ($item = db_fetch_object($result)) {
+ $items[] = "iid = $item->iid";
+ }
+ if ($items) {
+ db_query('DELETE FROM {aggregator_category_item} WHERE '. implode(' OR ', $items));
+ }
+ db_query('DELETE FROM {aggregator_feed} WHERE fid = %d', $edit['fid']);
+ db_query('DELETE FROM {aggregator_item} WHERE fid = %d', $edit['fid']);
+ }
+ else if ($edit['title']) {
+ // A single unique id for bundles and feeds, to use in blocks.
+ $edit['fid'] = db_next_id('{aggregator_feed}_fid');
+ db_query("INSERT INTO {aggregator_feed} (fid, title, url, refresh, block) VALUES (%d, '%s', '%s', %d, 5)", $edit['fid'], $edit['title'], $edit['url'], $edit['refresh']);
+ }
+ if ($edit['title']) {
+ // The feed is being saved, save the categories as well.
+ if ($edit['category']) {
+ foreach ($edit['category'] as $cid => $value) {
+ if ($value) {
+ db_query('INSERT INTO {aggregator_category_feed} (fid, cid) VALUES (%d, %d)', $edit['fid'], $cid);
+ }
+ }
+ }
+ }
+}
+
function aggregator_remove($feed) {
$result = db_query('SELECT iid FROM {aggregator_item} WHERE fid = %d', $feed['fid']);
while ($item = db_fetch_object($result)) {
@@ -322,10 +627,10 @@ function aggregator_element_end($parser, $name) {
break;
case 'ID':
if ($element == 'ID') {
- $element = '';
+ $element = '';
+ }
}
}
-}
/**
* Call-back function used by the XML parser.
@@ -623,7 +928,7 @@ function aggregator_parse_feed(&$data, $feed) {
function aggregator_save_item($edit) {
if ($edit['iid'] && $edit['title']) {
- db_query('UPDATE {aggregator_item} SET title = \'%s\', link = \'%s\', author = \'%s\', description = \'%s\' WHERE iid = %d', $edit['title'], $edit['link'], $edit['author'], $edit['description'], $edit['iid']);
+ db_query("UPDATE {aggregator_item} SET title = '%s', link = '%s', author = '%s', description = '%s' WHERE iid = %d", $edit['title'], $edit['link'], $edit['author'], $edit['description'], $edit['iid']);
}
else if ($edit['iid']) {
db_query('DELETE FROM {aggregator_item} WHERE iid = %d', $edit['iid']);
@@ -631,7 +936,7 @@ function aggregator_save_item($edit) {
}
else if ($edit['title'] && $edit['link']) {
$edit['iid'] = db_next_id('{aggregator_item}_iid');
- db_query('INSERT INTO {aggregator_item} (iid, fid, title, link, author, description, timestamp) VALUES (%d, %d, \'%s\', \'%s\', \'%s\', \'%s\', %d)', $edit['iid'], $edit['fid'], $edit['title'], $edit['link'], $edit['author'], $edit['description'], $edit['timestamp']);
+ db_query("INSERT INTO {aggregator_item} (iid, fid, title, link, author, description, timestamp) VALUES (%d, %d, '%s', '%s', '%s', '%s', %d)", $edit['iid'], $edit['fid'], $edit['title'], $edit['link'], $edit['author'], $edit['description'], $edit['timestamp']);
// file the items in the categories indicated by the feed
$categories = db_query('SELECT cid FROM {aggregator_category_feed} WHERE fid = %d', $edit['fid']);
while ($category = db_fetch_object($categories)) {
@@ -640,100 +945,6 @@ function aggregator_save_item($edit) {
}
}
-function aggregator_form_category($edit = array()) {
- $form['title'] = array('#type' => 'textfield', '#title' => t('Title'), '#default_value' => $edit['title'], '#maxlength' => 64);
- $form['description'] = array('#type' => 'textarea', '#title' => t('Description'), '#default_value' => $edit['description']);
- $form['submit'] = array('#type' => 'submit', '#value' =>t('Submit'));
-
- if ($edit['cid']) {
- $form['delete'] = array('#type' => 'submit', '#value' =>t('Delete'));
- $form['cid'] = array('#type' => 'hidden', '#value' => $edit['cid']);
- }
-
- return drupal_get_form('aggregator_form_category', $form);
-}
-
-function aggregator_save_category($edit) {
- if ($edit['cid'] && $edit['title']) {
- db_query('UPDATE {aggregator_category} SET title = \'%s\', description = \'%s\' WHERE cid = %d', $edit['title'], $edit['description'], $edit['cid']);
- }
- else if ($edit['cid']) {
- db_query('DELETE FROM {aggregator_category} WHERE cid = %d', $edit['cid']);
- }
- else if ($edit['title']) {
- // a single unique id for bundles and feeds, to use in blocks
- $next_id = db_next_id('{aggregator_category}_cid');
- db_query('INSERT INTO {aggregator_category} (cid, title, description, block) VALUES (%d, \'%s\', \'%s\', 5)', $next_id, $edit['title'], $edit['description']);
- }
-}
-
-function aggregator_form_feed($edit = array()) {
- $period = drupal_map_assoc(array(900, 1800, 3600, 7200, 10800, 21600, 32400, 43200, 64800, 86400, 172800, 259200, 604800, 1209600, 2419200), 'format_interval');
-
- if ($edit['refresh'] == '') {
- $edit['refresh'] = 3600;
- }
-
-
- $form['title'] = array('#type' => 'textfield', '#title' => t('Title'), '#default_value' => $edit['title'], '#maxlength' => 64, '#description' => t('The name of the feed; typically the name of the web site you syndicate content from.'));
- $form['url'] = array('#type' => 'textfield', '#title' => t('URL'), '#default_value' => $edit['url'], '#maxlength' => 255, '#description' => t('The fully-qualified URL of the feed.'));
- $form['refresh'] = array('#type' => 'select', '#title' => t('Update interval'), '#default_value' => $edit['refresh'], '#options' => $period, '#description' => t('The refresh interval indicating how often you want to update this feed. Requires crontab.'));
-
- // Handling of categories:
- $options = array();
- $values = array();
- $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']);
- while ($category = db_fetch_object($categories)) {
- $options[$category->cid] = $category->title;
- if ($category->fid) $values[] = check_plain($category->cid);
- }
- if ($options) {
- $form['category'] = array('#type' => 'checkboxes', '#title' => t('Categorize news items'), '#default_value' => $values, '#options' => $options, '#description' => t('New items in this feed will be automatically filed in the checked categories as they are received.'));
- }
- $form['submit'] = array('#type' => 'submit', '#value' =>t('Submit'));
-
- if ($edit['fid']) {
- $form['delete'] = array('#type' => 'submit', '#value' =>t('Delete'));
- $form['fid'] = array('#type' => 'hidden', '#value' => $edit['fid']);
- }
-
- return drupal_get_form('aggregator_form_feed', $form);
-}
-
-function aggregator_save_feed($edit) {
- if ($edit['fid']) {
- // an existing feed is being modified, delete the category listings
- db_query('DELETE FROM {aggregator_category_feed} WHERE fid = %d', $edit['fid']);
- }
- if ($edit['fid'] && $edit['title']) {
- db_query('UPDATE {aggregator_feed} SET title = \'%s\', url = \'%s\', refresh = %d WHERE fid = %d', $edit['title'], $edit['url'], $edit['refresh'], $edit['fid']);
- }
- else if ($edit['fid']) {
- $result = db_query('SELECT iid FROM {aggregator_item} WHERE fid = %d', $edit['fid']);
- while ($item = db_fetch_object($result)) {
- $items[] = "iid = $item->iid";
- }
- if ($items) {
- db_query('DELETE FROM {aggregator_category_item} WHERE '. implode(' OR ', $items));
- }
- db_query('DELETE FROM {aggregator_feed} WHERE fid = %d', $edit['fid']);
- db_query('DELETE FROM {aggregator_item} WHERE fid = %d', $edit['fid']);
- }
- else if ($edit['title']) {
- // a single unique id for bundles and feeds, to use in blocks
- $edit['fid'] = db_next_id('{aggregator_feed}_fid');
- db_query('INSERT INTO {aggregator_feed} (fid, title, url, refresh, block) VALUES (%d, \'%s\', \'%s\', %d, 5)', $edit['fid'], $edit['title'], $edit['url'], $edit['refresh']);
- }
- if ($edit['title']) {
- // the feed is being saved, save the categories as well
- if ($edit['category']) {
- foreach ($edit['category'] as $cid => $value) {
- db_query('INSERT INTO {aggregator_category_feed} (fid, cid) VALUES (%d, %d)', $edit['fid'], $cid);
- }
- }
- }
-}
-
function aggregator_get_feed($fid) {
return db_fetch_array(db_query('SELECT * FROM {aggregator_feed} WHERE fid = %d', $fid));
}
@@ -768,107 +979,6 @@ function aggregator_view() {
return $output;
}
-function aggregator_edit() {
- if ($_POST['op'] == t('Submit')) {
- if (arg(1) == 'categories') {
- aggregator_save_category($_POST['edit']);
- drupal_set_message(t('The category has been updated.'));
- }
- else {
- aggregator_save_feed($_POST['edit']);
- drupal_set_message(t('The feed has been updated.'));
- }
-
- menu_rebuild();
- drupal_goto($_GET['q']);
- }
- else if ($_POST['op'] == t('Delete')) {
- // Unset the title:
- unset($_POST['edit']['title']);
-
- if (arg(1) == 'categories') {
- aggregator_save_category($_POST['edit']);
- drupal_set_message(t('The category has been deleted.'));
- }
- else {
- aggregator_save_feed($_POST['edit']);
- drupal_set_message(t('The feed has been deleted.'));
- }
-
- menu_rebuild();
- drupal_goto('aggregator/'. arg(1));
- }
-
- if (arg(1) == 'categories') {
- $output = aggregator_form_category(aggregator_get_category(arg(2)));
- }
- else {
- $output = aggregator_form_feed(aggregator_get_feed(arg(2)));
- }
-
- return $output;
-}
-
-
-/**
- * Menu callback; displays the category edit form, or saves changes and
- * redirects to the overview page.
- */
-function aggregator_admin_edit_category($category = 0) {
- $edit = $_POST['edit'];
- $op = $_POST['op'];
-
- switch ($op) {
- case t('Delete'):
- $edit['title'] = 0;
- // Fall through:
- case t('Submit'):
- aggregator_save_category($edit);
- drupal_set_message($edit['title'] ? t('The category has been updated.') : t('The category has been removed.'));
- menu_rebuild();
- drupal_goto('admin/aggregator');
- break;
- default:
- if ($category) {
- $output = aggregator_form_category(aggregator_get_category($category));
- }
- else {
- $output = aggregator_form_category();
- }
- }
- return $output;
-}
-
-/**
- * Menu callback; displays the feed edit form.
- *
- * After editing, saves changes and redirects to the overview page.
- */
-function aggregator_admin_edit_feed($feed = 0) {
- $edit = $_POST['edit'];
- $op = $_POST['op'];
-
- switch ($op) {
- case t('Delete'):
- $edit['title'] = 0;
- // Fall through:
- case t('Submit'):
- aggregator_save_feed($edit);
- drupal_set_message($edit['title'] ? t('The feed has been updated.') : t('The feed has been removed.'));
- menu_rebuild();
- drupal_goto('admin/aggregator');
- break;
- default:
- if ($feed) {
- $output = aggregator_form_feed(aggregator_get_feed($feed));
- }
- else {
- $output = aggregator_form_feed();
- }
- }
- return $output;
-}
-
/**
* Menu callback; removes all items from a feed, then redirects to the overview page.
*/
@@ -1011,8 +1121,6 @@ function aggregator_page_list_submit($form_id, $form_values) {
drupal_set_message(t('The categories have been saved.'));
}
-
-
/**
* Menu callback; displays all the feeds used by the aggregator.
*/
@@ -1244,3 +1352,10 @@ function theme_aggregator_page_item($item) {
function aggregator_filter_xss($value) {
return filter_xss($value, preg_split('/\s+|<|>/', variable_get("aggregator_allowed_html_tags", '<a> <b> <br> <dd> <dl> <dt> <em> <i> <li> <ol> <p> <strong> <u> <ul>'), -1, PREG_SPLIT_NO_EMPTY));
}
+
+/**
+ * Helper function for drupal_map_assoc.
+ */
+function _aggregator_items($count) {
+ return format_plural($count, '1 item', '%count items');
+}