You are here

function multichoice_form in Quiz 5.2

Same name and namespace in other branches
  1. 5 multichoice.module \multichoice_form()
  2. 6.6 question_types/multichoice/multichoice.module \multichoice_form()
  3. 6.2 multichoice.module \multichoice_form()
  4. 6.3 question_types/multichoice/multichoice.module \multichoice_form()
  5. 6.5 question_types/multichoice/multichoice.module \multichoice_form()

Implementation of hook_form().

File

./multichoice.module, line 91
Multiple choice question type for the Quiz module.

Code

function multichoice_form(&$node) {

  // Quiz ID used here to tie creation of a question to a specific quiz.
  $quiz_id = arg(3);
  if (!empty($quiz_id)) {
    $quiz = node_load((int) $quiz_id);
    $form['quiz_id'] = array(
      '#type' => 'value',
      '#value' => $quiz_id,
    );
    $form['quiz_vid'] = array(
      '#type' => 'value',
      '#value' => $quiz->vid,
    );
  }

  // Display the multichoice form.
  // Allow user to set title?
  if (user_access('allow user titles')) {
    $form['title'] = array(
      '#type' => 'textfield',
      '#title' => t('Title'),
      '#default_value' => $node->title,
      '#required' => FALSE,
      '#description' => t('Add a title that will help distinguish this question from other questions. This will not be seen during the quiz.'),
    );
  }
  else {
    $form['title'] = array(
      '#type' => 'value',
      '#value' => $node->title,
    );
  }
  $form['body'] = array(
    '#type' => 'textarea',
    '#title' => t('Question'),
    '#default_value' => $node->body,
    '#required' => TRUE,
  );
  $form['body_filter']['format'] = filter_form($node->format);
  if (user_access('allow multiple correct answers')) {
    $form['multiple_answers'] = array(
      '#type' => 'checkbox',
      '#title' => t('Multiple answers'),
      '#description' => t('Should the quiz-taker be allowed to select multiple correct answers?'),
      '#default_value' => $node->multiple_answers,
    );
  }
  else {
    $form['multiple_answers'] = array(
      '#type' => 'value',
      '#value' => FALSE,
    );
  }

  // Determine number of answer rows to display.
  if (!isset($node->rows)) {
    $node->rows = max(2, $node->answers ? count($node->answers) : variable_get('multichoice_default_answers', 5));
  }
  if ($_POST['more']) {
    $node->rows += 5;
  }
  $answers = $node->answers;

  // Display answer rows.
  $form['answers'] = array(
    '#type' => 'fieldset',
    '#title' => t('Choices'),
    '#tree' => TRUE,
    '#theme' => 'multichoice_form',
  );
  $form['scored_quiz'] = array(
    '#type' => 'value',
    '#value' => !empty($quiz_id) ? $quiz->pass_rate > 0 : TRUE,
  );
  for ($i = 0; $i < $node->rows; $i++) {

    // This is not a scored quiz, therefore no correct answers
    // so creator must assign answers to result options.
    if (isset($quiz_id) && $quiz->pass_rate == 0) {
      if (empty($result_options)) {
        $result_options = array(
          0 => 'None',
        );
        if (is_array($quiz->resultoptions)) {
          foreach ($quiz->resultoptions as $r_option) {
            $result_options[$r_option['option_id']] = $r_option['option_name'];
          }
        }
      }
      $form['answers'][$i]['result_option'] = array(
        '#type' => 'select',
        '#options' => $result_options,
        '#default_value' => $answers[$i]['result_option'],
      );
    }
    else {
      if (user_access('allow multiple correct answers')) {
        $form['answers'][$i]['correct'] = array(
          '#type' => 'checkbox',
          '#default_value' => $answers[$i]['is_correct'],
        );
      }
    }
    $form['answers'][$i]['answer'] = array(
      '#type' => 'textarea',
      '#default_value' => $answers[$i]['answer'],
      '#cols' => 30,
      '#rows' => 2,
    );
    if (user_access('allow feedback')) {
      $form['answers'][$i]['feedback'] = array(
        '#type' => 'textarea',
        '#default_value' => $answers[$i]['feedback'],
        '#cols' => 30,
        '#rows' => 2,
      );
    }
    else {
      $form['answers'][$i]['feedback'] = array(
        '#type' => 'value',
        '#value' => '',
      );
    }
    if ($answers[$i]['answer_id']) {
      $form['answers'][$i]['delete'] = array(
        '#type' => 'checkbox',
        '#default_value' => 0,
      );
      $form['answers'][$i]['answer_id'] = array(
        '#type' => 'hidden',
        '#value' => $answers[$i]['answer_id'],
      );
    }
  }
  if (user_access('allow any number of answers')) {
    $form['more'] = array(
      '#type' => 'checkbox',
      '#title' => t('I need more answers'),
    );
  }
  if (!user_access('allow multiple correct answers')) {
    $form['correct'] = array(
      '#type' => 'select',
      '#title' => t('Correct Answer'),
      '#description' => t('Which of the answer choices is correct?'),
      '#required' => TRUE,
      '#size' => 1,
      '#options' => range(1, $node->rows),
      '#default_value' => _multichoice_find_correct($node->answers),
    );
  }

  // If coming from quiz view, go back there on submit.
  if (!empty($quiz_id)) {
    $form['#redirect'] = 'node/' . $quiz_id . '/questions';
  }
  return $form;
}