poll.module 16.3 KB
Newer Older
1
<?php
2
// $Id$
3

Dries's avatar
   
Dries committed
4
5
6
7
8
9
/**
 * @file
 * Enables your site to capture votes on different topics in the form of multiple
 * choice questions.
 */

10
11
12
13
/**
 * Implementation of hook_help().
 */
function poll_help($section) {
Steven Wittens's avatar
Steven Wittens committed
14
15
  switch ($section) {
    case 'admin/help#poll':
16
17
18
19
20
21
22
23
24
25
      $output = '<p>'. t('The poll module can be used to create simple polls for site users.  A poll is a simple multiple choice questionnaire which displays the cummulative results of the answers to the poll.  Having polls on the site is a good way to get instant feedback from community members.') .'</p>';
      $output .= '<p>'. t('Users can create a poll. The title of the poll should be the question, then enter the answers and the "base" vote counts. You can also choose the time period over which the vote will run.The <a href="%poll">poll</a> item in the navigation menu will take you to a page where you can see all the current polls, vote on them (if you haven\'t already) and view the results.', array('%poll' => url('poll'))) .'</p>';
      $output .= t('<p>You can</p>
<ul>
<li>view the <a href="%poll">polls page</a>.</li>
<li><a href="%admin-node-configure-types-poll">administer &gt;&gt; content &gt;&gt; configure &gt;&gt; poll</a>.</li>
</ul>
', array('%poll' => url('poll'), '%admin-node-configure-types-poll' => url('admin/node/configure/types/poll')));
      $output .= '<p>'. t('For more information please read the configuration and customization handbook <a href="%poll">Poll page</a>.', array('%poll' => 'http://www.drupal.org/handbook/modules/poll/')) .'</p>';
      return $output;
Dries's avatar
   
Dries committed
26
    case 'admin/modules#description':
27
      return t("Allows your site to capture votes on different topics in the form of multiple choice questions.");
Steven Wittens's avatar
Steven Wittens committed
28
    case 'node/add#poll':
29
      return t("A poll is a multiple-choice question which visitors can vote on.");
Steven Wittens's avatar
Steven Wittens committed
30
  }
31
32
}

33
34
35
/**
 * Implementation of hook_access().
 */
36
function poll_access($op, $node) {
Steven Wittens's avatar
Steven Wittens committed
37
38
  if ($op == 'create') {
    return user_access('create polls');
Dries's avatar
   
Dries committed
39
  }
Steven Wittens's avatar
Steven Wittens committed
40
41
}

42
43
44
45
46
/**
 * Implementation of hook_block().
 *
 * Generates a block containing the latest poll.
 */
Steven Wittens's avatar
Steven Wittens committed
47
48
49
50
function poll_block($op = 'list', $delta = 0) {
  if (user_access('access content')) {
    if ($op == 'list') {
      $blocks[0]['info'] = t('Most recent poll');
Dries's avatar
   
Dries committed
51
52
      return $blocks;
    }
53
    else if ($op == 'view') {
54
      // Retrieve the latest poll.
55
      $sql = db_rewrite_sql("SELECT MAX(n.created) FROM {node} n INNER JOIN {poll} p ON p.nid = n.nid WHERE n.status = 1 AND p.active = 1 AND n.moderate = 0");
Dries's avatar
   
Dries committed
56
      $timestamp = db_result(db_query($sql));
Dries's avatar
   
Dries committed
57
      if ($timestamp) {
Steven Wittens's avatar
Steven Wittens committed
58
59
        $poll = node_load(array('type' => 'poll', 'created' => $timestamp, 'moderate' => 0, 'status' => 1));

Dries's avatar
   
Dries committed
60
        if ($poll->nid) {
61
          // poll_view() dumps the output into $poll->body.
62
          poll_view($poll, 1, 0, 1);
Dries's avatar
   
Dries committed
63
        }
Dries's avatar
   
Dries committed
64
      }
Steven Wittens's avatar
Steven Wittens committed
65
66
      $block['subject'] = t('Poll');
      $block['content'] = $poll->body;
Dries's avatar
   
Dries committed
67
      return $block;
68
69
70
71
    }
  }
}

72
73
74
75
76
/**
 * Implementation of hook_cron().
 *
 * Closes polls that have exceeded their allowed runtime.
 */
77
function poll_cron() {
78
  $result = db_query('SELECT p.nid FROM {poll} p INNER JOIN {node} n ON p.nid = n.nid WHERE (n.created + p.runtime) < '. time() .' AND p.active = 1 AND p.runtime != 0');
Dries's avatar
   
Dries committed
79
  while ($poll = db_fetch_object($result)) {
80
    db_query("UPDATE {poll} SET active = 0 WHERE nid = %d", $poll->nid);
Dries's avatar
   
Dries committed
81
  }
82
83
}

84
85
86
/**
 * Implementation of hook_delete().
 */
87
function poll_delete($node) {
88
  db_query("DELETE FROM {poll} WHERE nid = %d", $node->nid);
Dries's avatar
   
Dries committed
89
  db_query("DELETE FROM {poll_choices} WHERE nid = %d", $node->nid);
90
91
}

92
93
94
/**
 * Implementation of hook_validate().
 */
95
function poll_validate(&$node) {
96
97
98

  node_validate_title($node,t('You have to specify a question.'));

99
100
  if (isset($node->title)) {
    // Check for at least two options and validate amount of votes:
Steven Wittens's avatar
Steven Wittens committed
101
    $realchoices = 0;
102
103
    // Renumber fields
    $node->choice = array_values($node->choice);
Steven Wittens's avatar
Steven Wittens committed
104
105
106
    foreach ($node->choice as $i => $choice) {
      if ($choice['chtext'] != '') {
        $realchoices++;
107
      }
Steven Wittens's avatar
Steven Wittens committed
108
      if ($choice['chvotes'] < 0) {
Dries's avatar
   
Dries committed
109
        form_set_error("choice][$i][chvotes", t('Negative values are not allowed.'));
110
      }
111
    }
Dries's avatar
   
Dries committed
112

Steven Wittens's avatar
Steven Wittens committed
113
    if ($realchoices < 2) {
Dries's avatar
   
Dries committed
114
      form_set_error("choice][$realchoices][chtext", t('You must fill in at least two choices.'));
115
116
    }
  }
117
118
119
120

  $node->teaser = poll_teaser($node);
}

121
122
123
/**
 * Implementation of hook_form().
 */
Dries's avatar
   
Dries committed
124
function poll_form(&$node) {
Steven Wittens's avatar
Steven Wittens committed
125
  $admin = user_access('administer nodes');
126

127
  $form['title'] = array('#type' => 'textfield', '#title' => t('Question'), '#size' => 60, '#maxlength' => 128, '#required' => TRUE, '#default_value' => $node->title, '#weight' => -1);
128

Steven Wittens's avatar
Steven Wittens committed
129
130
131
  if (!isset($node->choices)) {
    $node->choices = max(2, count($node->choice) ? count($node->choice) : 5);
  }
Dries's avatar
   
Dries committed
132

133
  // User ticked 'need more choices'.
Steven Wittens's avatar
Steven Wittens committed
134
135
  if ($node->morechoices) {
    $node->choices *= 2;
136
137
  }

Steven Wittens's avatar
Steven Wittens committed
138
  // Poll choices
Dries's avatar
   
Dries committed
139
  $opts = drupal_map_assoc(range(2, $node->choices * 2 + 5));
140
  $form['choice'] = array('#type' => 'fieldset', '#title' => t('Choices'), '#prefix' => '<div class="poll-form">', '#suffix' => '</div>', '#tree' => TRUE);
141
  for ($a = 0; $a < $node->choices; $a++) {
142
    $form['choice'][$a]['chtext'] = array('#type' => 'textfield', '#title' => t('Choice %n', array('%n' => ($a + 1))), '#default_value' => $node->choice[$a]['chtext'], '#size' => 60, '#maxlength' => 127);
143
    if ($admin) {
144
      $form['choice'][$a]['chvotes'] = array('#type' => 'textfield', '#title' => t('Votes for choice %n', array('%n' => ($a + 1))), '#default_value' => (int)$node->choice[$a]['chvotes'], '#size' => 5, '#maxlength' => 7);
145
146
    }
  }
147
148
  $form['choices'] = array('#type' => 'hidden', '#value' => $node->choices);
  $form['morechoices'] = array('#type' => 'checkbox', '#title' => t('Need more choices'), '#return_value' => 1, '#default_value' => 0, '#description' => t("If the amount of boxes above isn't enough, check this box and click the Preview button below to add some more."));
Dries's avatar
   
Dries committed
149

Steven Wittens's avatar
Steven Wittens committed
150
  // Poll attributes
151
  $_duration = array(0 => t('Unlimited')) + drupal_map_assoc(array(86400, 172800, 345600, 604800, 1209600, 2419200, 4838400, 9676800, 31536000), "format_interval");
Steven Wittens's avatar
Steven Wittens committed
152
  $_active = array(0 => t('Closed'), 1 => t('Active'));
Dries's avatar
   
Dries committed
153

Steven Wittens's avatar
Steven Wittens committed
154
  if ($admin) {
155
156
    $form['settings'] = array('#type' => 'fieldset', '#title' => t('Settings'), '#suffix' => '</div>');
    $form['settings']['active'] = array('#type' => 'radios', '#title' => t('Poll status'), '#default_value' => isset($node->active) ? $node->active : 1, '#options' => $_active, '#description' => t('When a poll is closed, visitors can no longer vote for it.'));
Dries's avatar
   
Dries committed
157
  }
158
  $form['settings']['runtime'] = array('#type' => 'select', '#title' => t('Poll duration'), '#default_value' => $node->runtime ? $node->runtime : 0, '#options' => $_duration, '#description' => t('After this period, the poll will be closed automatically.'));
Dries's avatar
   
Dries committed
159

160
  return $form;
161
}
162

163
function poll_insert($node) {
Steven Wittens's avatar
Steven Wittens committed
164
  if (!user_access('administer nodes')) {
165
    // Make sure all votes are 0 initially
Steven Wittens's avatar
Steven Wittens committed
166
167
168
    foreach ($node->choice as $i => $choice) {
      $node->choice[$i]['chvotes'] = 0;
    }
169
170
    $node->active = 1;
  }
171

172
  db_query("INSERT INTO {poll} (nid, runtime, polled, active) VALUES (%d, %d, '', %d)", $node->nid, $node->runtime, $node->active);
Dries's avatar
   
Dries committed
173

Steven Wittens's avatar
Steven Wittens committed
174
175
176
  foreach ($node->choice as $choice) {
    if ($choice['chtext'] != '') {
      db_query("INSERT INTO {poll_choices} (nid, chtext, chvotes, chorder) VALUES (%d, '%s', %d, %d)", $node->nid, $choice['chtext'], $choice['chvotes'], $i++);
177
178
    }
  }
179
180
}

Dries's avatar
   
Dries committed
181
182
183
/**
 * Implementation of hook_menu().
 */
Dries's avatar
   
Dries committed
184
function poll_menu($may_cache) {
Dries's avatar
   
Dries committed
185
  $items = array();
Dries's avatar
   
Dries committed
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202

  if ($may_cache) {
    $items[] = array('path' => 'node/add/poll', 'title' => t('poll'),
      'access' => user_access('create polls'));
    $items[] = array('path' => 'poll', 'title' => t('polls'),
      'callback' => 'poll_page',
      'access' => user_access('access content'),
      'type' => MENU_SUGGESTED_ITEM);

    $items[] = array('path' => 'poll/vote',
      'title' => t('vote'),
      'callback' => 'poll_vote',
      'access' => user_access('vote on polls'),
      'type' => MENU_CALLBACK);
  }
  else {
    if (arg(0) == 'node' && is_numeric(arg(1))) {
203
      $node = node_load(arg(1));
Dries's avatar
   
Dries committed
204
205
206
207
208
209
210
211
212

      if ($node->type == 'poll' && $node->allowvotes) {
        $items[] = array('path' => 'node/'. arg(1) .'/results',
          'title' => t('results'),
          'callback' => 'poll_results',
          'access' => user_access('access content'),
          'weight' => 3,
          'type' => MENU_LOCAL_TASK);
      }
Steven Wittens's avatar
Steven Wittens committed
213
214
    }
  }
Dries's avatar
   
Dries committed
215

Dries's avatar
   
Dries committed
216
217
218
  return $items;
}

Steven Wittens's avatar
Steven Wittens committed
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
/**
 * Determine an adjusted user id, to allow for basic tracking of anonymous
 * users (IP-based).
 */
function poll_uid() {
  global $user;
  if ($user->uid) {
     // Pad the UID with underscores to allow a simple strstr() search
    $id = '_'. $user->uid .'_';
  }
  else {
    $id = $_SERVER['REMOTE_ADDR'];
  }
  return $id;
}

235
236
237
/**
 * Implementation of hook_load().
 */
238
239
function poll_load($node) {
  // Load the appropriate choices into the $node object
240
  $poll = db_fetch_object(db_query("SELECT runtime, polled, active FROM {poll} WHERE nid = %d", $node->nid));
Dries's avatar
   
Dries committed
241

242
  $result = db_query("SELECT chtext, chvotes, chorder FROM {poll_choices} WHERE nid = %d ORDER BY chorder", $node->nid);
Steven Wittens's avatar
Steven Wittens committed
243
244
  while ($choice = db_fetch_array($result)) {
    $poll->choice[$choice['chorder']] = $choice;
245
  }
Steven Wittens's avatar
Steven Wittens committed
246

Steven Wittens's avatar
Steven Wittens committed
247
248
249
  // Determine whether or not this user is allowed to vote
  $poll->allowvotes = false;
  if (user_access('vote on polls')) {
250
    if (!strstr($poll->polled, poll_uid())) {
Steven Wittens's avatar
Steven Wittens committed
251
252
253
      $poll->allowvotes = $poll->active;
    }
  }
254
255
  return $poll;
}
Dries's avatar
   
Dries committed
256

257
/**
258
 * Implementation of hook_node_info().
259
 */
260
function poll_node_info() {
261
  return array('poll' => array('name' => t("poll"), 'base' => 'poll'));
262
}
263

Steven Wittens's avatar
Steven Wittens committed
264
function poll_page() {
Steven Wittens's avatar
Steven Wittens committed
265
  // List all polls
266
  $sql = "SELECT n.nid, n.title, p.active, n.created, SUM(c.chvotes) AS votes FROM {node} n INNER JOIN {poll} p ON n.nid = p.nid INNER JOIN {poll_choices} c ON n.nid = c.nid WHERE n.status = 1 AND n.moderate = 0 GROUP BY n.nid, n.title, p.active, n.created ORDER BY n.created DESC";
267
  $sql = db_rewrite_sql($sql);
Dries's avatar
   
Dries committed
268
  $result = pager_query($sql, 15);
Steven Wittens's avatar
Steven Wittens committed
269
  $output = '<ul>';
Steven Wittens's avatar
Steven Wittens committed
270
  while ($node = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
271
    $output .= '<li>'. l($node->title, "node/$node->nid") .' - '. format_plural($node->votes, '1 vote', '%count votes') .' - '. ($node->active ? t('open') : t('closed')) .'</li>';
Steven Wittens's avatar
Steven Wittens committed
272
  }
Steven Wittens's avatar
Steven Wittens committed
273
274
  $output .= '</ul>';
  $output .= theme("pager", NULL, 15);
Dries's avatar
   
Dries committed
275
  return $output;
Steven Wittens's avatar
Steven Wittens committed
276
277
}

278
279
280
/**
 * Implementation of hook_perm().
 */
281
function poll_perm() {
Steven Wittens's avatar
Steven Wittens committed
282
  return array('create polls', 'vote on polls');
283
}
Dries's avatar
   
Dries committed
284

285
286
287
/**
 * Creates a simple teaser that lists all the choices.
 */
288
function poll_teaser($node) {
Dries's avatar
Dries committed
289
  if (is_array($node->choice)) {
Steven Wittens's avatar
Steven Wittens committed
290
291
    foreach ($node->choice as $k => $choice) {
      $teaser .= '* '. $choice['chtext'] .'\n';
292
293
294
295
    }
  }
  return $teaser;
}
296

Steven Wittens's avatar
Steven Wittens committed
297
/**
298
 * Generates the voting form for a poll.
Steven Wittens's avatar
Steven Wittens committed
299
 */
Dries's avatar
Dries committed
300
function poll_view_voting(&$node, $teaser, $page, $block) {
301
302
303
  if ($_POST['op'] == t('Vote')) {
    poll_vote($node);
  }
304

Dries's avatar
   
Dries committed
305
  if ($node->choice) {
Steven Wittens's avatar
Steven Wittens committed
306
307
    $list = array();
    foreach ($node->choice as $i => $choice) {
308
      $list[$i] = check_plain($choice['chtext']);
309
    }
310
    $form['choice'] = array('#type' => 'radios', '#title' => $page ? '' : check_plain($node->title), '#default_value' => -1, '#options' => $list);
Dries's avatar
   
Dries committed
311
  }
312
313
  $form['nid'] = array('#type' => 'hidden', '#value' => $node->nid);
  $form['vote'] = array('#type' => 'submit', '#value' => t('Vote'));
314
315
  return drupal_get_form('poll_view_voting', $form);
}
Steven Wittens's avatar
Steven Wittens committed
316

317
318
319
320
321
322
323
324
325
326
327
328
329
/**
 * Themes the voting form for a poll.
 */
function theme_poll_view_voting($form) {
  $output .= '<div class="poll">';
  $output .= '  <div class="vote-form">';
  $output .= '    <div class="choices">';
  $output .= form_render($form['choice']);
  $output .= '    </div>';
  $output .= form_render($form['nid']);
  $output .= form_render($form['vote']);
  $output .= '  </div>';
  $output .= form_render($form);
Steven Wittens's avatar
Steven Wittens committed
330
  $output .= '</div>';
Steven Wittens's avatar
Steven Wittens committed
331
332
333
  return $output;
}

334
335
336
/**
 * Generates a graphical representation of the results of a poll.
 */
Dries's avatar
Dries committed
337
function poll_view_results(&$node, $teaser, $page, $block) {
Steven Wittens's avatar
Steven Wittens committed
338
  // Count the votes and find the maximum
Steven Wittens's avatar
Steven Wittens committed
339
  foreach ($node->choice as $choice) {
340
341
    $total_votes += $choice['chvotes'];
    $max_votes = max($max_votes, $choice['chvotes']);
Steven Wittens's avatar
Steven Wittens committed
342
343
  }

Steven Wittens's avatar
Steven Wittens committed
344
345
  foreach ($node->choice as $i => $choice) {
    if ($choice['chtext'] != '') {
346
      $poll_results .= theme('poll_bar', check_plain($choice['chtext']), round($choice['chvotes'] * 100 / max($total_votes, 1)), format_plural($choice['chvotes'], '1 vote', '%count votes'), $block);
347
    }
348
  }
Dries's avatar
   
Dries committed
349

350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
  $output .= theme('poll_results', check_plain($node->title), $poll_results, $total_votes, $node->links, $block);

  return $output;
}

function theme_poll_results($title, $results, $votes, $links, $block) {
  if ($block) {
    $output .= '<div class="poll">';
    $output .= '<div class="title">'. $title .'</div>';
    $output .= $results;
    $output .= '<div class="total">'. t('Total votes: %votes', array('%votes' => $votes)) .'</div>';
    $output .= '</div>';
    $output .= '<div class="links">'. theme('links', $links) .'</div>';
  }
  else {
    $output .= '<div class="poll">';
    $output .= $results;
    $output .= '<div class="total">'. t('Total votes: %votes', array('%votes' => $votes)) .'</div>';
    $output .= '</div>';
  }

  return $output;
}

function theme_poll_bar($title, $percentage, $votes, $block) {
  if ($block) {
    $output  = '<div class="text">'. $title .'</div>';
    $output .= '<div class="bar"><div style="width: '. $percentage .'%;" class="foreground"></div></div>';
    $output .= '<div class="percent">'. $percentage .'%</div>';
  }
  else {
    $output  = '<div class="text">'. $title .'</div>';
    $output .= '<div class="bar"><div style="width: '. $percentage .'%;" class="foreground"></div></div>';
    $output .= '<div class="percent">'. $percentage .'% ('. $votes .')</div>';
  }
Steven Wittens's avatar
Steven Wittens committed
385
386
387
388

  return $output;
}

Steven Wittens's avatar
Steven Wittens committed
389
390
391
392
/**
 * Callback for the 'results' tab for polls you can vote on
 */
function poll_results() {
393
  if ($node = node_load(arg(1))) {
394
    drupal_set_title(check_plain($node->title));
Dries's avatar
   
Dries committed
395
    return node_show($node, 0);
Steven Wittens's avatar
Steven Wittens committed
396
397
398
399
400
401
402
403
404
405
  }
  else {
    drupal_not_found();
  }
}

/**
 * Callback for processing a vote
 */
function poll_vote(&$node) {
406
  $nid = arg(1);
407
  if ($node = node_load($nid)) {
Steven Wittens's avatar
Steven Wittens committed
408
409
410
    $edit = $_POST['edit'];
    $choice = $edit['choice'];
    $vote = $_POST['vote'];
Steven Wittens's avatar
Steven Wittens committed
411
412
413
414

    if (isset($choice) && isset($node->choice[$choice])) {
      if ($node->allowvotes) {
        $id = poll_uid();
415
        $node->polled = $node->polled ? ($node->polled .' '. $id) : $id;
416
        db_query("UPDATE {poll} SET polled = '%s' WHERE nid = %d", $node->polled, $node->nid);
Steven Wittens's avatar
Steven Wittens committed
417
418
419
        db_query("UPDATE {poll_choices} SET chvotes = chvotes + 1 WHERE nid = %d AND chorder = %d", $node->nid, $choice);
        $node->allowvotes = false;
        $node->choice[$choice]['chvotes']++;
Dries's avatar
   
Dries committed
420
        drupal_set_message(t('Your vote was recorded.'));
Steven Wittens's avatar
Steven Wittens committed
421
422
      }
      else {
Dries's avatar
   
Dries committed
423
        drupal_set_message(t("You're not allowed to vote on this poll."), 'error');
Steven Wittens's avatar
Steven Wittens committed
424
425
426
      }
    }
    else {
Dries's avatar
   
Dries committed
427
      drupal_set_message(t("You didn't specify a valid poll choice."), 'error');
Steven Wittens's avatar
Steven Wittens committed
428
    }
Steven Wittens's avatar
Steven Wittens committed
429
430
431
432
433

    drupal_goto('node/'. $nid);
  }
  else {
    drupal_not_found();
Steven Wittens's avatar
Steven Wittens committed
434
435
436
  }
}

437
438
439
440
441
442
443
/**
 * Implementation of hook_view().
 *
 * @param $block
 *   An extra parameter that adapts the hook to display a block-ready
 *   rendering of the poll.
 */
Dries's avatar
   
Dries committed
444
function poll_view(&$node, $teaser = FALSE, $page = FALSE, $block = FALSE) {
Dries's avatar
   
Dries committed
445
  global $user;
Dries's avatar
   
Dries committed
446
  $output = '';
Steven Wittens's avatar
Steven Wittens committed
447

Steven Wittens's avatar
Steven Wittens committed
448
  // Special display for side-block
Steven Wittens's avatar
Steven Wittens committed
449
  if ($block) {
Steven Wittens's avatar
Steven Wittens committed
450
451
    // No 'read more' link
    $node->body = $node->teaser = '';
Steven Wittens's avatar
Steven Wittens committed
452

Dries's avatar
Dries committed
453
    $links = module_invoke_all('link', 'node', $node, 1);
Steven Wittens's avatar
Steven Wittens committed
454
    $links[] = l(t('older polls'), 'poll', array('title' => t('View the list of polls on this site.')));
Steven Wittens's avatar
Steven Wittens committed
455
456
457
    if ($node->allowvotes && $block) {
      $links[] = l(t('results'), 'node/'. $node->nid .'/results', array('title' => t('View the current poll results.')));
    }
Steven Wittens's avatar
Steven Wittens committed
458

459
460
461
462
463
464
465
466
    $node->links = $links;
  }

  if ($node->allowvotes && ($block || arg(2) != 'results')) {
    $output .= poll_view_voting($node, $teaser, $page, $block);
  }
  else {
    $output .= poll_view_results($node, $teaser, $page, $block);
Steven Wittens's avatar
Steven Wittens committed
467
468
469
  }

  $node->body = $node->teaser = $output;
470
471
}

472
473
474
/**
 * Implementation of hook_update().
 */
475
function poll_update($node) {
Steven Wittens's avatar
Steven Wittens committed
476
  db_query('UPDATE {poll} SET runtime = %d, active = %d WHERE nid = %d', $node->runtime, $node->active, $node->nid);
477

Steven Wittens's avatar
Steven Wittens committed
478
479
480
481
  db_query('DELETE FROM {poll_choices} WHERE nid = %d', $node->nid);
  foreach ($node->choice as $choice) {
    $chvotes = (int)$choice['chvotes'];
    $chtext = $choice['chtext'];
482

Steven Wittens's avatar
Steven Wittens committed
483
484
    if ($chtext != '') {
      db_query("INSERT INTO {poll_choices} (nid, chtext, chvotes, chorder) VALUES (%d, '%s', %d, %d)", $node->nid, $chtext, $chvotes, $i++);
485
    }
486
  }
487
}