From 8be5a2545e4414dc0340924908cf8aa32638c378 Mon Sep 17 00:00:00 2001 From: Steven Wittens <steven@10.no-reply.drupal.org> Date: Tue, 4 Jun 2002 03:55:17 +0000 Subject: [PATCH] Poll.module improvements: - Added links to see poll results when you haven't voted yet (and to go back). - Cleaned up code and moved large sections into separate functions for cleaner code - Cleaned up the way of distinguishing between multiple polls on one page (now it just uses the nid) --- modules/poll.module | 264 ++++++++++++++++++++++++++------------- modules/poll/poll.module | 264 ++++++++++++++++++++++++++------------- 2 files changed, 348 insertions(+), 180 deletions(-) diff --git a/modules/poll.module b/modules/poll.module index ab7792e187eb..c00cdff83035 100644 --- a/modules/poll.module +++ b/modules/poll.module @@ -1,9 +1,35 @@ <?php // $Id$ -function poll_system($field){ - $system["description"] = t("Enables submission of multiple choice questions for voting."); - return $system[$field]; +function poll_allowvotes(&$node) { + /* + ** Only accept votes on specific cases to prevent double voting and abuse. + ** We only need to determine this once for a poll, but we don't do this in + ** poll_load() (i.e. for every poll that is loaded) for speed reasons. + */ + global $REMOTE_ADDR, $user; + + if ($node->allowvotes != -1) { + return $node; + } + + $node->allowvotes = 0; + if (user_access("vote on polls")) { + if ($user->uid) { + // Pad the UID with underscores to allow a simple strstr() search + $id = "_". $user->uid ."_"; + } + else { + $id = $REMOTE_ADDR; + } + if (!strstr($node->voters, $id)) { + $node->allowvotes = $node->active; + } + + // Save this for later + $node->polluserid = $id; + } + return $node; } function poll_access($op, $node) { @@ -123,14 +149,45 @@ function poll_insert($node) { } } -function poll_link($type) { +function poll_link($type, $node = 0, $main) { if ($type == "menu.create" && user_access("post content")) { $links[] = lm(t("create poll"), array("mod" => "node", "op" => "add", "type" => "poll"), "", array("title" => t("Add a new poll."))); } else if ($type == "page" && user_access("access content")) { $links[] = lm(t("polls"), array("mod" => "poll"), "", array("title" => t("View the list of polls on this site."))); } + else if ($type == "node" && $node->type == "poll") { + /* + ** Add links to allow the user to switch between the results and the voting + ** form, if he/she hasn't voted yet. + */ + + // Make sure we have determined the 'allowvotes' flag + poll_allowvotes($node); + if ($node->allowvotes == 1) { + global $pollresults; + + // Change the current URL: add/edit the value of pollresults[nid] + if ($pollresults[$node->nid]) { + // Disable + $url = eregi_replace("pollresults\[$node->nid\]=1", "pollresults[$node->nid]=0", request_uri()); + + $links[] = "<a href=\"$url\">". t("voting form") . "</a>"; + } + else { + // Enable + if (strstr(request_uri(), "pollresults[$node->nid]=")) { + $url = eregi_replace("pollresults\[$node->nid\]=0", "pollresults[$node->nid]=1", request_uri()); + } + else { + $url = request_uri() . (strstr(request_uri(), "?") ? "&" : "?") ."pollresults[$node->nid]=1"; + } + + $links[] = "<a href=\"$url\">". t("view results") . "</a>"; + } + } + } return $links ? $links : array(); } @@ -143,6 +200,9 @@ function poll_load($node) { $poll->choice[$choice->chorder] = $choice->chtext; $poll->chvotes[$choice->chorder] = $choice->chvotes; } + + // Reset allowvotes flag, will be filled in later on when needed. + $poll->allowvotes = -1; return $poll; } @@ -155,7 +215,7 @@ function poll_node($field) { function poll_page() { global $theme; - + $theme->header(); $result = db_query("SELECT n.nid, n.title, p.active, SUM(c.chvotes) AS votes FROM node n LEFT JOIN poll p ON n.nid=p.nid LEFT JOIN poll_choices c ON n.nid=c.nid WHERE type='poll' AND status='1' AND moderate='0' GROUP BY n.nid ORDER BY n.created DESC"); while ($node = db_fetch_object($result)) { @@ -192,6 +252,11 @@ function poll_save($op, $node) { } } +function poll_system($field){ + $system["description"] = t("Enables submission of multiple choice questions for voting."); + return $system[$field]; +} + function poll_teaser($node) { // Create a simple teaser that lists all the choices foreach ($node->choice as $k => $v) { @@ -202,109 +267,128 @@ function poll_teaser($node) { return $teaser; } -function poll_view(&$node, $main = 0, $block = 0) { - global $theme, $user; +function poll_view_voting(&$node, $main, $block, $links) { + // Display the vote form + global $theme; - /* When a poll is displayed twice on the same page (e.g. on the front page and in the side bar) - we only want to vote on one of them. We keep count using $pollid */ - global $pollidcount, $pollvote, $pollid, $REMOTE_ADDR; - $pollidcount++; + $url = request_uri(); + $output .= "<form action=\"$url\" method=\"post\">"; + $output .= "<table border=\"0\" align=\"center\"><tr><td>"; - // Only accept votes on specific cases to prevent double voting - $allowvotes = false; - if (user_access("vote on polls")) { - if ($user->uid) { - // Pad the UID with underscores to allow a simple strstr() search - $id = "_". $user->uid ."_"; - } - else { - $id = $REMOTE_ADDR; - } - if (!strstr($node->voters, $id)) { - $allowvotes = $node->active; + foreach ($node->choice as $key => $value) { + if ($value != "") { + $output .= "<input type=\"radio\" name=\"pollvote[$node->nid]\" value=\"$key\" /> $value<br />"; } } - if (($pollid == $pollidcount) && isset($pollvote) && ($allowvotes)) { - // The user has submitted a valid vote - if (!empty($node->choice[$pollvote])) { - $node->voters = $node->voters ? ($node->voters ." ". $id) : $id; - db_query("UPDATE poll SET voters='$node->voters' WHERE nid='$node->nid'"); - db_query("UPDATE poll_choices SET chvotes = chvotes + 1 WHERE nid='$node->nid' AND chorder='$pollvote'"); - $allowvotes = false; - $node->chvotes[$pollvote]++; - } + if ($block) { + $output .= "</td></tr><tr><td><div align=\"center\">". form_submit(t("Vote")) ."</div></td></tr></table>"; + } + else { + $output .= "</td><td valign=\"middle\"><div align=\"right\"> ". form_submit(t("Vote")) ."</div></td></tr></table>"; } - if ($allowvotes) { - // Display the vote form - $url = request_uri() . (strstr(request_uri(), "?") ? "&" : "?") ."pollid=". $pollidcount; - $output .= "<form action=\"$url\" method=\"post\">"; - $output .= "<table border=\"0\" align=\"center\"><tr><td>"; + $output .= $block ? "<div align=\"center\">". $theme->links($links) ."</div>" : ""; + $output .= "</form>"; + + return $output; +} + +function poll_view_results(&$node, $main, $block, $links) { + // Display the results + global $theme; - foreach ($node->choice as $key => $value) { - if ($value != "") { - $output .= "<input type=\"radio\" name=\"pollvote\" value=\"$key\" /> $value<br />"; + // Count the votes and find the maximum + foreach ($node->choice as $key => $value) { + $votestotal += $node->chvotes[$key]; + $votesmax = max($votesmax, $node->chvotes[$key]); + } + $votesmax = max($votesmax, 1); + + /* + ** Define CSS classes for the bars + ** (note: style is not allowed outside <head>, but the alternative is very + ** ugly and it seems to work in all browsers) + */ + $output .= "<style type=\"text/css\">"; + $output .= "td.pollfg { background-color: ". $theme->foreground ."; font-size: 5pt; }"; + $output .= "td.pollbg { background-color: ". $theme->background ."; font-size: 5pt; }"; + $output .= "</style>"; + + foreach ($node->choice as $key => $value) { + if ($value != "") { + $width = round($node->chvotes[$key] * 100 / $votesmax); + $percentage = round($node->chvotes[$key] * 100 / max($votestotal, 1)); + + $output .= "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"95%\" align=\"center\"><tr><td>$value</td><td><div align=\"right\"> $percentage%". (!$block ? " (". format_plural($node->chvotes[$key], "vote", "votes") .")" : "") ."</div></td></tr></table>"; + if ($width == 0) { + $output .= "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"95%\" align=\"center\"><tr><td class=\"pollbg\" width=\"100%\"> </td></tr></table>"; + } + else if ($width == 100) { + $output .= "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"95%\" align=\"center\"><tr><td class=\"pollfg\" width=\"100%\"> </td></tr></table>"; + } + else { + $output .= "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"95%\" align=\"center\"><tr><td class=\"pollfg\" width=\"". $width ."%\"> </td><td class=\"pollbg\" width=\"". (100 - $width) ."%\"> </td></tr></table>"; } } - if ($block) { - $output .= "</td></tr><tr><td><div align=\"center\">". form_submit(t("Vote")) ."</div></td></tr></table>"; - } - else { - $output .= "</td><td valign=\"middle\"><div align=\"right\"> ". form_submit(t("Vote")) ."</div></td></tr></table>"; - } - $links = link_node($node, $main); - $links[] = lm(t("older polls"), array("mod" => "poll"), "", array("title" => t("View the list of polls on this site."))); - $output .= $block ? "<div align=\"center\">". $theme->links($links) ."</div>" : ""; - $output .= "</form>"; } - else { - // Display the results + $output .= "<br /><div align=\"center\">". t("Total votes") .": $votestotal"; - // Count the votes and find the maximum - foreach ($node->choice as $key => $value) { - $votestotal += $node->chvotes[$key]; - $votesmax = max($votesmax, $node->chvotes[$key]); - } - $votesmax = max($votesmax, 1); - - // Define CSS classes for the bars - $output .= "<style type=\"text/css\">"; - $output .= "td.pollfg { background-color: ". $theme->foreground ."; font-size: 5pt; }"; - $output .= "td.pollbg { background-color: ". $theme->background ."; font-size: 5pt; }"; - $output .= "</style>"; - - foreach ($node->choice as $key => $value) { - if ($value != "") { - $width = round($node->chvotes[$key] * 100 / $votesmax); - $percentage = round($node->chvotes[$key] * 100 / max($votestotal, 1)); - - $output .= "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"95%\" align=\"center\"><tr><td>$value</td><td><div align=\"right\"> $percentage%". (!$block ? " (". format_plural($node->chvotes[$key], "vote", "votes") .")" : "") ."</div></td></tr></table>"; - if ($width == 0) { - $output .= "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"95%\" align=\"center\"><tr><td class=\"pollbg\" width=\"100%\"> </td></tr></table>"; - } - else if ($width == 100) { - $output .= "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"95%\" align=\"center\"><tr><td class=\"pollfg\" width=\"100%\"> </td></tr></table>"; - } - else { - $output .= "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"95%\" align=\"center\"><tr><td class=\"pollfg\" width=\"". $width ."%\"> </td><td class=\"pollbg\" width=\"". (100 - $width) ."%\"> </td></tr></table>"; - } - } - } - if ($block) { - // Prevent a 'read more' link in the side-block. - $node->body = $node->teaser = ""; + $output .= ($block ? "<br />". $theme->links($links) : "") ."</div>"; + + return $output; +} + +function poll_view_processvote(&$node) { + global $pollvote; + + if (isset($pollvote[$node->nid]) && ($node->allowvotes == 1)) { + if (!empty($node->choice[$pollvote[$node->nid]])) { + $node->voters = $node->voters ? ($node->voters ." ". $node->polluserid) : $node->polluserid; + db_query("UPDATE poll SET voters='$node->voters' WHERE nid='$node->nid'"); + db_query("UPDATE poll_choices SET chvotes = chvotes + 1 WHERE nid='$node->nid' AND chorder='". $pollvote[$node->nid] ."'"); + $node->allowvotes = 0; + $node->chvotes[$pollvote[$node->nid]]++; } + } +} + +function poll_view(&$node, $main = 0, $block = 0) { + global $theme, $user; + + /* + ** When several polls are displayed on the same page (e.g. on the front page and in the side bar) + ** we distinguish between them using the nid as index into associative arrays: + ** $pollvote[nid] - A user's vote + ** $pollresults[nid] - When a user hasn't voted, he can choose to see the voting form or the results + */ + global $pollresults; + + // Make sure we have determined the 'allowvotes' flag + poll_allowvotes($node); + + // Because the voting form is embedded in the node-display, we process the data here + poll_view_processvote($node); + + // Add extra link pointing to the list of polls (side-block only) + if ($block) { + $node->body = $node->teaser = ""; + $links = link_node($node, $main); $links[] = lm(t("older polls"), array("mod" => "poll"), "", array("title" => t("View the list of polls on this site."))); - $output .= "<br /><div align=\"center\">Total votes: ". $votestotal . ($block ? "<br />". $theme->links($links) : "") ."</div>"; } - // Force the output on both the mainpage and elsewhere - $node->body = $output; - $node->teaser = $output; + + if (($node->allowvotes == 1) && !$pollresults[$node->nid]) { + $output = poll_view_voting($node, $main, $block, $links); + } + else { + $output = poll_view_results($node, $main, $block, $links); + } + + $node->body = $node->teaser = $output; // We also use poll_view() for the side-block - if ($block == 0) { + if (!$block) { $theme->node($node, $main); } } diff --git a/modules/poll/poll.module b/modules/poll/poll.module index ab7792e187eb..c00cdff83035 100644 --- a/modules/poll/poll.module +++ b/modules/poll/poll.module @@ -1,9 +1,35 @@ <?php // $Id$ -function poll_system($field){ - $system["description"] = t("Enables submission of multiple choice questions for voting."); - return $system[$field]; +function poll_allowvotes(&$node) { + /* + ** Only accept votes on specific cases to prevent double voting and abuse. + ** We only need to determine this once for a poll, but we don't do this in + ** poll_load() (i.e. for every poll that is loaded) for speed reasons. + */ + global $REMOTE_ADDR, $user; + + if ($node->allowvotes != -1) { + return $node; + } + + $node->allowvotes = 0; + if (user_access("vote on polls")) { + if ($user->uid) { + // Pad the UID with underscores to allow a simple strstr() search + $id = "_". $user->uid ."_"; + } + else { + $id = $REMOTE_ADDR; + } + if (!strstr($node->voters, $id)) { + $node->allowvotes = $node->active; + } + + // Save this for later + $node->polluserid = $id; + } + return $node; } function poll_access($op, $node) { @@ -123,14 +149,45 @@ function poll_insert($node) { } } -function poll_link($type) { +function poll_link($type, $node = 0, $main) { if ($type == "menu.create" && user_access("post content")) { $links[] = lm(t("create poll"), array("mod" => "node", "op" => "add", "type" => "poll"), "", array("title" => t("Add a new poll."))); } else if ($type == "page" && user_access("access content")) { $links[] = lm(t("polls"), array("mod" => "poll"), "", array("title" => t("View the list of polls on this site."))); } + else if ($type == "node" && $node->type == "poll") { + /* + ** Add links to allow the user to switch between the results and the voting + ** form, if he/she hasn't voted yet. + */ + + // Make sure we have determined the 'allowvotes' flag + poll_allowvotes($node); + if ($node->allowvotes == 1) { + global $pollresults; + + // Change the current URL: add/edit the value of pollresults[nid] + if ($pollresults[$node->nid]) { + // Disable + $url = eregi_replace("pollresults\[$node->nid\]=1", "pollresults[$node->nid]=0", request_uri()); + + $links[] = "<a href=\"$url\">". t("voting form") . "</a>"; + } + else { + // Enable + if (strstr(request_uri(), "pollresults[$node->nid]=")) { + $url = eregi_replace("pollresults\[$node->nid\]=0", "pollresults[$node->nid]=1", request_uri()); + } + else { + $url = request_uri() . (strstr(request_uri(), "?") ? "&" : "?") ."pollresults[$node->nid]=1"; + } + + $links[] = "<a href=\"$url\">". t("view results") . "</a>"; + } + } + } return $links ? $links : array(); } @@ -143,6 +200,9 @@ function poll_load($node) { $poll->choice[$choice->chorder] = $choice->chtext; $poll->chvotes[$choice->chorder] = $choice->chvotes; } + + // Reset allowvotes flag, will be filled in later on when needed. + $poll->allowvotes = -1; return $poll; } @@ -155,7 +215,7 @@ function poll_node($field) { function poll_page() { global $theme; - + $theme->header(); $result = db_query("SELECT n.nid, n.title, p.active, SUM(c.chvotes) AS votes FROM node n LEFT JOIN poll p ON n.nid=p.nid LEFT JOIN poll_choices c ON n.nid=c.nid WHERE type='poll' AND status='1' AND moderate='0' GROUP BY n.nid ORDER BY n.created DESC"); while ($node = db_fetch_object($result)) { @@ -192,6 +252,11 @@ function poll_save($op, $node) { } } +function poll_system($field){ + $system["description"] = t("Enables submission of multiple choice questions for voting."); + return $system[$field]; +} + function poll_teaser($node) { // Create a simple teaser that lists all the choices foreach ($node->choice as $k => $v) { @@ -202,109 +267,128 @@ function poll_teaser($node) { return $teaser; } -function poll_view(&$node, $main = 0, $block = 0) { - global $theme, $user; +function poll_view_voting(&$node, $main, $block, $links) { + // Display the vote form + global $theme; - /* When a poll is displayed twice on the same page (e.g. on the front page and in the side bar) - we only want to vote on one of them. We keep count using $pollid */ - global $pollidcount, $pollvote, $pollid, $REMOTE_ADDR; - $pollidcount++; + $url = request_uri(); + $output .= "<form action=\"$url\" method=\"post\">"; + $output .= "<table border=\"0\" align=\"center\"><tr><td>"; - // Only accept votes on specific cases to prevent double voting - $allowvotes = false; - if (user_access("vote on polls")) { - if ($user->uid) { - // Pad the UID with underscores to allow a simple strstr() search - $id = "_". $user->uid ."_"; - } - else { - $id = $REMOTE_ADDR; - } - if (!strstr($node->voters, $id)) { - $allowvotes = $node->active; + foreach ($node->choice as $key => $value) { + if ($value != "") { + $output .= "<input type=\"radio\" name=\"pollvote[$node->nid]\" value=\"$key\" /> $value<br />"; } } - if (($pollid == $pollidcount) && isset($pollvote) && ($allowvotes)) { - // The user has submitted a valid vote - if (!empty($node->choice[$pollvote])) { - $node->voters = $node->voters ? ($node->voters ." ". $id) : $id; - db_query("UPDATE poll SET voters='$node->voters' WHERE nid='$node->nid'"); - db_query("UPDATE poll_choices SET chvotes = chvotes + 1 WHERE nid='$node->nid' AND chorder='$pollvote'"); - $allowvotes = false; - $node->chvotes[$pollvote]++; - } + if ($block) { + $output .= "</td></tr><tr><td><div align=\"center\">". form_submit(t("Vote")) ."</div></td></tr></table>"; + } + else { + $output .= "</td><td valign=\"middle\"><div align=\"right\"> ". form_submit(t("Vote")) ."</div></td></tr></table>"; } - if ($allowvotes) { - // Display the vote form - $url = request_uri() . (strstr(request_uri(), "?") ? "&" : "?") ."pollid=". $pollidcount; - $output .= "<form action=\"$url\" method=\"post\">"; - $output .= "<table border=\"0\" align=\"center\"><tr><td>"; + $output .= $block ? "<div align=\"center\">". $theme->links($links) ."</div>" : ""; + $output .= "</form>"; + + return $output; +} + +function poll_view_results(&$node, $main, $block, $links) { + // Display the results + global $theme; - foreach ($node->choice as $key => $value) { - if ($value != "") { - $output .= "<input type=\"radio\" name=\"pollvote\" value=\"$key\" /> $value<br />"; + // Count the votes and find the maximum + foreach ($node->choice as $key => $value) { + $votestotal += $node->chvotes[$key]; + $votesmax = max($votesmax, $node->chvotes[$key]); + } + $votesmax = max($votesmax, 1); + + /* + ** Define CSS classes for the bars + ** (note: style is not allowed outside <head>, but the alternative is very + ** ugly and it seems to work in all browsers) + */ + $output .= "<style type=\"text/css\">"; + $output .= "td.pollfg { background-color: ". $theme->foreground ."; font-size: 5pt; }"; + $output .= "td.pollbg { background-color: ". $theme->background ."; font-size: 5pt; }"; + $output .= "</style>"; + + foreach ($node->choice as $key => $value) { + if ($value != "") { + $width = round($node->chvotes[$key] * 100 / $votesmax); + $percentage = round($node->chvotes[$key] * 100 / max($votestotal, 1)); + + $output .= "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"95%\" align=\"center\"><tr><td>$value</td><td><div align=\"right\"> $percentage%". (!$block ? " (". format_plural($node->chvotes[$key], "vote", "votes") .")" : "") ."</div></td></tr></table>"; + if ($width == 0) { + $output .= "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"95%\" align=\"center\"><tr><td class=\"pollbg\" width=\"100%\"> </td></tr></table>"; + } + else if ($width == 100) { + $output .= "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"95%\" align=\"center\"><tr><td class=\"pollfg\" width=\"100%\"> </td></tr></table>"; + } + else { + $output .= "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"95%\" align=\"center\"><tr><td class=\"pollfg\" width=\"". $width ."%\"> </td><td class=\"pollbg\" width=\"". (100 - $width) ."%\"> </td></tr></table>"; } } - if ($block) { - $output .= "</td></tr><tr><td><div align=\"center\">". form_submit(t("Vote")) ."</div></td></tr></table>"; - } - else { - $output .= "</td><td valign=\"middle\"><div align=\"right\"> ". form_submit(t("Vote")) ."</div></td></tr></table>"; - } - $links = link_node($node, $main); - $links[] = lm(t("older polls"), array("mod" => "poll"), "", array("title" => t("View the list of polls on this site."))); - $output .= $block ? "<div align=\"center\">". $theme->links($links) ."</div>" : ""; - $output .= "</form>"; } - else { - // Display the results + $output .= "<br /><div align=\"center\">". t("Total votes") .": $votestotal"; - // Count the votes and find the maximum - foreach ($node->choice as $key => $value) { - $votestotal += $node->chvotes[$key]; - $votesmax = max($votesmax, $node->chvotes[$key]); - } - $votesmax = max($votesmax, 1); - - // Define CSS classes for the bars - $output .= "<style type=\"text/css\">"; - $output .= "td.pollfg { background-color: ". $theme->foreground ."; font-size: 5pt; }"; - $output .= "td.pollbg { background-color: ". $theme->background ."; font-size: 5pt; }"; - $output .= "</style>"; - - foreach ($node->choice as $key => $value) { - if ($value != "") { - $width = round($node->chvotes[$key] * 100 / $votesmax); - $percentage = round($node->chvotes[$key] * 100 / max($votestotal, 1)); - - $output .= "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"95%\" align=\"center\"><tr><td>$value</td><td><div align=\"right\"> $percentage%". (!$block ? " (". format_plural($node->chvotes[$key], "vote", "votes") .")" : "") ."</div></td></tr></table>"; - if ($width == 0) { - $output .= "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"95%\" align=\"center\"><tr><td class=\"pollbg\" width=\"100%\"> </td></tr></table>"; - } - else if ($width == 100) { - $output .= "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"95%\" align=\"center\"><tr><td class=\"pollfg\" width=\"100%\"> </td></tr></table>"; - } - else { - $output .= "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"95%\" align=\"center\"><tr><td class=\"pollfg\" width=\"". $width ."%\"> </td><td class=\"pollbg\" width=\"". (100 - $width) ."%\"> </td></tr></table>"; - } - } - } - if ($block) { - // Prevent a 'read more' link in the side-block. - $node->body = $node->teaser = ""; + $output .= ($block ? "<br />". $theme->links($links) : "") ."</div>"; + + return $output; +} + +function poll_view_processvote(&$node) { + global $pollvote; + + if (isset($pollvote[$node->nid]) && ($node->allowvotes == 1)) { + if (!empty($node->choice[$pollvote[$node->nid]])) { + $node->voters = $node->voters ? ($node->voters ." ". $node->polluserid) : $node->polluserid; + db_query("UPDATE poll SET voters='$node->voters' WHERE nid='$node->nid'"); + db_query("UPDATE poll_choices SET chvotes = chvotes + 1 WHERE nid='$node->nid' AND chorder='". $pollvote[$node->nid] ."'"); + $node->allowvotes = 0; + $node->chvotes[$pollvote[$node->nid]]++; } + } +} + +function poll_view(&$node, $main = 0, $block = 0) { + global $theme, $user; + + /* + ** When several polls are displayed on the same page (e.g. on the front page and in the side bar) + ** we distinguish between them using the nid as index into associative arrays: + ** $pollvote[nid] - A user's vote + ** $pollresults[nid] - When a user hasn't voted, he can choose to see the voting form or the results + */ + global $pollresults; + + // Make sure we have determined the 'allowvotes' flag + poll_allowvotes($node); + + // Because the voting form is embedded in the node-display, we process the data here + poll_view_processvote($node); + + // Add extra link pointing to the list of polls (side-block only) + if ($block) { + $node->body = $node->teaser = ""; + $links = link_node($node, $main); $links[] = lm(t("older polls"), array("mod" => "poll"), "", array("title" => t("View the list of polls on this site."))); - $output .= "<br /><div align=\"center\">Total votes: ". $votestotal . ($block ? "<br />". $theme->links($links) : "") ."</div>"; } - // Force the output on both the mainpage and elsewhere - $node->body = $output; - $node->teaser = $output; + + if (($node->allowvotes == 1) && !$pollresults[$node->nid]) { + $output = poll_view_voting($node, $main, $block, $links); + } + else { + $output = poll_view_results($node, $main, $block, $links); + } + + $node->body = $node->teaser = $output; // We also use poll_view() for the side-block - if ($block == 0) { + if (!$block) { $theme->node($node, $main); } } -- GitLab