user_aggregator_site_feed); if (db_num_rows($feed_check)) { $feed = db_fetch_object($feed_check); return $feed->fid; } } function _user_aggregator_user_can_modify($user) { return $user->user_aggregator_isowner OR (!$user->user_aggregator_feed_fid); } function _user_aggregator_assign_feed($uid, $fid, $owner = 0) { db_query("REPLACE {user_feeds} (uid, fid, owner) VALUES (%d, %d, %d)", $uid, $fid, $owner); } function _user_aggregator_unassign_feed($uid, $fid) { db_query("DELETE FROM {user_feeds} WHERE uid = %d AND fid = %d", $uid, $fid); } function _user_aggregator_feed_save(&$user, $edit) { if ($edit['user_aggregator_site_feed']) { db_query(" INSERT INTO {user_aggregator_pending} (uid, site_name, site_url, site_feed, site_fid, user_data, site_data) VALUES (%d, '%s', '%s', '%s', %d, '%s', '%s')", $user->uid, db_escape_string($edit['user_aggregator_site_name']), db_escape_string($edit['user_aggregator_site_link']), db_escape_string($edit['user_aggregator_site_feed']), _user_aggregator_feed_exists($edit), serialize($user), serialize($edit) ); drupal_set_message('Your submission of ' . db_escape_string($edit['user_aggregator_site_name']) . ' to the site aggregator has been received. It will be approved as long as it is new and not vile.'); } else { _user_aggregator_unassign_feed($user->uid, $user->user_aggregator_feed_fid); } } function _user_aggregator_validation_form() { $edit_data = $_POST['edit']; $feeds_to_save = $edit_data['save_user']; if (count($feeds_to_save)) { $save_user_list = implode(',', $feeds_to_save); $feed_data = db_query(" SELECT uid, site_fid, user_data, site_data FROM {user_aggregator_pending} WHERE uid IN ($save_user_list) "); while ($the_feed = db_fetch_object($feed_data)) { $feeds_to_delete[$the_feed->uid] = $the_feed->uid; $user_data = unserialize($the_feed->user_data); $site_data = unserialize($the_feed->site_data); if (_user_aggregator_user_can_modify($user_data)) { _user_aggregator_update_feed($user_data, $site_data); } _user_aggregator_assign_feed( $user_data->uid, $the_feed->site_fid, $user_data->user_aggregator_isowner ); } } $feeds_to_delete = array_merge($feeds_to_delete, $edit_data['delete_user']); if (count($feeds_to_delete)) { $delete_user_list = implode(',', $feeds_to_delete); db_query("DELETE FROM {user_aggregator_pending} WHERE uid IN ($delete_user_list)"); } // get the pending items $pending_items = db_query(" SELECT u.uid, u.site_name, u.site_url, u.site_feed FROM {user_aggregator_pending} u "); // build a table with a link to each site, site feed and save or delete checkboxes $table_header = 'Feed name'; $xml_icon = theme('image', 'misc/xml.png', t('XML feed'), t('XML feed')); while($pending_item = db_fetch_object($pending_items)) { $save_opt = "uid]\" value=\"$pending_item->uid\" />"; $delete_opt = "uid]\" value=\"$pending_item->uid\" />"; $output .= " site_url\" target=\"feed_preview\">$pending_item->site_name site_feed\" target=\"feed_preview\">$xml_icon $save_opt$delete_opt "; } print theme('page', form("$table_header $output
" . form_submit('Submit'))); #return form("$table_header $output
" . form_submit('Submit')); } function _user_aggregator_update_feed($user, &$edit) { $visible_category_names = variable_get('user_aggregator_feed_visible_categories', array()); // delete user selectable categories if (count($visible_category_names)) { foreach($visible_category_names as $visible_category) { $visible_category_titles[] = "'" . db_escape_string($visible_category) ."'"; } $vis_cat_str = 'SELECT cid FROM {aggregator_category} WHERE title IN ('. implode(', ', $visible_category_titles) . ')'; $available_category_query = db_query($vis_cat_str); while($cid = db_fetch_object($available_category_query)) { $cid_list[] = $cid->cid; } if (count($cid_list)) { // get an array of the fids if ($edit['user_aggregator_feed_fid']) { // an existing feed is being modified, delete the category listings $del_cat_str = 'DELETE FROM {aggregator_category_feed} WHERE fid = '.$edit['user_aggregator_feed_fid'].' AND cid IN ('.implode(', ', $cid_list).')'; db_query($del_cat_str); } } } if ($edit['user_aggregator_feed_fid'] AND $edit['user_aggregator_site_feed'] AND $edit['user_aggregator_site_name']) { // update the feed db_query('UPDATE {aggregator_feed} SET title = \'%s\', url = \'%s\', refresh = %d WHERE fid = %d', db_escape_string($edit['user_aggregator_site_name']), db_escape_string($edit['user_aggregator_site_feed']), $edit['user_aggregator_feed_refresh'], $edit['user_aggregator_feed_fid']); $user_aggregator_can_edit = TRUE; } else if ($edit['user_aggregator_feed_fid']) { // delete the feed $result = db_query('SELECT iid FROM {aggregator_item} WHERE fid = %d', $edit['user_aggregator_feed_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['user_aggregator_feed_fid']); db_query('DELETE FROM {aggregator_item} WHERE fid = %d', $edit['user_aggregator_feed_fid']); } else if ($edit['user_aggregator_site_feed'] AND $edit['user_aggregator_site_name']) { // add new feed // a single unique id for bundles and feeds, to use in blocks if (!_user_aggregator_feed_exists($user, $edit)) { $edit['user_aggregator_feed_fid'] = db_next_id('{aggregator_feed}_fid'); db_query('INSERT INTO {aggregator_feed} (fid, title, url, refresh, block, modified) VALUES (%d, \'%s\', \'%s\', %d, 5, now())', $edit['user_aggregator_feed_fid'], db_escape_string($edit['user_aggregator_site_name']), db_escape_string($edit['user_aggregator_site_feed']), $edit['user_aggregator_feed_refresh']); $user_aggregator_can_edit = TRUE; } } // adding user selectable categories if ($user_aggregator_can_edit) { if ($edit['user_aggregator_feed_categories']) { foreach($edit['user_aggregator_feed_categories'] as $selected_category) { $selected_category_titles[] = "'" . db_escape_string($selected_category) . "'"; } $selected_category_query_str = 'SELECT cid FROM {aggregator_category} WHERE title IN ('. implode(', ', $selected_category_titles) . ')'; $selected_category_query = db_query($selected_category_query_str); if (db_num_rows($selected_category_query)) { $cid_list = array(); while($cid = db_fetch_object($selected_category_query)) { $cid_list[] = $cid->cid; } foreach ($cid_list as $cid) { $qrystr = 'INSERT INTO {aggregator_category_feed} (fid, cid) VALUES (' . $edit['user_aggregator_feed_fid'] . ', ' . $cid. ')'; db_query($qrystr); } } } } } function _user_aggregator_form($user, $editing = FALSE) { if (($user->user_aggregator_site_owner == $user->uid) OR (!$user->user_aggregator_site_owner)){ $output = $form['user_aggregator_site_name'] = array( '#type' => 'textfield', '#title' => t('Name of your site'), '#default_value' => $user->user_aggregator_site_name ? $user->user_aggregator_site_name : '', '#size' => 60, '#maxlength' => 128, '#description' => t('blank 175'),). $form['user_aggregator_site_link'] = array( '#type' => 'textfield', '#title' => t('Site URL'), '#default_value' => $user->user_aggregator_site_link ? $user->user_aggregator_site_link : '', '#size' => 60, '#maxlength' => 128, '#description' => t('blank 182'),). $form['user_aggregator_site_feed'] = array( '#type' => 'textfield', '#title' => t('URI of your site\'s syndication feed'), '#default_value' => $user->user_aggregator_site_link ? $user->user_aggregator_site_link : '', '#size' => 60, '#maxlength' => 128, '#description' => ($editing ? 'Delete the feed url to unassociate the feed with your account.' : ''),). $form['user_aggregator_feed_refresh'] = array( '#type' => 'hidden', '#value' => variable_get('user_aggregator_feed_refresh', 3600),). $form['user_aggregator_feed_fid'] = array( '#type' => 'hidden', '#value' => $user->user_aggregator_feed_fid ? $user->user_aggregator_feed_fid : 0,); // Handling of categories: // array values = feed category cid if (_user_aggregator_user_can_modify($user)) { $available_categories = variable_get('user_aggregator_feed_visible_categories', array()); if (count($available_categories)) { $multiple_allowed = variable_get('user_aggregator_feed_multiple_categories', 0); $default_categories = $user->user_aggregator_feed_categories ? $user->user_aggregator_feed_categories : variable_get('user_aggregator_feed_default_categories', array()); $output .= $form[user_aggregator_feed_categories] = array( '#type' => 'select', '#title' => 'Site categories', '#default_value' => $default_categories, '#options' => drupal_map_assoc($available_categories), '#description' => 'The feed ' . ($multiple_allowed ? 'categories':'category') . ' your site should appear in.', '#extra' => 'height="5"', '#multiple' => $multiple_allowed, ); } } } else { $output = "

Site name: $user->user_aggregator_site_name

Feed url: $user->user_aggregator_site_feed

"; } return $output; } function user_aggregator_menu($may_cache) { global $user; if ($may_cache) { $items[] = array('path' => 'admin/user_aggregator', 'title' => t('approve user feeds'), 'callback' => '_user_aggregator_validation_form'); } return $items; } function user_aggregator_settings() { // Handling of categories: $available_categories = array(); $available_category_query = db_query('SELECT cid, title FROM {aggregator_category} ORDER BY title'); while($available_category = db_fetch_object($available_category_query)) { $available_categories[$available_category->title] = $available_category->title; } $default_categories = variable_get('user_aggregator_feed_default_categories', array()); $visible_categories = variable_get('user_aggregator_feed_visible_categories', array()); $output .= $form['user_aggregator_on_register'] = array( '#type' => 'radios', '#title' => 'Show on initial account setup', '#default_value' => variable_get('user_aggregator_on_register', 0), '#options' => array(0 => 'No', 1 => 'Yes')). $form['categorization'] = array( '#type' => 'fieldset', '#title' => t('Categorization'), '#collapsible' => TRUE, '#collapsed' => TRUE, ). $form['categorization']['user_aggregator_feed_multiple_categories'] = array( '#type' => 'radios', '#title' => t('Users can set multiple feed categories'), '#default_value' => variable_get('user_aggregator_feed_multiple_categories', 0), '#options' => array(0 => 'No', 1 => 'Yes')). $form['categorization']['user_aggregator_feed_multiple_categories'] = array( '#type' => 'radios', '#title' => t('Users can set multiple feed categories'), '#default_value' => variable_get('user_aggregator_feed_multiple_categories', 0), '#options' => array(0 => 'No', 1 => 'Yes')). $form['categorization']['user_aggregator_feed_default_categories'] = array( '#type' => 'checkboxes', '#title' => t('Default categories'), '#default_value' => $default_categories, '#options' => $available_categories, '#description' => t('User entered feeds will be assigned to the selected categories by default'), ). $form['categorization']['user_aggregator_feed_visible_categories'] = array( '#type' => 'checkboxes', '#title' => t('Visible categories'), '#default_value' => $visible_categories, '#options' => $available_categories, '#description' => t('The feed categories available for user feeds assignment.'), ); $period = drupal_map_assoc(array(900, 1800, 3600, 7200, 10800, 21600, 32400, 43200, 64800, 86400, 172800, 259200, 604800, 1209600, 2419200), 'format_interval'); $output = $form['user_aggregator_feed_refresh'] = array( '#type' => 'select', '#title' => t('Update interval'), '#default_value' => variable_get('user_aggregator_feed_refresh', 3600), '#options' => $$period, '#description' => t('The refresh interval indicating how often you want to update user entered feeds. Requires crontab.'),) . $output; return $output; } function user_aggregator_user($op, &$edit, &$user, $category = NULL) { switch ($op) { case 'insert': case 'update': if ($category == 'account') { _user_aggregator_feed_save($user, $edit); } break; case 'load': $query = db_query(" SELECT uf.uid, uf.owner, f.* FROM {user_feeds} uf JOIN {aggregator_feed} f on f.fid = uf.fid WHERE f.url='$user->user_aggregator_site_feed' AND uf.uid = $user->uid "); if(db_num_rows($query)) { $userfeed = db_fetch_object($query); $user->user_aggregator_feed_fid = $userfeed->fid; $user->user_aggregator_site_name = $userfeed->title; $user->user_aggregator_site_feed = $userfeed->url; $user->user_aggregator_site_link = $userfeed->link; $user->user_aggregator_feed_categories = array(); $user->user_aggregator_isowner = $userfeed->owner; $cat_query_str = "SELECT cf.fid, cf.cid, c.title FROM {aggregator_category_feed} cf " ."JOIN {aggregator_category} c ON c.cid = cf.cid " ."WHERE cf.cid = c.cid AND cf.fid = $userfeed->fid"; $cat_query = db_query($cat_query_str); if (db_num_rows($cat_query)) { while($cat = db_fetch_object($cat_query)) { $user->user_aggregator_feed_categories[] = $cat->title; } } } else { unset($user->user_aggregator_feed_fid); unset($user->user_aggregator_site_name); unset($user->user_aggregator_site_feed); unset($user->user_aggregator_feed_categories); unset($user->user_aggregator_site_link); unset($user->user_aggregator_isowner); } break; case 'form': if ($category == 'account') { return array(array('title' => 'Syndicate your site','data' => _user_aggregator_form($user, TRUE))); } break; case 'register': if (variable_get('user_aggregator_on_register', 0)) { return array(array('title' => 'Syndicate your site','data' => _user_aggregator_form($user, FALSE))); } break; case 'validate': if ($category == 'account') { if ($edit['user_aggregator_site_feed']) { $user->user_aggregator_feed_fid = _user_aggregator_feed_exists($edit); } else { $user->user_aggregator_isowner = 0; } } break; case 'view': if ($user->user_aggregator_feed_fid) { return array(t('Home page') => "user_aggregator_site_link\">" . "$user->user_aggregator_site_name " . theme('xml_icon', $user->user_aggregator_site_feed)); } break; } } ?>