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
      foreach ($node->choice as $key => $value) {
117
        if ($value) {
118
          if ($block) {
119
            $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>";
120
121
          } else {
            $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>";
122
          }
123
124
125
126
127
        }
      }
      $output .= "<div align=\"center\">" . $footer . "</div>";
      break;

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

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

134
      $node->totalvotes = max(1, $node->totalvotes);
135

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

Dries's avatar
   
Dries committed
150
151
152
153
154

   if (!$block) {
     $node->body = $output;
     $theme->node($node, 1);
   }
Dries's avatar
   
Dries committed
155
   return array("title" => $title, "content" => $output);
156
157
158
}

function poll_form($edit = array(), $nocheck = 0) {
Dries's avatar
CHANGES    
Dries committed
159
  global $REQUEST_URI, $user;
160
161
162
163

  $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
164

165
166
  $active = array(0 => "Closed", 1 => "Active");

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

  /* Mini-form for number of choiceboxes */
170
  $choices = $edit[choices]?$edit[choices]:max(5,sizeof($edit[choice]));
171
172
173
174
175
176
177
178
  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
179

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

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

189
190
191
192
193

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

195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
  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]) {
Dries's avatar
   
Dries committed
218
    $nid = node_save($edit, array(active => 1, 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 => ""));
219
220
  }
  else if (user_access($user)) {
Dries's avatar
   
Dries committed
221
222
    $nid = node_save($edit, array(active, cid, tid, runtime, title, type => "poll"));
    db_query("DELETE FROM poll_choices WHERE nid='" . $nid . "'");
223
224
225
226
227
  }
  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
228
      }
229
    }
230
    db_query("INSERT INTO poll_choices (nid, chtext, chvotes, chorder) VALUES " . implode(",", $v));
231
232
233
  }
}

Dries's avatar
   
Dries committed
234
function poll_block() {
235
  $result = _node_get(array("type" => "poll"));
236
237
  while ($poll = db_fetch_object($result)) {
    if ($poll->active) {
238
239
240
241
      $poll = poll_view($poll, 0, 1);
      $output = "<b>" . $poll[title] . "</b><br>" . $poll[content];
      break;
    }
242
243
244
245
246
  }
  $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";
247
  return $blocks;
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
}

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
273
      print poll_form(poll_get_choices_array(node_get_array(array("nid" => $id))));
274
275
276
277
278
279
280
281
282
283
284
      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;
285
286
    case t("Refresh"):
      $refresh = 1;
287
    case t("Preview"):
Dries's avatar
CHANGES    
Dries committed
288
      poll_view(new Poll(node_preview($edit)));
289
    case "add":
290
      print poll_form($edit, $refresh);
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
      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"):
306
      $refresh = 1;
307
    case t("Preview"):
Dries's avatar
CHANGES    
Dries committed
308
      poll_view(new Poll(node_preview($edit)));
309
      $theme->box(t("Submit"), poll_form($edit, $refresh));
310
311
312
313
314
315
316
317
318
319
320
      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());
  }
}

?>