poll.module 16.5 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
95
96
97
98
99
/**
 * Implementation of hook_execute().
 */
function poll_execute(&$node) {
  // 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'), '#size' => 60, '#maxlength' => 128, '#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'], '#size' => 60, '#maxlength' => 127);
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
154
  $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
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) {
Dries's avatar
Dries committed
295
  if (is_array($node->choice)) {
Steven Wittens's avatar
Steven Wittens committed
296
297
    foreach ($node->choice as $k => $choice) {
      $teaser .= '* '. $choice['chtext'] .'\n';
298
299
300
301
    }
  }
  return $teaser;
}
302

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

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

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

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

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

  return $output;
}

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

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

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

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

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

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

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

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

  $node->body = $node->teaser = $output;
476
477
}

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

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

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