runtime = $poll[runtime]; $this->active = $poll[active]; $this->voters = $poll[voters]; $this->choice = $poll[choice]; $this->chvotes = $poll[chvotes]; $this->chid = $poll[chid]; } } function poll_cron() { $result = _node_get(array("type" => "poll")); while ($poll = db_fetch_array($result)) { if (($poll[active]) && ($poll[runtime])) { if (($poll[timestamp] + $poll[runtime]) < time()) { $poll[active] = 0; node_save($poll, array(active)); } } } } function poll_delete($node) { if ($node->nid) { db_query("DELETE FROM poll_choices WHERE nid='" . $node->nid . "'"); } } function poll_get_choices_array($poll) { if (!is_array($poll[choice])) { $result = db_query("SELECT * FROM poll_choices WHERE nid='" . $poll[nid] . "'"); if ($result) { while ($choices = db_fetch_array($result)) { $m = max($m, $choices[chvotes]); $t += $choices[chvotes]; $poll[choice][$choices[chorder]] = $choices[chtext]; $poll[chvotes][$choices[chorder]] = $choices[chvotes]; $poll[chid][$choices[chorder]] = $choices[chid]; } if ($poll[choice]) ksort($poll[choice]); } } $poll[maxvotes] = max(1, $m); $poll[totalvotes] = $t; return $poll; } function poll_get_choices_obj($poll) { if (!is_array($poll->choice)) { $result = db_query("SELECT * FROM poll_choices WHERE nid='" . $poll->nid . "'"); if ($result) { while ($choices = db_fetch_array($result)) { $m = max($m,$choices[chvotes]); $t += $choices[chvotes]; $poll->choice[$choices[chorder]] = $choices[chtext]; $poll->chvotes[$choices[chorder]] = $choices[chvotes]; $poll->chid[$choices[chorder]] = $choices[chid]; } if ($poll->choice) ksort($poll->choice); } } $poll->maxvotes = max(1, $m); $poll->totalvotes = $t; return $poll; } function poll_status() { return array(dumped, queued, posted); } function poll_search($keys) { global $status, $user; $result = db_query("SELECT n.*, p.* FROM poll p LEFT JOIN node n ON n.nid = p.nid AND n.lid = p.lid WHERE n.status = '$status[posted]' AND (n.title LIKE '%$keys%') LIMIT 20"); while ($poll = db_fetch_object($result)) { $find[$i++] = array("title" => check_output($poll->title), "link" => (user_access($user, "poll") ? "admin.php?mod=poll&op=edit&id=$poll->nid" : "node.php?id=$poll->nid"), "user" => $poll->userid, "date" => $poll->timestamp); } return $find; } function poll_help() { ?>

Poll.module allows you to run simple multiple choice polls on your site. After creating the necessary categories, you can add a poll through this administration interface.

The poll.module also has a block to show the latest poll. If you combine it with a poll category that doesn't promote to the mainpage, you'll get a side-block only poll system.

If you want to set a limit on the duration of a poll, use the Poll Duration setting. After the specified interval, the poll will automatically be closed, preventing anymore voting.

foreground ? $theme->foreground : "#000000"; $clrempty = $theme->background ? $theme->background : "#ffffff"; $p = round($val * 100); return "" . ($p ? "" : "") . ($p < 100 ? "":"") . "
  
"; } function poll_view($node, $main = 0, $block = 0) { global $theme, $op, $user, $chid, $REQUEST_URI; if (($node->active) && (!field_get($node->voters, $user->userid))) $voting = 1; if ((!$voting) && ($op != "View")) $op = "View"; switch ($op) { case "Vote": if (($node->active) && (!field_get($node->voters, $user->userid))) { $result = db_query("UPDATE poll_choices SET chvotes=chvotes+1 WHERE nid='" . $node->nid . "' && chid='" . check_input($chid) . "'"); if (($result) && ($user)) { $new = node_get_array(array("nid" => $node->nid)); $new[voters] = field_set($node->voters, $user->userid, 1); node_save($new, array(voters)); $node = node_get_object(array("nid" => $node->nid)); } } case "View": $node = poll_get_choices_obj($node); $title = "" . check_output($node->title) . ""; $footer = "(" . format_plural($node->totalvotes ? $node->totalvotes : 0, "vote", "votes") . ")"; $node->totalvotes = max(1, $node->totalvotes); foreach ($node->choice as $key => $value) { if ($value) { if ($block) { $output .= (!$block ? "
" : "") . check_output($value) . "
" . poll_graph($node->chvotes[$key] / $node->maxvotes, $theme->pollfill, $theme->pollempty) . "" . round(($node->chvotes[$key] / $node->totalvotes) * 100) . "%
"; } else { $output .= "
" . check_output($value) . "" . poll_graph($node->chvotes[$key] / $node->maxvotes, $theme->pollfill, $theme->pollempty) . "" . round(($node->chvotes[$key] / $node->totalvotes) * 100) . "%
"; } } } $output .= "
" . $footer . "
"; break; default: $node = poll_get_choices_obj($node); $title = "" . check_output($node->title) . ""; $footer = "(" . format_plural($node->totalvotes ? $node->totalvotes : 0, "vote", "votes") . ")"; $node->totalvotes = max(1, $node->totalvotes); $output .= "
"; foreach ($node->choice as $key => $value) { if ($value) { $output .= "chid[$key] . "\"> " . check_output($value) . "
"; } } if ($block) { $output .= "

" . form_submit("Vote") . "
" . $footer . "
"; } else { $output .= "     
" . form_submit("Vote") . "
" . $footer . "
"; } $output = form($REQUEST_URI, $output); } if (!$block) { $node->body = $output; $theme->node($node, $main); } return array("title" => $title, "content" => $output); } function poll_form($edit = array(), $nocheck = 0) { global $REQUEST_URI, $user; $duration = array(0 => t("Unlimited"), 86400 => t("1 day"), 172800 => t("2 days"), 345600 => t("4 days"), 604800 => t("1 week"), 1209600 => t("2 weeks"), 2678400 => t("1 month"), 5356800 => t("2 months"), 10713600 => t("4 months"), 31536000 => t("1 year")); $active = array(0 => "Closed", 1 => "Active"); $admin = ($edit[nid] && user_access($user,"poll")) ? 1 : 0; if ($edit[title]) { $form .= poll_view(new Poll(node_preview($edit))); } if ($admin && !is_array($edit[choices])) $edit = poll_get_choices_array($edit); /* Mini-form for number of choiceboxes */ $choices = $edit[choices] ? $edit[choices] : max(2, count($edit[choice])); for ($c = 2; $c <= 20; $c++) $opts[$c]=$c; $form .= form_select(t("Number of choices"), "choices", $choices, $opts, t("This box only specifies the number of boxes in this form, it doesn't have to equal the actual amount of choices in the poll.")); $form .= form_submit(t("Preview")) . "


"; /* Main form */ $form .= form_item(t("Your name"), format_username(($edit[userid] ? $edit[userid] : $user->userid))); $form .= form_hidden("userid", $edit[userid]); $form .= form_textfield(t("Question"), "title", $edit[title], 50, 127); for ($a = 0; $a < $choices; $a++) { $form .= form_textfield(t("Choice"). " " . ($a + 1), "choice][$a", $edit[choice][$a], 50, 127); if ($admin) $form .= form_textfield(strtr(t("Votes for choice %n"), array("%n" => ($a + 1))), "chvotes][$a", $edit[chvotes][$a] ? $edit[chvotes][$a] : 0, 7, 7); } $form .= form_select(t("Poll duration"), "runtime", $edit[runtime] ? $edit[runtime] : t("1 week"), $duration, t("After this period, the poll will automatically be closed.")); if ($admin) $form .= form_select(t("Poll status"), "active", $edit[active], $active); $form .= node_attributes_edit($edit); // hidden fields: if ($edit[nid] > 0) { $form .= form_hidden("nid", $edit[nid]); } if ($nocheck) { $form .= form_submit(t("Preview")); } else if (!$edit[title]) { $form .= "". t("Warning: you did not supply a question.") ."

\n"; $form .= form_submit(t("Preview")); } else if ((!$edit[choice][0]) && (!$edit[choice][1])) { $form .= "". t("Warning: you must supply at least 2 choices.") ."

\n"; $form .= form_submit(t("Preview")); } else { $form .= form_submit(t("Preview")); $form .= form_submit(t("Submit")); } return form($REQUEST_URI, $form); } function poll_save($edit) { global $status, $user; if (!$edit[nid]) { $nid = node_save($edit, array(active => 1, attribute => node_attributes_save($edit), author => $user->id, cid, comment => variable_get("poll_comment", 0), moderate => variable_get("poll_moderate", ""), promote => variable_get("poll_promote", 0), runtime, score => 0, status => variable_get("poll_status", $status[queued]), tid, timestamp => time(), title, type => "poll", votes => 0, voters => "")); } else if (user_access($user)) { $nid = node_save($edit, array(active, attribute => node_attributes_save($edit), cid, tid, runtime, title, type => "poll")); db_query("DELETE FROM poll_choices WHERE nid='" . $nid . "'"); } if ($nid) { foreach ($edit[choice] as $key => $value) { if ($value) { $v[] = "('" . $nid . "', '" . check_input($value) . "', '". check_input($edit[chvotes][$key]) ."', '". check_input($key) ."')"; } } db_query("INSERT INTO poll_choices (nid, chtext, chvotes, chorder) VALUES " . implode(",", $v)); } } function poll_block() { global $status; $result = _node_get(array("type" => "poll")); while ($poll = db_fetch_object($result)) { if (($poll->active) && ($poll->status == $status[posted])) { $content = poll_view($poll, 0, 1); $output = "" . $content[title] . "
" . $content[content] . "

[ nid . "\">" . t("Read more") . " ]
"; break; } } $blocks[0][subject] = "Latest poll"; $blocks[0][content] = $output ? $output : "No active polls."; $blocks[0][info] = "Latest active poll."; $blocks[0][link] = "index.php"; return $blocks; } function poll_user() { global $edit, $op, $theme, $user; switch($op) { case t("Refresh"): $refresh = 1; case t("Preview"): $theme->box(t("Submit"), poll_form($edit, $refresh)); break; case t("Submit"): poll_save($edit); $theme->box(t("Submit"), t("Thank you for your submission.")); break; default: $theme->box(t("Submit"), poll_form()); } } ?>