You are here

function quiz_question_answering_form in Quiz 7.5

Same name and namespace in other branches
  1. 8.4 question_types/quiz_question/quiz_question.module \quiz_question_answering_form()
  2. 6.4 question_types/quiz_question/quiz_question.module \quiz_question_answering_form()
  3. 7.6 question_types/quiz_question/quiz_question.module \quiz_question_answering_form()
  4. 7 question_types/quiz_question/quiz_question.module \quiz_question_answering_form()
  5. 7.4 question_types/quiz_question/quiz_question.module \quiz_question_answering_form()

Get the form to show to the quiz taker.

_state

Parameters

array $form:

array $nodes: A list of question nodes to get answers from.

int $result_id: The result ID for this attempt.

Return value

array An renderable FAPI array.

3 string references to 'quiz_question_answering_form'
ajax_quiz_form_alter in modules/ajax_quiz/ajax_quiz.module
Implements hook_form_alter().
ajax_quiz_navigate_quiz in modules/ajax_quiz/ajax_quiz.module
AJAX callback for quiz submission.
quiz_take_question in ./quiz.module
Take a quiz questions.

File

question_types/quiz_question/quiz_question.module, line 142
Quiz Question module.

Code

function quiz_question_answering_form($form, $form_state, $nodes, $result_id) {
  $quiz_result = quiz_result_load($result_id);
  $quiz = node_load($quiz_result->nid, $quiz_result->vid);
  $view_mode = 'question';

  // Take quiz and result in the form.
  $form['#quiz'] = array(
    'nid' => $quiz->nid,
    'vid' => $quiz->vid,
  );
  $form['#quiz_result'] = $quiz_result;
  if (!is_array($nodes)) {

    // One single question (or page?)
    if ($nodes->type == 'quiz_page') {
      foreach ($quiz_result
        ->getLayout() as $question) {
        if ($question['nid'] == $nodes->nid) {

          // Found a page.
          $nodes = array(
            node_load($nodes->nid, $nodes->vid),
          );
          foreach ($quiz_result
            ->getLayout() as $question2) {
            if ($question2['qnr_pid'] == $question['qnr_id']) {

              // This question belongs in the requested page.
              $nodes[] = node_load($question2['nid'], $question2['vid']);
            }
          }
          break;
        }
      }
    }
    else {
      $nodes = array(
        $nodes->nid => $nodes,
      );
    }
  }
  $form['#attributes']['class'] = array(
    'answering-form',
  );
  $form['#tree'] = TRUE;
  foreach ($nodes as $node) {
    $question = _quiz_question_get_instance($node);
    $class = drupal_html_class('quiz-question-' . $node->type);

    // Element for a single question.
    $element = $question
      ->getAnsweringForm($form_state, $result_id);
    $qra = quiz_result_answer_load($quiz_result->result_id, $node->nid, $node->vid);
    $build = node_view($node, $view_mode);
    unset($build['#theme']);
    unset($build['answers']);
    unset($build['links']);
    $form['question'][$node->nid] = array(
      '#attributes' => array(
        'class' => array(
          $class,
        ),
      ),
      '#type' => 'container',
      'header' => $qra->display_number ? array(
        '#markup' => "<h2>" . t("Question @question", array(
          '@question' => $qra->display_number,
        )) . "</h2>",
      ) : NULL,
      'question' => $build,
      'answer' => $element,
    );
    $blank_and_change = $qra->is_skipped && $quiz->allow_change_blank;
    if (!$quiz->allow_change && $qra->answer_timestamp) {
      if ($blank_and_change) {

        // Allow it.
      }
      else {

        // This question was already answered, or answering blank question is
        // disabled.
        $form['question'][$node->nid]['#disabled'] = TRUE;
        if (empty($form_state['input'])) {
          drupal_set_message(t('Changing answers is disabled.'), 'warning');
        }
      }
    }
    if ($quiz->mark_doubtful && $question
      ->isQuestion()) {
      $form['question'][$node->nid]['is_doubtful'] = array(
        '#type' => 'checkbox',
        '#title' => t('Doubtful?'),
      );
      $form['question'][$node->nid]['is_doubtful']['#default_value'] = db_query('SELECT is_doubtful FROM {quiz_node_results_answers} WHERE result_id = :result_id AND question_nid = :question_nid AND question_vid = :question_vid', array(
        ':result_id' => $quiz_result->result_id,
        ':question_nid' => $node->nid,
        ':question_vid' => $node->vid,
      ))
        ->fetchField();
    }
  }
  $is_last = _quiz_show_finish_button($quiz);
  $form['navigation']['#type'] = 'actions';
  $form['navigation']['#theme'] = 'quiz_question_navigation_form';
  $form['navigation']['submit_hidden'] = array(
    '#weight' => -9999,
    '#type' => 'submit',
    '#value' => $is_last ? t('Finish') : t('Next'),
    '#attributes' => array(
      'style' => 'display: none',
    ),
  );
  if (!empty($quiz->backwards_navigation) && $_SESSION['quiz'][$quiz->nid]['current'] != 1) {

    // Backwards navigation enabled, and we are looking at not the first
    // question. @todo detect when on the first page.
    $form['navigation']['back'] = array(
      '#weight' => 10,
      '#type' => 'submit',
      '#value' => t('Back'),
      '#submit' => array(
        'quiz_question_answering_form_submit_back',
      ),
      '#limit_validation_errors' => array(),
    );
    if ($is_last) {
      $form['navigation']['#last'] = TRUE;
      $form['navigation']['last_text'] = array(
        '#weight' => 0,
        '#markup' => '<p><em>' . t('This is the last question. Press Finish to deliver your answers') . '</em></p>',
      );
    }
  }
  $form['navigation']['submit'] = array(
    '#weight' => 30,
    '#type' => 'submit',
    '#value' => $is_last ? t('Finish') : t('Next'),
  );
  if ($is_last && $quiz->backwards_navigation && !$quiz->repeat_until_correct) {

    // Display a confirmation dialogue if this is the last question and a user
    // is able to navigate backwards but not forced to answer correctly.
    $form['#attributes']['class'][] = 'quiz-answer-confirm';
    $form['#attributes']['data-confirm-message'] = t("By proceeding you won't be able to go back and edit your answers.");
    $form['#attached'] = array(
      'js' => array(
        drupal_get_path('module', 'quiz') . '/theme/quiz_confirm.js',
      ),
    );
  }
  if ($quiz->allow_skipping) {
    $form['navigation']['skip'] = array(
      '#weight' => 20,
      '#type' => 'submit',
      '#value' => $is_last ? t('Leave blank and finish') : t('Leave blank'),
      '#access' => $node->type == 'quiz_directions' ? FALSE : TRUE,
      '#submit' => array(
        'quiz_question_answering_form_submit_blank',
      ),
      '#limit_validation_errors' => array(),
    );
  }
  return $form;
}