poll.module 12.3 KB
Newer Older
1 2 3 4 5 6 7 8
<?php

class Poll {
  function Poll($poll) {
    $this = new Node($poll);
    $this->runtime = $poll[runtime];
    $this->active = $poll[active];
    $this->voters = $poll[voters];
9 10
    $this->choice = $poll[choice];
    $this->chvotes = $poll[chvotes];
Dries's avatar
 
Dries committed
11
    $this->chid = $poll[chid];
12 13 14 15
  }
}

function poll_cron() {
16
  $result = _node_get(array("type" => "poll"));
17
  while ($poll = db_fetch_array($result)) {
18
    if (($poll[active]) && ($poll[runtime])) {
19 20
      if (($poll[timestamp] + $poll[runtime]) < time()) {
        $poll[active] = 0;
21
        node_save($poll, array(active));
22 23
      }
    }
24
  }
25 26 27
}

function poll_get_choices_array($poll) {
28
  if (!is_array($poll[choice])) {
29 30 31 32 33 34 35 36 37 38
    $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]);
39 40
    }
  }
41 42
  $poll[maxvotes] = max(1, $m);
  $poll[totalvotes] = $t;
43 44 45 46
  return $poll;
}

function poll_get_choices_obj($poll) {
47
  if (!is_array($poll->choice)) {
48 49 50 51 52 53 54 55 56 57 58
    $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);
59 60
    }
  }
61 62
  $poll->maxvotes = max(1, $m);
  $poll->totalvotes = $t;
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
  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() {
 ?>
   <i>No help available.</i>
 <?php
}

function poll_graph($val) {
  $p = round($val * 100);
87
  return "<table width=\"100%\" cellspacing=\"0\" cellpadding=\"0\"><tr>" . ($p ? "<td width=\"" . $p . "%\" style=\"background-color: #000000;\"><span style=\"font-size: 4pt;\">&nbsp;</span></td>" : "") . ($p < 100 ? "<td style=\"background-color: #ffffff;\" width=\"" . (100 - $p) . "%\"><span style=\"font-size: 4pt;\">&nbsp;</span></td>":"") . "</tr></table>";
88 89 90 91 92
}

function poll_view($node, $main = 0, $block = 0) {
  global $theme, $op, $user, $chid, $REQUEST_URI;

93
  if (($node->active) && (!field_get($node->voters, $user->userid))) $voting = 1;
94
  if ((!$voting) && ($op != "View")) $op = "View";
Dries's avatar
 
Dries committed
95

96 97
  switch ($op) {
    case "Vote":
98
      if (($node->active) && (!field_get($node->voters, $user->userid))) {
99 100
        $result = db_query("UPDATE poll_choices SET chvotes=chvotes+1 WHERE nid='" . $node->nid . "' && chid='" . check_input($chid) . "'");
        if (($result) && ($user)) {
101
          $new = node_get_array(array("nid" => $node->nid));
102
          $new[voters] = field_set($node->voters, $user->userid, 1);
103
          node_save($new, array(voters));
104
          $node = node_get_object(array("nid" => $node->nid));
105 106
        }
      }
Dries's avatar
 
Dries committed
107

108 109
    case "View":
      $node = poll_get_choices_obj($node);
Dries's avatar
 
Dries committed
110

111
      $title = "<b>" . check_output($node->title) . "</b>";
112
      $footer = "<small>(" . format_plural($node->totalvotes ? $node->totalvotes : 0, "vote", "votes") . ")</small>";
Dries's avatar
 
Dries committed
113

114
      $node->totalvotes = max(1, $node->totalvotes);
Dries's avatar
 
Dries committed
115

116
      if (!$block) $output .= "<small>Posted by " . format_username($node->userid) . " on " . format_date($node->timestamp, "large") . "</small><br>\r\n";
117
      foreach ($node->choice as $key => $value) {
118 119 120 121 122 123 124
        if ($value) {
          if ($main) {
            $output .= "<table cellspacing=\"1\" cellpadding=\"0\" width=\"100%\"><tr><td width=\"20%\" valign=\"middle\" align=\"left\">" . check_output($value) . "</td><td width=\"70%\">" . poll_graph($node->chvotes[$key] / $node->maxvotes) . "</td><td width=\"10%\" align=\"right\">" . round(($node->chvotes[$key] / $node->totalvotes) * 100) . "%</td></tr></table>";
          }
          else {
            $output .= (!$block ? "<br>" : "") . check_output($value) . "<br><table width=\"90%\" align=\"center\" cellspacing=\"1\" cellpadding=\"0\"><tr><td width=\"70%\" valign=\"middle\" align=\"left\">" . poll_graph($node->chvotes[$key] / $node->maxvotes) . "</td><td align=\"right\">" . round(($node->chvotes[$key] / $node->totalvotes) * 100) . "%</td></tr></table>\r\n";
          }
125 126 127 128 129
        }
      }
      $output .= "<div align=\"center\">" . $footer . "</div>";
      break;

Dries's avatar
 
Dries committed
130
    default:
131 132 133
      $node = poll_get_choices_obj($node);

      $title = "<b>" . check_output($node->title) . "</b>";
134
      $footer = "<small>(" . format_plural($node->totalvotes ? $node->totalvotes : 0, "vote", "votes") . ")</small>";
Dries's avatar
 
Dries committed
135

136
      $node->totalvotes = max(1, $node->totalvotes);
137

138
      if (!$block) $output .= "<small>Posted by " . format_username($node->userid) . " on " . format_date($node->timestamp, "large") . "</small><br><br>\r\n";
Dries's avatar
 
Dries committed
139
      $output .= "<table align=\"center\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\"><tr><td align=\"left\">";
140
      foreach ($node->choice as $key => $value) {
141 142 143
        if ($value) {
          $output .= "<input type=\"radio\" name=\"chid\" value=\"" . $node->chid[$key] . "\">&nbsp;" . check_output($value) . "<br>\r\n";
        }
144 145
      }
      $output .= "</td></tr></table>";
146
      $output .= "<br><div align=\"center\">" . form_submit("Vote") . "<br>" . $footer  . "</div>";
147 148 149
      $output = form($REQUEST_URI, $output);
   }

150
   if (!$block) $theme->box($title, $output);
Dries's avatar
 
Dries committed
151
   return array("title" => $title, "content" => $output);
152 153 154
}

function poll_form($edit = array(), $nocheck = 0) {
Dries's avatar
CHANGES  
Dries committed
155
  global $REQUEST_URI, $user;
156 157 158 159

  $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"));
Dries's avatar
 
Dries committed
160

161 162
  $active = array(0 => "Closed", 1 => "Active");

Dries's avatar
 
Dries committed
163 164 165
  $admin = ($edit[nid] && user_access($user,"poll")) ? 1 : 0;

  /* Mini-form for number of choiceboxes */
166
  $choices = $edit[choices]?$edit[choices]:max(5,sizeof($edit[choice]));
167 168 169 170 171 172 173 174
  for ($c = 2; $c <= 20; $c++) $opts[$c]=$c;
  $form .= form_select(t("Number of choices"), "choices", $choices, $opts, t("This box specifies the number of choiceboxes in this form, it doesn't affect the actual amount of choices in the poll."));
  $form .= form_submit(t("Refresh")) . "<br><br><br>";

  /* 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);
Dries's avatar
 
Dries committed
175

176
  for ($a = 0; $a < $choices; $a++) {
177
    $form .= form_textfield(t("Choice"). " " . ($a + 1), "choice][$a", $edit[choice][$a], 50, 127);
Dries's avatar
 
Dries committed
178
    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);
179
  }
Dries's avatar
 
Dries committed
180

181
  $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."));
Dries's avatar
 
Dries committed
182
  if ($admin) $form .= form_select(t("Poll status"), "active", $edit[active], $active);
183
  $form .= structure_form("poll", $edit);
Dries's avatar
 
Dries committed
184

185 186 187 188 189

  // hidden fields:
  if ($edit[nid] > 0) {
    $form .= form_hidden("nid", $edit[nid]);
  }
Dries's avatar
 
Dries committed
190

191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
  if ((!$edit) || ($nocheck)) {
    $form .= form_submit(t("Preview"));
  }
  else if (!$edit[title]) {
    $form .= "<FONT COLOR=\"red\">". t("Warning: you did not supply a question.") ."</FONT><P>\n";
    $form .= form_submit(t("Preview"));
  }
  else if ((!$edit[choice][0]) && (!$edit[choice][1])) {
    $form .= "<FONT COLOR=\"red\">". t("Warning: you must supply at least 2 choices.") ."</FONT><P>\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, author => $user->id, cid, comment => category_comment($edit[cid]), moderate => topic_moderate($edit[tid]), promote => category_promote($edit[cid]), runtime, score => 0, status => (category_submission($edit[cid]) ? $status[queued] : $status[posted]), tid, timestamp => time(), title, type => "poll", votes => 0, voters => ""));
  }
  else if (user_access($user)) {
Dries's avatar
 
Dries committed
217 218
    $nid = node_save($edit, array(active, cid, tid, runtime, title, type => "poll"));
    db_query("DELETE FROM poll_choices WHERE nid='" . $nid . "'");
219 220 221 222 223
  }
  if ($nid) {
    foreach ($edit[choice] as $key => $value) {
      if ($value) {
        $v[] = "('" . $nid . "', '" . check_input($value) . "', '". check_input($edit[votes][$key]) ."', '". check_input($key) ."')";
Dries's avatar
 
Dries committed
224
      }
225
    }
226
    db_query("INSERT INTO poll_choices (nid, chtext, chvotes, chorder) VALUES " . implode(",", $v));
227 228 229
  }
}

Dries's avatar
 
Dries committed
230
function poll_block() {
231
  $result = _node_get(array("type" => "poll"));
232 233
  while ($poll = db_fetch_object($result)) {
    if ($poll->active) {
234 235 236 237
      $poll = poll_view($poll, 0, 1);
      $output = "<b>" . $poll[title] . "</b><br>" . $poll[content];
      break;
    }
238 239 240 241 242
  }
  $blocks[0][subject] = "Latest poll";
  $blocks[0][content] = $output ? $output : "No active polls.";
  $blocks[0][info] = "Display the latest active poll.";
  $blocks[0][link] = "index.php";
243
  return $blocks;
244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268
}

function poll_query($type = "") {
  global $status;
  $queries = array(array("recent polls", "WHERE n.type = 'poll' ORDER BY n.timestamp DESC"), array("active polls", "WHERE n.type = 'poll' AND n.status = '$status[posted]' ORDER BY n.timestamp DESC"), array("queued polls", "WHERE n.type = 'poll' AND n.status = '$status[queued]' ORDER BY n.timestamp DESC"), array("dumped polls", "WHERE n.type = 'poll' AND n.status = '$status[dumped]' ORDER BY n.timestamp DESC"), array("polls without category (integrity)", "WHERE n.type = 'poll' AND n.cid = '0' ORDER BY n.timestamp DESC"), array("polls without topic (integrity)", "WHERE n.type = 'poll' AND n.tid = '0' ORDER BY n.timestamp DESC"));
  return ($queries[$type] ? $queries[$type] : $queries);
}

function poll_overview($query = array()) {
  return node_overview($query);
}

function poll_admin() {
  global $id, $edit, $mod, $keys, $op, $theme, $type, $user;

  print "<SMALL><A HREF=\"admin.php?mod=poll&op=add\">add new poll</A> | <A HREF=\"admin.php?mod=poll&op=listing\">poll listing</A> | <A HREF=\"admin.php?mod=poll&op=search\">search poll</A> | <A HREF=\"admin.php?mod=poll\">overview</A> | <A HREF=\"admin.php?mod=poll&op=help\">help</A></SMALL><HR>\n";

  $type = ($type ? $type : 0);

  switch ($op) {
    case "delete":
      print poll_delete($id);
      print poll_overview(poll_query($type));
      break;
    case "edit":
Dries's avatar
 
Dries committed
269
      print poll_form(poll_get_choices_array(node_get_array(array("nid" => $id))));
270 271 272 273 274 275 276 277 278 279 280
      break;
    case "help":
      poll_help();
      break;
    case "listing":
      print node_listing(poll_query());
      break;
    case "search":
      print search_form($keys);
      print search_data($keys, $mod);
      break;
281 282
    case t("Refresh"):
      $refresh = 1;
283
    case t("Preview"):
Dries's avatar
CHANGES  
Dries committed
284
      poll_view(new Poll(node_preview($edit)));
285
    case "add":
286
      print poll_form($edit, $refresh);
287 288 289 290 291 292 293 294 295 296 297 298 299 300 301
      break;
    case t("Submit"):
      poll_save($edit);
      // fall through:
    default:
      print poll_overview(poll_query($type));
  }
}


function poll_user() {
  global $edit, $op, $theme, $user;

  switch($op) {
    case t("Refresh"):
302
      $refresh = 1;
303
    case t("Preview"):
Dries's avatar
CHANGES  
Dries committed
304
      poll_view(new Poll(node_preview($edit)));
305
      $theme->box(t("Submit"), poll_form($edit, $refresh));
306 307 308 309 310 311 312 313 314 315 316
      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());
  }
}

?>