poll.module 11.2 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 Buytaert's avatar
   
Dries Buytaert 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
}

Steven Wittens's avatar
Steven Wittens committed
27
28
29
30
31
32
33
function poll_delete($node) {
  if ($node->nid)
  {
    db_query("DELETE FROM poll_choices WHERE nid='" . $node->nid . "'");
  }  
}

34
function poll_get_choices_array($poll) {
35
  if (!is_array($poll[choice])) {
36
37
38
39
40
41
42
43
44
45
    $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]);
46
47
    }
  }
48
49
  $poll[maxvotes] = max(1, $m);
  $poll[totalvotes] = $t;
50
51
52
53
  return $poll;
}

function poll_get_choices_obj($poll) {
54
  if (!is_array($poll->choice)) {
55
56
57
58
59
60
61
62
63
64
65
    $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);
66
67
    }
  }
68
69
  $poll->maxvotes = max(1, $m);
  $poll->totalvotes = $t;
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
  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() {
 ?>
Steven Wittens's avatar
Steven Wittens committed
88
89
90
   <p>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.</p>
   <p>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.</p>
   <p>If you want to set a limit on the duration of a poll, use the <i>Poll Duration</i> setting. After the specified interval, the poll will automatically be closed, preventing anymore voting.</p> 
91
92
93
94
95
 <?php
}

function poll_graph($val) {
  $p = round($val * 100);
96
  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>";
97
98
99
100
101
}

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

102
  if (($node->active) && (!field_get($node->voters, $user->userid))) $voting = 1;
103
  if ((!$voting) && ($op != "View")) $op = "View";
Dries Buytaert's avatar
   
Dries Buytaert committed
104

105
106
  switch ($op) {
    case "Vote":
107
      if (($node->active) && (!field_get($node->voters, $user->userid))) {
108
109
        $result = db_query("UPDATE poll_choices SET chvotes=chvotes+1 WHERE nid='" . $node->nid . "' && chid='" . check_input($chid) . "'");
        if (($result) && ($user)) {
110
          $new = node_get_array(array("nid" => $node->nid));
111
          $new[voters] = field_set($node->voters, $user->userid, 1);
112
          node_save($new, array(voters));
113
          $node = node_get_object(array("nid" => $node->nid));
114
115
        }
      }
Dries Buytaert's avatar
   
Dries Buytaert committed
116

117
118
    case "View":
      $node = poll_get_choices_obj($node);
Dries Buytaert's avatar
   
Dries Buytaert committed
119

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

123
      $node->totalvotes = max(1, $node->totalvotes);
Dries Buytaert's avatar
   
Dries Buytaert committed
124

125
      foreach ($node->choice as $key => $value) {
126
        if ($value) {
127
          if ($block) {
128
            $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>";
129
130
          } 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>";
131
          }
132
133
134
135
136
        }
      }
      $output .= "<div align=\"center\">" . $footer . "</div>";
      break;

Dries Buytaert's avatar
   
Dries Buytaert committed
137
    default:
138
139
140
      $node = poll_get_choices_obj($node);

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

143
      $node->totalvotes = max(1, $node->totalvotes);
144

Dries Buytaert's avatar
   
Dries Buytaert committed
145
      $output .= "<table align=\"center\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\"><tr><td align=\"left\">";
146
      foreach ($node->choice as $key => $value) {
147
        if ($value) {
148
          $output .= "<input type=\"radio\" name=\"chid\" value=\"" . $node->chid[$key] . "\">&nbsp;" . check_output($value) . "<br>";
149
        }
150
      }
151
152
153
      if ($block) {
        $output .= "</td></tr></table><br><div align=\"center\">" . form_submit("Vote") . "<br>" . $footer  . "</div>";
      } else {
Dries Buytaert's avatar
   
Dries Buytaert committed
154
        $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>";
155
      }
156
157
158
      $output = form($REQUEST_URI, $output);
   }

Dries Buytaert's avatar
   
Dries Buytaert committed
159
160
161

   if (!$block) {
     $node->body = $output;
162
     $theme->node($node, $main);
Dries Buytaert's avatar
   
Dries Buytaert committed
163
   }
Dries Buytaert's avatar
   
Dries Buytaert committed
164
   return array("title" => $title, "content" => $output);
165
166
167
}

function poll_form($edit = array(), $nocheck = 0) {
Dries Buytaert's avatar
CHANGES    
Dries Buytaert committed
168
  global $REQUEST_URI, $user;
169
170
171
172

  $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 Buytaert's avatar
   
Dries Buytaert committed
173

174
  $active = array(0 => "Closed", 1 => "Active");
Steven Wittens's avatar
Steven Wittens committed
175
  
Dries Buytaert's avatar
   
Dries Buytaert committed
176
  $admin = ($edit[nid] && user_access($user,"poll")) ? 1 : 0;
Steven Wittens's avatar
Steven Wittens committed
177
178
  
  if ($admin && !is_array($edit[choices])) $edit = poll_get_choices_array($edit);
Dries Buytaert's avatar
   
Dries Buytaert committed
179
180

  /* Mini-form for number of choiceboxes */
181
  $choices = $edit[choices] ? $edit[choices] : max(5, count($edit[choice]));
182
  for ($c = 2; $c <= 20; $c++) $opts[$c]=$c;
Steven Wittens's avatar
Steven Wittens committed
183
184
  $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")) . "<br><br><br>";
185
186
187
188
189

  /* 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 Buytaert's avatar
   
Dries Buytaert committed
190

191
  for ($a = 0; $a < $choices; $a++) {
192
    $form .= form_textfield(t("Choice"). " " . ($a + 1), "choice][$a", $edit[choice][$a], 50, 127);
Dries Buytaert's avatar
   
Dries Buytaert committed
193
    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);
194
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
195

196
  $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 Buytaert's avatar
   
Dries Buytaert committed
197
  if ($admin) $form .= form_select(t("Poll status"), "active", $edit[active], $active);
198
  $form .= structure_form("poll", $edit);
Dries Buytaert's avatar
   
Dries Buytaert committed
199

200
201
202
203
204

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

206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
  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 Buytaert's avatar
   
Dries Buytaert committed
229
    $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 => ""));
230
231
  }
  else if (user_access($user)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
232
233
    $nid = node_save($edit, array(active, cid, tid, runtime, title, type => "poll"));
    db_query("DELETE FROM poll_choices WHERE nid='" . $nid . "'");
234
235
236
237
  }
  if ($nid) {
    foreach ($edit[choice] as $key => $value) {
      if ($value) {
238
        $v[] = "('" . $nid . "', '" . check_input($value) . "', '". check_input($edit[chvotes][$key]) ."', '". check_input($key) ."')";
Dries Buytaert's avatar
   
Dries Buytaert committed
239
      }
240
    }
241
    db_query("INSERT INTO poll_choices (nid, chtext, chvotes, chorder) VALUES " . implode(",", $v));
242
243
244
  }
}

Dries Buytaert's avatar
   
Dries Buytaert committed
245
function poll_block() {
246
  global $status;
247
  $result = _node_get(array("type" => "poll"));
248
  while ($poll = db_fetch_object($result)) {
249
    if (($poll->active) && ($poll->status == $status[posted])) {
Steven Wittens's avatar
Steven Wittens committed
250
251
      $content = poll_view($poll, 0, 1);
      $output = "<b>" . $content[title] . "</b><br>" . $content[content] . "<br><div align=\"center\">[ <a href=\"node.php?id=" . $poll->nid . "\">" . t("Read more") . "</a> ]</div>";
252
253
      break;
    }
254
255
256
  }
  $blocks[0][subject] = "Latest poll";
  $blocks[0][content] = $output ? $output : "No active polls.";
Steven Wittens's avatar
Steven Wittens committed
257
  $blocks[0][info] = "Latest active poll.";
258
  $blocks[0][link] = "index.php";
259
  return $blocks;
260
261
262
263
264
265
266
267
}


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

  switch($op) {
    case t("Refresh"):
268
      $refresh = 1;
269
    case t("Preview"):
Dries Buytaert's avatar
CHANGES    
Dries Buytaert committed
270
      poll_view(new Poll(node_preview($edit)));
271
      $theme->box(t("Submit"), poll_form($edit, $refresh));
272
273
274
275
276
277
278
279
280
281
282
      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());
  }
}

?>