function advpoll_form in Advanced Poll 5
Same name and namespace in other branches
- 6.3 advpoll.module \advpoll_form()
- 6 advpoll.module \advpoll_form()
- 6.2 advpoll.module \advpoll_form()
Implementation of hook_form().
This hook displays the form necessary to create/edit the poll.
File
- ./
advpoll.module, line 245 - Advanced Poll - a sophisticated polling module for voting, elections, and group decision-making.
Code
function advpoll_form($node, $form_values = NULL) {
$mode = _advpoll_get_mode($node->type);
$type = node_get_types('type', $node);
$editing = isset($node->nid);
$form = array();
// Only add javascript once, even if _form is called multiple times.
static $add_js;
if (!$add_js) {
// Pass translatable strings
drupal_add_js(array(
'advPoll' => array(
'remove' => t('Remove'),
'addChoice' => t('Add choice'),
'noLimit' => t('No limit'),
),
), 'setting');
drupal_add_js(drupal_get_path('module', 'advpoll') . '/advpoll-form.js', 'module');
drupal_add_css(drupal_get_path('module', 'advpoll') . '/advpoll.css', 'module');
$add_js = TRUE;
}
$form['title'] = array(
'#type' => 'textfield',
'#title' => check_plain($type->title_label),
'#required' => TRUE,
'#default_value' => $node->title,
);
$form['body_filter']['body'] = array(
'#type' => 'textarea',
'#title' => check_plain($type->body_label),
'#required' => FALSE,
'#default_value' => $node->body,
);
$form['body_filter']['format'] = filter_form($node->format);
if (isset($form_values)) {
$choices = $form_values['choices'];
if ($form_values['more_choices']) {
$choices *= 2;
}
}
else {
$choices = max(2, count($node->choice) ? count($node->choice) : ADVPOLL_INITIAL_CHOICES);
}
if (variable_get('advpoll_use_question_' . $type->type, ADVPOLL_USE_QUESTION) || isset($node->question) && $node->question !== '') {
$form['question'] = array(
'#type' => 'textfield',
'#title' => t('Question'),
'#default_value' => $node->question,
'#maxlength' => 255,
);
}
$form['choices'] = array(
'#type' => 'hidden',
'#value' => $choices,
);
// Advanced Poll choices
$form['choice'] = array(
'#type' => 'fieldset',
'#title' => t('Poll choices'),
'#collapsible' => TRUE,
'#prefix' => '<div class="poll-form">',
'#suffix' => '</div>',
'#tree' => TRUE,
'#weight' => 1,
);
if ($editing) {
$form['choice']['choice_note'] = array(
'#value' => '<div id="edit-settings-choice-note" class="description">' . t('Note: adding or removing choices after voting has begun is not recommended.') . '</div>',
);
}
$default_choices = variable_get('advpoll_choices_' . $type->type, '');
if (!$editing) {
// This is a new poll so show a textarea for quick entry.
$form['choice']['choice_area'] = array(
'#type' => 'textarea',
'#title' => t('Choices'),
'#parents' => array(
'choice_area',
),
'#description' => t('Enter one choice per line.'),
'#default_value' => $default_choices,
);
}
else {
$form['choice']['more_choices'] = array(
'#type' => 'checkbox',
'#title' => t('Need more choices'),
'#value' => 0,
'#parents' => array(
'more_choices',
),
// Don't pollute $form['choice']
'#prefix' => '<div id="more-choices">',
'#suffix' => '</div>',
'#description' => t("If the number of choices above isn't enough, check this box and click the Preview button below to double the number of choices."),
'#weight' => 1,
);
// First, loop through any currently existing choices.
$current_choices = 0;
if (isset($node->choice)) {
foreach ($node->choice as $index => $choice) {
$form['choice'][$index]['label'] = array(
'#type' => 'textfield',
'#title' => t('Choice %n', array(
'%n' => $current_choices + 1,
)) . ($choice['writein'] ? ' ' . t('(write-in)') : ''),
'#default_value' => $choice['label'],
'#attributes' => array(
'class' => 'choices',
),
'#maxlength' => variable_get('advpoll_choice_max_length', ADVPOLL_CHOICE_MAX_LENGTH),
);
$current_choices++;
$next_index = $index + 1;
}
}
elseif ($default_choices != '') {
$default_choices = explode("\n", $default_choices);
foreach ($default_choices as $index => $label) {
$form['choice'][$index]['label'] = array(
'#type' => 'textfield',
'#title' => t('Choice %n', array(
'%n' => $current_choices + 1,
)),
'#default_value' => $label,
'#attributes' => array(
'class' => 'choices',
),
);
$current_choices++;
$next_index = $index + 1;
}
}
else {
$next_index = 1;
}
// Now add on extra choices if we need to.
if ($current_choices < $choices) {
for ($index = $next_index; $current_choices < $choices; $index++, $current_choices++) {
$form['choice'][$index]['label'] = array(
'#type' => 'textfield',
'#title' => t('Choice %n', array(
'%n' => $current_choices + 1,
)),
'#attributes' => array(
'class' => 'choices',
),
'#maxlength' => variable_get('advpoll_choice_max_length', ADVPOLL_CHOICE_MAX_LENGTH),
);
}
}
}
$form['settings'] = array(
'#type' => 'fieldset',
'#title' => t('Poll settings'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#weight' => 2,
'#tree' => TRUE,
);
$max_choice_list = array();
for ($i = 0; $i <= $choices; $i++) {
$max_choice_list[$i] = $i == 0 ? t('No limit') : $i;
}
$form['settings']['max_choices'] = array(
'#type' => 'select',
'#title' => t('Maximum choices'),
'#default_value' => isset($node->max_choices) ? $node->max_choices : variable_get('advpoll_max_choices_' . $type->type, ADVPOLL_MAX_CHOICES),
'#options' => $max_choice_list,
'#DANGEROUS_SKIP_CHECK' => TRUE,
// Allow jQuery to add new options
'#description' => t('Limits the total number of choices voters may select.'),
);
$voting_algorithms = advpoll_algorithms($mode);
if (count($voting_algorithms) > 1) {
// Create a select field when the poll supports several algorithms.
$form['settings']['algorithm'] = array(
'#type' => 'select',
'#title' => t('Algorithm'),
'#options' => $voting_algorithms,
'#default_value' => isset($node->algorithm) ? $node->algorithm : variable_get('advpoll_algorithm_' . $type->type, key($voting_algorithms)),
'#description' => t('Voting algorithm to use to calculate the winner.'),
);
}
else {
// Pass the only algorithm as a value.
$form['settings']['algorithm'] = array(
'#type' => 'value',
'#value' => key($voting_algorithms),
);
}
$form['settings']['close'] = array(
'#type' => 'checkbox',
'#title' => t('Close poll'),
'#description' => t('When a poll is closed users may no longer vote on it.'),
'#default_value' => isset($node->active) ? !$node->active : 0,
);
$default_start_date = '';
$default_end_date = '';
$time = format_date(time(), 'custom', 'Y-m-d H:i:s O');
// Specify default dates if default duration is set and we are creating a node.
if (variable_get('advpoll_runtime_' . $type->type, FALSE) && !$editing) {
$default_start_date = $time;
$default_end_date = format_date(time() + variable_get('advpoll_runtime_' . $type->type, ''), 'custom', 'Y-m-d H:i:s O');
}
$form['settings']['start_date'] = array(
'#type' => 'textfield',
'#title' => t('Starting date'),
'#description' => t('The date that the poll opens. Format: %time. Leave blank if you want the poll to open now.', array(
'%time' => $time,
)),
'#size' => 25,
'#maxlength' => 25,
// Use !empty() because 0 signifies that no date should be used.
'#default_value' => !empty($node->start_date) ? format_date($node->start_date, 'custom', 'Y-m-d H:i:s O') : $default_start_date,
);
$form['settings']['end_date'] = array(
'#type' => 'textfield',
'#title' => t('Ending date'),
'#description' => t('The date that the poll closes. Format: %time. Leave blank if you do not want the poll to close automatically.', array(
'%time' => $time,
)),
'#size' => 25,
'#maxlength' => 25,
// Use !empty() because 0 signifies that no date should be used.
'#default_value' => !empty($node->end_date) ? format_date($node->end_date, 'custom', 'Y-m-d H:i:s O') : $default_end_date,
);
// Settings available for users with 'administer polls' permission.
$default_use_list = isset($node->use_list) ? $node->use_list : variable_get('advpoll_electoral_list_' . $type->type, ADVPOLL_ELECTORAL_LIST);
$default_show_votes = isset($node->show_votes) ? $node->show_votes : variable_get('advpoll_show_votes_' . $type->type, ADVPOLL_SHOW_VOTES);
$default_writeins = isset($node->writeins) ? $node->writeins : variable_get('advpoll_writeins_' . $type->type, ADVPOLL_WRITEINS);
$default_show_writeins = isset($node->show_writeins) ? $node->show_writeins : variable_get('advpoll_show_writeins_' . $type->type, ADVPOLL_SHOW_WRITEINS);
if (user_access('administer polls')) {
$form['settings']['admin_note'] = array(
'#value' => '<div id="edit-settings-admin-note" class="description">' . t('The settings below are only available for users with the <em>administer polls</em> permission.') . '</div>',
);
$form['settings']['writeins'] = array(
'#type' => 'checkbox',
'#title' => t('Allow users to cast a write-in vote'),
'#default_value' => $default_writeins,
'#description' => t('Allow voters with the "add write-ins" permission to write-in up to one choice each.'),
'#attributes' => array(
'class' => 'settings-writeins',
),
);
$form['settings']['show_writeins'] = array(
'#type' => 'checkbox',
'#title' => t('Display write-in votes as choices for future voters'),
'#default_value' => $default_show_writeins,
'#description' => t('Allow voters to see and choose from previously submitted write-in votes.'),
'#prefix' => '<div class="edit-settings-show-writeins">',
'#suffix' => '</div>',
);
$form['settings']['use_list'] = array(
'#type' => 'checkbox',
'#title' => t('Restrict voting to electoral list'),
'#description' => t('If enabled, a list of eligible voters will be created and only that group will be able to vote in the poll.'),
'#default_value' => $default_use_list,
);
$form['settings']['show_votes'] = array(
'#type' => 'checkbox',
'#title' => t('Show individual votes'),
'#description' => t('Users with the appropriate permissions will be able to see how each person voted.'),
'#default_value' => $default_show_votes,
);
// Only show when editing a poll, not creating.
if ($editing) {
$form['settings']['reset'] = array(
'#type' => 'button',
'#value' => t('Reset votes'),
);
}
}
else {
// Just pass the values for users without the "administer polls" permission.
$defaults = array(
'use_list' => $default_use_list,
'show_votes' => $default_show_votes,
'writeins' => $default_writeins,
'show_writeins' => $default_show_writeins,
);
foreach ($defaults as $name => $value) {
$form['settings'][$name] = array(
'#type' => 'value',
'#value' => $value,
);
}
}
$form['#multistep'] = TRUE;
return $form;
}