poll.module 16.4 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
 * Implementation of hook_submit().
94
 */
95
function poll_submit(&$node) {
96
97
98
99
  // Renumber fields
  $node->choice = array_values($node->choice);
  $node->teaser = poll_teaser($node);
}
Dries's avatar
Dries committed
100

101
102
103
/**
 * Implementation of hook_validate().
 */
104
105
function poll_validate($node) {
  node_validate_title($node, t('You have to specify a question.'));
106

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

Steven Wittens's avatar
Steven Wittens committed
121
    if ($realchoices < 2) {
Dries's avatar
   
Dries committed
122
      form_set_error("choice][$realchoices][chtext", t('You must fill in at least two choices.'));
123
124
    }
  }
125
126
}

127
128
129
/**
 * Implementation of hook_form().
 */
Dries's avatar
   
Dries committed
130
function poll_form(&$node) {
Steven Wittens's avatar
Steven Wittens committed
131
  $admin = user_access('administer nodes');
132

133
  $form['title'] = array('#type' => 'textfield', '#title' => t('Question'), '#required' => TRUE, '#default_value' => $node->title, '#weight' => -1);
134

Steven Wittens's avatar
Steven Wittens committed
135
136
137
  if (!isset($node->choices)) {
    $node->choices = max(2, count($node->choice) ? count($node->choice) : 5);
  }
Dries's avatar
   
Dries committed
138

139
  // User ticked 'need more choices'.
140
  if ($_POST['edit']['morechoices']) {
Steven Wittens's avatar
Steven Wittens committed
141
    $node->choices *= 2;
142
143
  }

Steven Wittens's avatar
Steven Wittens committed
144
  // Poll choices
Dries's avatar
   
Dries committed
145
  $opts = drupal_map_assoc(range(2, $node->choices * 2 + 5));
146
  $form['choice'] = array('#type' => 'fieldset', '#title' => t('Choices'), '#prefix' => '<div class="poll-form">', '#suffix' => '</div>', '#tree' => TRUE);
147
  for ($a = 0; $a < $node->choices; $a++) {
148
    $form['choice'][$a]['chtext'] = array('#type' => 'textfield', '#title' => t('Choice %n', array('%n' => ($a + 1))), '#default_value' => $node->choice[$a]['chtext']);
149
    if ($admin) {
150
      $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);
151
152
    }
  }
153
  $form['choices'] = array('#type' => 'hidden', '#value' => $node->choices);
154
  $form['morechoices'] = array('#type' => 'checkbox', '#title' => t('Need more choices'), '#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
155

Steven Wittens's avatar
Steven Wittens committed
156
  // Poll attributes
157
  $_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
158
  $_active = array(0 => t('Closed'), 1 => t('Active'));
Dries's avatar
   
Dries committed
159

Steven Wittens's avatar
Steven Wittens committed
160
  if ($admin) {
161
162
    $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
163
  }
164
  $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
165

166
  return $form;
167
}
168

169
function poll_insert($node) {
Steven Wittens's avatar
Steven Wittens committed
170
  if (!user_access('administer nodes')) {
171
    // Make sure all votes are 0 initially
Steven Wittens's avatar
Steven Wittens committed
172
173
174
    foreach ($node->choice as $i => $choice) {
      $node->choice[$i]['chvotes'] = 0;
    }
175
176
    $node->active = 1;
  }
177

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

Steven Wittens's avatar
Steven Wittens committed
180
181
182
  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++);
183
184
    }
  }
185
186
}

Dries's avatar
   
Dries committed
187
188
189
/**
 * Implementation of hook_menu().
 */
Dries's avatar
   
Dries committed
190
function poll_menu($may_cache) {
Dries's avatar
   
Dries committed
191
  $items = array();
Dries's avatar
   
Dries committed
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208

  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))) {
209
      $node = node_load(arg(1));
Dries's avatar
   
Dries committed
210
211
212
213
214
215
216
217
218

      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
219
220
    }
  }
Dries's avatar
   
Dries committed
221

Dries's avatar
   
Dries committed
222
223
224
  return $items;
}

Steven Wittens's avatar
Steven Wittens committed
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
/**
 * 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;
}

241
242
243
/**
 * Implementation of hook_load().
 */
244
245
function poll_load($node) {
  // Load the appropriate choices into the $node object
246
  $poll = db_fetch_object(db_query("SELECT runtime, polled, active FROM {poll} WHERE nid = %d", $node->nid));
Dries's avatar
   
Dries committed
247

248
  $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
249
250
  while ($choice = db_fetch_array($result)) {
    $poll->choice[$choice['chorder']] = $choice;
251
  }
Steven Wittens's avatar
Steven Wittens committed
252

Steven Wittens's avatar
Steven Wittens committed
253
254
255
  // Determine whether or not this user is allowed to vote
  $poll->allowvotes = false;
  if (user_access('vote on polls')) {
256
    if (!strstr($poll->polled, poll_uid())) {
Steven Wittens's avatar
Steven Wittens committed
257
258
259
      $poll->allowvotes = $poll->active;
    }
  }
260
261
  return $poll;
}
Dries's avatar
   
Dries committed
262

263
/**
264
 * Implementation of hook_node_info().
265
 */
266
function poll_node_info() {
267
  return array('poll' => array('name' => t("poll"), 'base' => 'poll'));
268
}
269

Steven Wittens's avatar
Steven Wittens committed
270
function poll_page() {
Steven Wittens's avatar
Steven Wittens committed
271
  // List all polls
272
  $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";
273
  $sql = db_rewrite_sql($sql);
Dries's avatar
   
Dries committed
274
  $result = pager_query($sql, 15);
Steven Wittens's avatar
Steven Wittens committed
275
  $output = '<ul>';
Steven Wittens's avatar
Steven Wittens committed
276
  while ($node = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
277
    $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
278
  }
Steven Wittens's avatar
Steven Wittens committed
279
280
  $output .= '</ul>';
  $output .= theme("pager", NULL, 15);
Dries's avatar
   
Dries committed
281
  return $output;
Steven Wittens's avatar
Steven Wittens committed
282
283
}

284
285
286
/**
 * Implementation of hook_perm().
 */
287
function poll_perm() {
Steven Wittens's avatar
Steven Wittens committed
288
  return array('create polls', 'vote on polls');
289
}
Dries's avatar
   
Dries committed
290

291
292
293
/**
 * Creates a simple teaser that lists all the choices.
 */
294
function poll_teaser($node) {
295
  $teaser = NULL;
Dries's avatar
Dries committed
296
  if (is_array($node->choice)) {
Steven Wittens's avatar
Steven Wittens committed
297
298
    foreach ($node->choice as $k => $choice) {
      $teaser .= '* '. $choice['chtext'] .'\n';
299
300
301
302
    }
  }
  return $teaser;
}
303

Steven Wittens's avatar
Steven Wittens committed
304
/**
305
 * Generates the voting form for a poll.
Steven Wittens's avatar
Steven Wittens committed
306
 */
Dries's avatar
Dries committed
307
function poll_view_voting(&$node, $teaser, $page, $block) {
308
309
310
  if ($_POST['op'] == t('Vote')) {
    poll_vote($node);
  }
311

Dries's avatar
   
Dries committed
312
  if ($node->choice) {
Steven Wittens's avatar
Steven Wittens committed
313
314
    $list = array();
    foreach ($node->choice as $i => $choice) {
315
      $list[$i] = check_plain($choice['chtext']);
316
    }
317
    $form['choice'] = array('#type' => 'radios', '#title' => $page ? '' : check_plain($node->title), '#default_value' => -1, '#options' => $list);
Dries's avatar
   
Dries committed
318
  }
319
320
  $form['nid'] = array('#type' => 'hidden', '#value' => $node->nid);
  $form['vote'] = array('#type' => 'submit', '#value' => t('Vote'));
321
  $form['#action'] = url('node/'. $node->nid);
322
323
  return drupal_get_form('poll_view_voting', $form);
}
Steven Wittens's avatar
Steven Wittens committed
324

325
326
327
328
329
330
331
332
333
334
335
336
337
/**
 * 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
338
  $output .= '</div>';
Steven Wittens's avatar
Steven Wittens committed
339
340
341
  return $output;
}

342
343
344
/**
 * Generates a graphical representation of the results of a poll.
 */
Dries's avatar
Dries committed
345
function poll_view_results(&$node, $teaser, $page, $block) {
Steven Wittens's avatar
Steven Wittens committed
346
  // Count the votes and find the maximum
Steven Wittens's avatar
Steven Wittens committed
347
  foreach ($node->choice as $choice) {
348
349
    $total_votes += $choice['chvotes'];
    $max_votes = max($max_votes, $choice['chvotes']);
Steven Wittens's avatar
Steven Wittens committed
350
351
  }

Steven Wittens's avatar
Steven Wittens committed
352
353
  foreach ($node->choice as $i => $choice) {
    if ($choice['chtext'] != '') {
354
      $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);
355
    }
356
  }
Dries's avatar
   
Dries committed
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
385
386
387
388
389
390
391
392
  $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
393
394
395
396

  return $output;
}

Steven Wittens's avatar
Steven Wittens committed
397
398
399
400
/**
 * Callback for the 'results' tab for polls you can vote on
 */
function poll_results() {
401
  if ($node = node_load(arg(1))) {
402
    drupal_set_title(check_plain($node->title));
Dries's avatar
   
Dries committed
403
    return node_show($node, 0);
Steven Wittens's avatar
Steven Wittens committed
404
405
406
407
408
409
410
411
412
413
  }
  else {
    drupal_not_found();
  }
}

/**
 * Callback for processing a vote
 */
function poll_vote(&$node) {
414
  $nid = arg(1);
415
  if ($node = node_load($nid)) {
Steven Wittens's avatar
Steven Wittens committed
416
417
418
    $edit = $_POST['edit'];
    $choice = $edit['choice'];
    $vote = $_POST['vote'];
Steven Wittens's avatar
Steven Wittens committed
419
420
421
422

    if (isset($choice) && isset($node->choice[$choice])) {
      if ($node->allowvotes) {
        $id = poll_uid();
423
        $node->polled = $node->polled ? ($node->polled .' '. $id) : $id;
424
        db_query("UPDATE {poll} SET polled = '%s' WHERE nid = %d", $node->polled, $node->nid);
Steven Wittens's avatar
Steven Wittens committed
425
426
427
        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
428
        drupal_set_message(t('Your vote was recorded.'));
Steven Wittens's avatar
Steven Wittens committed
429
430
      }
      else {
Dries's avatar
   
Dries committed
431
        drupal_set_message(t("You're not allowed to vote on this poll."), 'error');
Steven Wittens's avatar
Steven Wittens committed
432
433
434
      }
    }
    else {
Dries's avatar
   
Dries committed
435
      drupal_set_message(t("You didn't specify a valid poll choice."), 'error');
Steven Wittens's avatar
Steven Wittens committed
436
    }
Steven Wittens's avatar
Steven Wittens committed
437
438
439
440
441

    drupal_goto('node/'. $nid);
  }
  else {
    drupal_not_found();
Steven Wittens's avatar
Steven Wittens committed
442
443
444
  }
}

445
446
447
448
449
450
451
/**
 * 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
452
function poll_view(&$node, $teaser = FALSE, $page = FALSE, $block = FALSE) {
Dries's avatar
   
Dries committed
453
  global $user;
Dries's avatar
   
Dries committed
454
  $output = '';
Steven Wittens's avatar
Steven Wittens committed
455

Steven Wittens's avatar
Steven Wittens committed
456
  // Special display for side-block
Steven Wittens's avatar
Steven Wittens committed
457
  if ($block) {
Steven Wittens's avatar
Steven Wittens committed
458
459
    // No 'read more' link
    $node->body = $node->teaser = '';
Steven Wittens's avatar
Steven Wittens committed
460

Dries's avatar
Dries committed
461
    $links = module_invoke_all('link', 'node', $node, 1);
Steven Wittens's avatar
Steven Wittens committed
462
    $links[] = l(t('older polls'), 'poll', array('title' => t('View the list of polls on this site.')));
Steven Wittens's avatar
Steven Wittens committed
463
464
465
    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
466

467
468
469
470
471
472
473
474
    $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
475
476
477
  }

  $node->body = $node->teaser = $output;
478
479
}

480
481
482
/**
 * Implementation of hook_update().
 */
483
function poll_update($node) {
Steven Wittens's avatar
Steven Wittens committed
484
  db_query('UPDATE {poll} SET runtime = %d, active = %d WHERE nid = %d', $node->runtime, $node->active, $node->nid);
485

Steven Wittens's avatar
Steven Wittens committed
486
487
488
489
  db_query('DELETE FROM {poll_choices} WHERE nid = %d', $node->nid);
  foreach ($node->choice as $choice) {
    $chvotes = (int)$choice['chvotes'];
    $chtext = $choice['chtext'];
490

Steven Wittens's avatar
Steven Wittens committed
491
492
    if ($chtext != '') {
      db_query("INSERT INTO {poll_choices} (nid, chtext, chvotes, chorder) VALUES (%d, '%s', %d, %d)", $node->nid, $chtext, $chvotes, $i++);
493
    }
494
  }
495
}