'; while ($node = db_fetch_object($result)) { $output .= '
'. t('This table lists all the eligible voters for this poll.') .'
'; $header[] = array('data' => t('Voter'), 'field' => 'u.name'); $result = pager_query("SELECT u.uid, u.name FROM {advpoll_electoral_list} el LEFT JOIN {users} u ON el.uid = u.uid WHERE el.nid = %d". tablesort_sql($header), 20, 0, NULL, $node->nid); $table_rows = array(); while ($voter = db_fetch_object($result)) { $row = array( theme('username', $voter), ); if (user_access('administer polls')) { $row[] = l(t('remove'), 'node/'. $node->nid .'/remove/'. $voter->uid); } $table_rows[] = $row; } $output .= theme('table', $header, $table_rows); $output .= theme('pager', NULL, 20, 0); print theme('page', $output); } /** * Custom page to handle confirmation of clearing all votes. */ function advpoll_clear_votes_page($node) { // Add the votes tab to the menu. $breadcrumb = drupal_get_breadcrumb(); $breadcrumb[] = l(t('Votes'), 'node/' . $node->nid . '/votes'); drupal_set_breadcrumb($breadcrumb); $output = drupal_get_form('advpoll_clear_votes_confirm_form', $node->nid); // Set the title after we get the form so we overwrite confirm_form()'s title. drupal_set_title(check_plain($node->title)); return $output; } /** * Callback for results tab. */ function advpoll_results_page($node) { drupal_set_title(check_plain($node->title)); return node_show($node, 0); } /** * Display the votes page. */ function advpoll_votes_page($node) { drupal_set_title(check_plain($node->title)); if ($node->show_votes || user_access('administer polls')) { $output = t('This table lists all the recorded votes for this poll. If anonymous users are allowed to vote, they will be identified by the IP address of the computer they used when they voted.'); $header[] = array('data' => t('Visitor'), 'field' => 'u.name'); $header[] = array('data' => t('Date'), 'field' => 'v.timestamp'); $header[] = array('data' => t('Vote'), ''); // added pager query because of pre-grouping as an intermediate fix. $result = pager_query(" SELECT v.uid, v.vote_source, v.timestamp, u.name FROM {votingapi_vote} v LEFT JOIN {users} u ON v.uid = u.uid WHERE v.content_type = 'advpoll' AND v.content_id = %d GROUP BY v.uid, v.vote_source, v.timestamp, u.name" .tablesort_sql($header), 20, 0, " SELECT COUNT( DISTINCT v.uid, v.vote_source, v.timestamp, u.name ) FROM {votingapi_vote} v LEFT JOIN {users} u ON v.uid = u.uid WHERE v.content_type = 'advpoll' AND v.content_id =%d", $node->nid ); $uids = array(); $hostnames = array(); $timestamp = array(); while ($vote = db_fetch_object($result)) { $uids[$vote->uid] = $vote->uid; $hostnames[$vote->vote_source] = $vote->vote_source; $timestamps[$vote->timestamp] = $vote->timestamp; } $rows = array(); if (count($uids) > 0) { // Use db_query()'s placeholder syntax to prevent any potential SQL // injection attacks. $uid_placeholders = array_fill(0, count($uids), '%d'); $host_placeholders = array_fill(0, count($hostnames), "'%s'"); $time_placeholders = array_fill(0, count($timestamps), '%d'); // Here we have to select votes based on their uid+hostname+timestamp // combination because there no unique id for the set of rankings that // corresponds to a user's full vote on a given poll. $query = " SELECT v.vote_id, v.tag, v.uid, v.vote_source, v.timestamp, v.value, u.name FROM {votingapi_vote} v LEFT JOIN {users} u ON v.uid = u.uid WHERE v.content_id = %d AND v.uid IN(". implode(', ', $uid_placeholders) .") AND v.vote_source IN(". implode(', ', $host_placeholders) .") AND v.timestamp IN(". implode(', ', $time_placeholders) .")" . tablesort_sql($header); $parameters = array_merge(array($query, $node->nid), array_values($uids), array_values($hostnames), array_values($timestamps)); $result = call_user_func_array('db_query', $parameters); while ($vote = db_fetch_object($result)) { $key = $vote->uid ? $vote->uid : $vote->vote_source .'-'. $vote->timestamp; $rows[$key]['name'] = $vote->name ? theme('username', $vote) : check_plain($vote->vote_source); $rows[$key]['timestamp'] = $vote->timestamp; if ($node->type == 'advpoll_ranking') { // Need two dimensional results (if equal rankings are allowed). $rows[$key]['votes'][$vote->value][] = _advpoll_choice_markup($node->choice[$vote->tag]['label'], $node->format, FALSE); } else if ($node->type == 'advpoll_multirate') { // Need the actual result values for multirate. $rows[$key]['votes'][_advpoll_choice_markup($node->choice[$vote->tag]['label'], $node->format, FALSE)] = $vote->value; } else { // Just need one dimensional results. $rows[$key]['votes'][] = _advpoll_choice_markup($node->choice[$vote->tag]['label'], $node->format, FALSE); } } } $separators = array('advpoll_ranking' => ' > ', 'advpoll_binary' => ', ', 'advpoll_multirate' => "