'Tags', 'page callback' => 'privatemsg_filter_page', 'access callback' => 'privatemsg_user_access', 'access arguments' => array('use privatemsg_filter'), 'type' => MENU_LOCAL_TASK, ); $items['admin/settings/messages/filter'] = array( 'title' => 'Filter', 'description' => 'Configure filter settings.', 'page callback' => 'drupal_get_form', 'page arguments' => array('privatemsg_filter_admin'), 'access arguments' => array('administer privatemsg settings'), 'type' => MENU_LOCAL_TASK, ); $items['messages/list/all'] = array( 'title' => 'All messages', 'page callback' => 'drupal_get_form', 'page arguments' => array('privatemsg_list', 'list'), 'access callback' => 'privatemsg_user_access', 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10, ); $items['messages/list/inbox'] = array( 'title' => 'Inbox', 'page callback' => 'drupal_get_form', 'page arguments' => array('privatemsg_list', 'inbox'), 'access callback' => 'privatemsg_user_access', 'type' => MENU_LOCAL_TASK, 'weight' => -10, ); $items['messages/list/sent'] = array( 'title' => 'Sent Messages', 'page callback' => 'drupal_get_form', 'page arguments' => array('privatemsg_list', 'sent'), 'access callback' => 'privatemsg_user_access', 'type' => MENU_LOCAL_TASK, 'weight' => -10, ); return $items; } function privatemsg_filter_admin() { $form = array(); $form['privatemsg_filter_searchbody'] = array( '#type' => 'checkbox', '#title' => t('Search message body'), '#description' => t('WARNING: turning on this feature will slow down search performance by a large factor. Gets worse as your messages database increases.'), '#default_value' => variable_get('privatemsg_filter_searchbody', FALSE), ); return system_settings_form($form); } function privatemsg_filter_page() { $content = ''; drupal_set_title('Tags'); $sql = 'SELECT * FROM {pm_tags}'; $query = db_query($sql); $tag_array = array(); while ($result = db_fetch_object($query)) { $tag_array[] = l($result->tag, 'messages', array('query' => 'tags='. $result->tag)); } if (count($tag_array)) { $content .= '

'. t('Current tags:') .'

'; $content .= implode(', ', $tag_array) .'.'; } if (privatemsg_user_access('create privatemsg_filter')) { $content .= drupal_get_form('privatemsg_filter_add_tags'); } if (privatemsg_user_access('delete privatemsg_filter')) { $content .= drupal_get_form('privatemsg_filter_delete_tags'); } return $content; } /** * Add new tags */ function privatemsg_filter_add_tags($form_state) { $form['addtags'] = array( '#type' => 'fieldset', '#title' => t('Add tags'), '#collapsible' => TRUE, '#collapsed' => FALSE, ); $form['addtags']['newtags'] = array( '#type' => 'textfield', '#title' => t('What tags would you like to add?'), '#description' => t('Please insert a comma separated list of new tags in the form of "tag1, tag2, tag3...". All spaces will be replaced by hyphens.'), '#default_value' => '', '#required' => 1, ); $form['addtags']['submit'] = array( '#type' => 'submit', '#value' => t('Add tags'), ); return $form; } function privatemsg_filter_add_tags_submit($form, &$form_state) { if (isset($form_state['values']['submit'])) { $tags = explode(',', $form_state['values']['newtags']); foreach ($tags as $tag) { $tag = trim($tag); $tag = str_replace(' ', '-', $tag); $count = db_result(db_query("SELECT COUNT(*) FROM {pm_tags} WHERE tag = '%s'", $tag)); if ($count == 0) { db_query("INSERT INTO {pm_tags} (tag) VALUES ('%s')", $tag); $inserted[] = $tag; } } } if (count($inserted)) { drupal_set_message(t('!count tags have been saved: !tags.', array('!count' => count($inserted), '!tags' => implode(', ', $inserted)))); } } /** * Delete existing tags */ function privatemsg_filter_delete_tags($form_state) { $form['deletetags'] = array( '#type' => 'fieldset', '#title' => t('Delete tags'), '#collapsible' => TRUE, '#collapsed' => TRUE, ); $sql = 'SELECT * FROM {pm_tags}'; $query = db_query($sql); $tag_array = array(); while ($result = db_fetch_object($query)) { $checked = 0; $form_data = array('#type' => 'checkbox', '#title' => $result->tag, '#default_value' => $checked, '#return_value' => 1); $form['deletetags']['tag_'. $result->tag_id] = $form_data; } $form['deletetags']['submit'] = array( '#type' => 'submit', '#value' => t('Delete selected tags'), ); return $form; } function privatemsg_filter_delete_tags_submit($form, &$form_state) { if (isset($form_state['values']['submit'])) { $sql = 'SELECT * FROM {pm_tags}'; $query = db_query($sql); while ($result = db_fetch_object($query)) { if ($form_state['values']['tag_'. $result->tag_id] == 1) { db_query('DELETE FROM {pm_tags_index} WHERE tag_id = %d', $result->tag_id); db_query('DELETE FROM {pm_tags} WHERE tag_id = %d', $result->tag_id); $deleted[] = $result->tag; } } } if (count($deleted)) { drupal_set_message(t('!count tags have been deleted: !tags.', array('!count' => count($deleted), '!tags' => implode(', ', $deleted)))); } } function privatemsg_filter_get_filter($account) { $filter = array(); if (isset($_GET['tags'])) { $tag_data = privatemsg_filter_get_tags_data($account); foreach (explode(' ', $_GET['tags']) as $tag) { if (isset($tag_data[$tag])) { $filter['tags'][$tag] = $tag; } elseif (in_array($tag, $tag_data)) { $filter['tags'][array_search($tag, $tag_data)] = array_search($tag, $tag_data); } } } if (isset($_GET['author'])) { foreach (explode(' ', $_GET['author']) as $author) { $author_data = privatemsg_filter_get_author_data($account); if (isset($author_data[$author])) { $filter[$author] = $author; } elseif (in_array($author, $author_data)) { $filter['author'][array_search($author, $author_data)] = array_search($author, $author_data); } } } if (isset($_GET['search'])) { $filter['search'] = $_GET['search']; } if(!empty($filter)) { return $filter; } if (!empty($_SESSION['privatemsg_filter'])) { return $_SESSION['privatemsg_filter']; } } function privatemsg_filter_get_author_data($account) { static $author_data; if (is_array($author_data)) { return $author_data; } $sql = 'SELECT DISTINCT pm.author, u.name FROM {pm_message} pm INNER JOIN {pm_index} pmi ON pm.mid = pmi.mid INNER JOIN {users} u ON pm.author = u.uid WHERE pmi.uid = %d AND u.uid > 0 ORDER BY u.name'; $query = db_query($sql, $account->uid); $author_data = array(); while ($result = db_fetch_object($query)) { $author_data[$result->author] = $result->name; } return $author_data; } function privatemsg_filter_get_tags_data($account) { static $tag_data; if (is_array($tag_data)) { return $tag_data; } // Only show the tags that a user has used. $sql = 'SELECT pmt.tag, pmt.tag_id FROM {pm_tags_index} pmti LEFT JOIN {pm_tags} pmt ON pmti.tag_id = pmt.tag_id WHERE pmti.uid = %d GROUP BY pmt.tag_id, pmt.tag'; $query = db_query($sql, $account->uid); $tag_data = array(); while ($result = db_fetch_object($query)) { $tag_data[$result->tag_id] = $result->tag; } return $tag_data; } function privatemsg_filter_dropdown(&$form_state, $account) { drupal_add_css(drupal_get_path('module', 'privatemsg_filter') .'/privatemsg_filter.css'); $form['filter'] = array( '#type' => 'fieldset', '#title' => t('Filter Messages'), '#collapsible' => TRUE, '#collapsed' => TRUE, ); $form['filter']['search'] = array( '#type' => 'textfield', '#title' => variable_get('privatemsg_filter_searchbody', FALSE) ? t('Search messages') : t('Search subjects'), '#weight' => -20 ); $form['filter']['author'] = array( '#type' => 'select', '#title' => t('Users'), '#options' => privatemsg_filter_get_author_data($account), '#multiple' => TRUE, '#size' => 5, '#weight' => -10 ); // Only show form if the user has some messages tagged. if (count($tag_data = privatemsg_filter_get_tags_data($account))) { $form['filter']['tags'] = array( '#type' => 'select', '#title' => t('Tags'), '#options' => $tag_data, '#multiple' => TRUE, '#size' => 5, '#weight' => 0 ); } $form['filter']['submit'] = array( '#type' => 'submit', '#value' => t('Filter'), '#prefix' => '
', '#weight' => 10, '#submit' => array('privatemsg_filter_dropdown_submit'), ); $form['filter']['save'] = array( '#type' => 'submit', '#value' => t('Save Filter'), '#suffix' => '
', '#weight' => 11, '#submit' => array('privatemsg_filter_dropdown_submit'), ); if ($filter = privatemsg_filter_get_filter($account)) { privatemsg_filter_dropdown_set_active($form, $filter); } return $form; } function privatemsg_filter_dropdown_set_active(&$form, $filter) { $form['filter']['#title'] = t('Filter Messages (Active)'); $form['filter']['#collapsed'] = FALSE; if (isset($filter['author'])) { $form['filter']['author']['#default_value'] = $filter['author']; } if (isset($filter['tags'])) { $form['filter']['tags']['#default_value'] = $filter['tags']; } if (isset($filter['search'])) { $form['filter']['search']['#default_value'] = $filter['search']; } $form['filter']['reset'] = array( '#type' => 'submit', '#value' => t('Reset'), '#suffix' => '', '#weight' => 12, '#submit' => array('privatemsg_filter_dropdown_submit'), ); unset($form['filter']['save']['#suffix']); } function privatemsg_filter_dropdown_submit($form, &$form_state) { switch ($form_state['values']['op']) { case t('Save Filter'): $filter = array(); if (!empty($form_state['values']['tags'])) { $filter['tags'] = $form_state['values']['tags']; } if (!empty($form_state['values']['author'])) { $filter['author'] = $form_state['values']['author']; } if (!empty($form_state['values']['search'])) { $filter['search'] = $form_state['values']['search']; } $_SESSION['privatemsg_filter'] = $filter; break; case t('Filter'): drupal_goto($_GET['q'], privatemsg_filter_create_get_query($form_state['values'])); return; break; case t('Reset'): $_SESSION['privatemsg_filter'] = array(); break; } $form_state['redirect'] = $_GET['q']; } function privatemsg_filter_create_get_query($filter) { $query = array(); if (isset($filter['tags']) && !empty($filter['tags'])) { $ids = array(); foreach ($filter['tags'] as $tag) { if ((int)$tag > 0) { $ids[] = $tag; } else { $query['tags'][] = $tag; } } $sql = 'SELECT pmt.tag FROM {pm_tags} pmt WHERE pmt.tag_id IN ('. implode(', ', $filter['tags']) .')'; $result = db_query($sql); while ($row = db_fetch_object($result)) { $query['tags'][] = $row->tag; } if (isset($query['tags'])) { $query['tags'] = implode(' ', $query['tags']); } } if (isset($filter['author']) && !empty($filter['author'])) { array_map('user_load', $filter['author']); foreach ($filter['author'] as $author) { if (is_object($author) && isset($author->uid) && isset($author->name)) { $query['author'][] = $author->name; } elseif ($author_obj = user_load($author)) { $query['author'][] = $author_obj->name; } } if (isset($query['author'])) { $query['author'] = implode(' ', $query['author']); } } if (isset($filter['search']) && !empty($filter['search'])) { $query['search'] = $filter['search']; } return $query; } /** * Implementation of hook_form_alter(). */ function privatemsg_filter_form_privatemsg_list_alter(&$form, $form_state) { if (privatemsg_user_access('use privatemsg_filter')) { $form += privatemsg_filter_dropdown($form_state, $form['#account']); } } /** * Hook into the query builder to add the tagging info to the correct query */ function privatemsg_filter_privatemsg_sql_list_alter(&$fragments, $account, $argument) { // Check if its a filtered view. if ($argument == 'sent') { $fragments['where'][] = "pm.author = %d"; $fragments['query_args']['where'][] = $account->uid; } if ($argument == 'inbox') { $fragments['having'][] = '((SELECT pmf.author FROM {pm_message} pmf WHERE pmf.mid = pmi.thread_id) = %d AND COUNT(pmi.thread_id) > 1) OR (SELECT pmf.author FROM {pm_message} pmf WHERE pmf.mid = pmi.thread_id) <> %d'; $fragments['query_args']['having'][] = $account->uid; $fragments['query_args']['having'][] = $account->uid; } // Filter the message listing by any set tags. if ($filter = privatemsg_filter_get_filter($account)) { $count = 0; if (isset($filter['tags']) && !empty($filter['tags'])) { foreach ($filter['tags'] as $tag) { $fragments['inner_join'][] = "INNER JOIN {pm_tags_index} pmti$count ON (pmti$count.thread_id = pmi.thread_id AND pmti$count.uid = pmi.uid)"; $fragments['where'][] = "pmti$count.tag_id = %d"; $fragments['query_args']['where'][] = $tag; $count++; } } if (isset($filter['author']) && !empty($filter['author'])) { foreach ($filter['author'] as $author) { $fragments['inner_join'][] = "INNER JOIN {pm_index} pmi$count ON (pmi$count.mid = pm.mid)"; $fragments['where'][] = "pmi$count.uid = %d"; $fragments['query_args']['where'][] = $author; $count++; } } if (isset($filter['search']) && !empty($filter['search'])) { if (variable_get('privatemsg_filter_searchbody', FALSE)) { $fragments['where'][] = "pm.subject LIKE '%s' OR pm.body LIKE '%s'"; $fragments['query_args']['where'][] = '%%'. $filter['search'] .'%%'; $fragments['query_args']['where'][] = '%%'. $filter['search'] .'%%'; } else { $fragments['where'][] = "pm.subject LIKE '%s'"; $fragments['query_args']['where'][] = '%%'. $filter['search'] .'%%'; } } } } function privatemsg_filter_privatemsg_view_messages_alter(&$content, $thread) { if (count($thread['messages']) > 0 && db_result(db_query('SELECT COUNT(*) FROM {pm_tags}')) > 0) { $content['tags']['#value'] = drupal_get_form('privatemsg_filter_form'); $content['tags']['#weight'] = 10; } } function privatemsg_filter_form(&$form_state) { global $user; $thread_id = arg(2); $form['tags'] = array( '#type' => 'fieldset', '#title' => t('Tags'), '#collapsible' => TRUE, '#collapsed' => TRUE, ); $form['tags']['user_id'] = array( '#type' => 'value', '#value' => $user->uid, ); $form['tags']['thread_id'] = array( '#type' => 'value', '#value' => $thread_id, ); $sql = 'SELECT * FROM {pm_tags}'; $query = db_query($sql); $tag_array = array(); while ($result = db_fetch_object($query)) { $checked = 0; if (db_result(db_query('SELECT COUNT(*) FROM {pm_tags_index} WHERE tag_id = %d AND (uid = %d AND thread_id = %d)', $result->tag_id, $user->uid, $thread_id))) { $checked = 1; } $form_data = array('#type' => 'checkbox', '#title' => $result->tag, '#default_value' => $checked, '#return_value' => 1); $form['tags']['tag_'. $result->tag_id] = $form_data; } $form['tags']['submit'] = array( '#type' => 'submit', '#value' => t('Tag this message'), '#submit' => array('privatemsg_filter_form_submit'), ); return $form; } function privatemsg_filter_form_submit($form, &$form_state) { if (isset($form_state['values']['submit'])) { $sql = 'SELECT * FROM {pm_tags}'; $query = db_query($sql); while ($result = db_fetch_object($query)) { if ($form_state['values']['tag_'. $result->tag_id] == 0) { db_query('DELETE FROM {pm_tags_index} WHERE tag_id = %d AND (uid = %d AND thread_id = %d)', $result->tag_id, $form_state['values']['user_id'], $form_state['values']['thread_id']); } elseif (db_result(db_query('SELECT COUNT(*) FROM {pm_tags_index} WHERE tag_id = %d AND (uid = %d AND thread_id = %d)', $result->tag_id, $form_state['values']['user_id'], $form_state['values']['thread_id'])) == 0) { db_query('INSERT INTO {pm_tags_index} (tag_id, uid, thread_id) VALUES (%d, %d, %d)', $result->tag_id, $form_state['values']['user_id'], $form_state['values']['thread_id']); } } drupal_set_message(t('Tagging information has been saved.')); } }