function advpoll_voting_ranking_form_validate in Advanced Poll 6.2
Same name and namespace in other branches
- 5 modes/ranking.inc \advpoll_voting_ranking_form_validate()
- 6.3 modes/ranking.inc \advpoll_voting_ranking_form_validate()
- 6 modes/ranking.inc \advpoll_voting_ranking_form_validate()
Implementation of the vote validation hook for the runoff module.
This checks if the submitted values are within range, if they are not empty, and if they are not repeated.
@returns boolean false on invalid forms, true otherwise.
File
- modes/
ranking.inc, line 734 - Handle ranking votes, e.g. choice A is preferred over choice B, which in turn is preferred over choice C.
Code
function advpoll_voting_ranking_form_validate($form, &$form_state) {
$node = $form['#node'];
$ajax = $form_state['values']['ajax'];
// Check if user is eligible to vote.
if (!advpoll_eligible($node)) {
_advpoll_form_set_error('choice[', t('You are not allowed to vote in this poll.'), $ajax);
}
// Check if poll is active.
if (!_advpoll_is_active($node)) {
_advpoll_form_set_error('choice[', t('This poll is closed.'), $ajax);
}
// Whether the write-in option is selected.
$writein_option = FALSE;
$writein_text = isset($form_state['values']['writein_key']) ? $form_state['values']['writein_choice'] : '';
// Check if user has already voted.
list($voted, $cancel_vote) = _advpoll_user_voted($node->nid);
if ($voted) {
_advpoll_form_set_error('choice[', t('You have already voted in this poll.'), $ajax);
// Redirect to the current poll node to view the poll result instead of the voting form. This is only
// initiated for non-Ajax voting.
drupal_goto('node/' . $node->nid);
}
// Array used to check which values are set.
$set_values = array();
$num_choices = 0;
// Write-ins are enabled, user has permission, and the write-in box is checked.
if ($node->writeins && user_access('add write-ins') && $form_state['values']['choice'][$form_state['values']['writein_key']]) {
$num_choices++;
// Set a flag for additional checks.
$writein_option = TRUE;
}
foreach ($node->choice as $key => $choice) {
// Count the number of choices that are ranked.
if ($form_state['values']['choice'][$key]) {
$num_choices++;
}
$int_value = intval($form_state['values']['choice'][$key]);
// Mark this value as seen
isset($set_values[$int_value]) ? $set_values[$int_value]++ : ($set_values[$int_value] = 1);
// Check range
if ($int_value > count($node->choice) || $int_value < 0) {
// TODO: clean up this error message
$message = "Illegal rank for choice {$key}: {$int_value} (min: 1, max: " . count($node->choice) . ')';
_advpoll_form_set_error('choice][' . $key, $message, $ajax);
}
}
// Write-ins are enabled, user has permission, and the write-in box is checked.
if ($writein_option) {
$int_value = intval($form_state['values']['choice'][$form_state['values']['writein_key']]);
// Mark this value as seen
$set_values[$int_value]++;
// Check range
if ($int_value > count($node->choice) || $int_value < 0) {
// TODO: clean up this error message
$message = "Illegal rank for the write-in choice: {$int_value} (min: 1, max: " . count($node->choice) . ')';
_advpoll_form_set_error('choice][' . $form_state['values']['writein_key'], $message, $ajax);
}
}
// Do validation specific to writeins.
_advpoll_writeins_voting_form_validate($node, $writein_option, $writein_text, $ajax);
// Too many choices ranked.
if ($node->max_choices != 0 && $num_choices > $node->max_choices) {
$message = t('%num choices were selected but only %max are allowed.', array(
'%num' => $num_choices,
'%max' => $node->max_choices,
));
_advpoll_form_set_error('choice', $message, $ajax);
}
// Not enough choices ranked.
$min_choices = 1;
if ($num_choices < $min_choices) {
_advpoll_form_set_error('choice', t('At least one choice must be selected.'), $ajax);
}
// Check that multiple choices are not set to the same value.
foreach ($set_values as $val => $count) {
if ($val != 0 && $count > 1) {
$message = t('Multiple choices given the rank of %value.', array(
'%value' => $val,
));
_advpoll_form_set_error('choice', $message, $ajax);
}
}
}