diff --git a/classes/Utils.php b/classes/Utils.php index 6dcb9541d3..dd0da1ff1b 100644 --- a/classes/Utils.php +++ b/classes/Utils.php @@ -5354,12 +5354,12 @@ public function get_random_questions_by_quiz( $quiz_id = 0 ) { $quiz_id = $this->get_post_id( $quiz_id ); $attempt = $this->is_started_quiz( $quiz_id ); - $total_questions = (int) $attempt->total_questions; if ( ! $attempt ) { return false; } - $questions_order = $this->get_quiz_option( get_the_ID(), 'questions_order', 'rand' ); + $total_questions = (int) $attempt->total_questions; + $questions_order = $this->get_quiz_option( $quiz_id, 'questions_order', 'rand' ); $order_by = ''; if ( 'rand' === $questions_order ) { diff --git a/templates/dashboard/quiz-attempts/quiz-reviews.php b/templates/dashboard/quiz-attempts/quiz-reviews.php index 93b7a4c7cc..bd6ec96a13 100644 --- a/templates/dashboard/quiz-attempts/quiz-reviews.php +++ b/templates/dashboard/quiz-attempts/quiz-reviews.php @@ -36,26 +36,15 @@ ); $attempt_answers_map = array(); -$questions = tutor_utils()->get_questions_by_quiz( $quiz_id ); -$attempt_answers = QuizModel::get_quiz_answers_by_attempt_id( $attempt_id ); - -if ( is_array( $attempt_answers ) ) { - foreach ( $attempt_answers as $attempt_answer ) { - $question_id = (int) ( $attempt_answer->question_id ?? 0 ); - - if ( $question_id > 0 ) { - $attempt_answers_map[ $question_id ] = $attempt_answer; - } - } -} +$questions = QuizModel::get_quiz_answers_by_attempt_id( $attempt_id ); if ( is_array( $questions ) ) { foreach ( $questions as $question ) { - $question_id = (int) ( $question->question_id ?? 0 ); - $attempt_answer = $attempt_answers_map[ $question_id ] ?? null; - $answer_status = $attempt_answer ? QuizModel::get_attempt_answer_status( $attempt_answer ) : 'skipped'; + $question_id = (int) ( $question->question_id ?? 0 ); if ( $question_id > 0 ) { + $attempt_answers_map[ $question_id ] = $question; + $answer_status = QuizModel::get_attempt_answer_status( $question ); $form_default_values[ "review_statuses[{$question_id}]" ] = $answer_status; } } diff --git a/templates/shared/components/quiz/attempt-details.php b/templates/shared/components/quiz/attempt-details.php index 5e28110089..62ab01d2a1 100644 --- a/templates/shared/components/quiz/attempt-details.php +++ b/templates/shared/components/quiz/attempt-details.php @@ -69,7 +69,7 @@ $quiz_id = (int) ( $attempt_data->quiz_id ?? 0 ); } -$questions = tutor_utils()->get_questions_by_quiz( $quiz_id ); +$questions = QuizModel::get_quiz_answers_by_attempt_id( (int) $attempt_data->attempt_id ); $course_contents = tutor_utils()->get_course_prev_next_contents_by_id( $quiz_id ); ?>
diff --git a/templates/shared/components/quiz/attempt-details/question.php b/templates/shared/components/quiz/attempt-details/question.php index 0a77bdd9ca..7c7f186641 100644 --- a/templates/shared/components/quiz/attempt-details/question.php +++ b/templates/shared/components/quiz/attempt-details/question.php @@ -17,7 +17,6 @@ } $index = (int) ( $index ?? 1 ); -$attempt_answer = isset( $attempt_answer ) && is_object( $attempt_answer ) ? $attempt_answer : null; $attempt_id = (int) ( $attempt_id ?? 0 ); $back_url = (string) ( $back_url ?? '' ); $context = (string) ( $context ?? '' ); @@ -35,8 +34,8 @@ $question_type = 'multiple_choice'; } -$is_skipped = QuizModel::is_attempt_answer_skipped( $attempt_answer ); -$review_status = $attempt_answer ? QuizModel::get_attempt_answer_status( $attempt_answer ) : 'skipped'; +$is_skipped = QuizModel::is_attempt_answer_skipped( $question ); +$review_status = $question ? QuizModel::get_attempt_answer_status( $question ) : 'skipped'; $answer_status = $review_status; $status_badges = array(); @@ -86,7 +85,7 @@ 'status_badges' => $status_badges, 'answer_status' => $answer_status, 'attempt_id' => $attempt_id, - 'attempt_answer_id' => (int) ( $attempt_answer->attempt_answer_id ?? 0 ), + 'attempt_answer_id' => (int) ( $question->attempt_answer_id ?? 0 ), 'back_url' => $back_url, 'context' => $context, 'is_instructor_review' => $is_instructor_review, @@ -97,16 +96,15 @@ tutor_load_template( 'shared.components.quiz.attempt-details.questions.' . $question_template, array( - 'question' => $question, - 'attempt_answer' => $attempt_answer, - 'index' => $index, + 'question' => $question, + 'index' => $index, ) ); - do_action( 'tutor_quiz_attempt_details_after_question_template', $question, $question_template, $attempt_answer, $index ); + do_action( 'tutor_quiz_attempt_details_after_question_template', $question, $question_template, $index ); - if ( is_object( $attempt_answer ) ) { - do_action( 'tutor_quiz_attempt_details_loop_after_row', $attempt_answer, $answer_status, array() ); + if ( is_object( $question ) ) { + do_action( 'tutor_quiz_attempt_details_loop_after_row', $question, $answer_status, array() ); } ?>
diff --git a/templates/shared/components/quiz/attempt-details/questions-sidebar.php b/templates/shared/components/quiz/attempt-details/questions-sidebar.php index 66d50b6e0f..204c6e6811 100644 --- a/templates/shared/components/quiz/attempt-details/questions-sidebar.php +++ b/templates/shared/components/quiz/attempt-details/questions-sidebar.php @@ -22,7 +22,6 @@ return; } -$questions = tutor_utils()->get_questions_by_quiz( $quiz_id ); $question_status_map = array(); $default_item_status = ( isset( $attempt_data ) && is_object( $attempt_data ) ) ? 'incorrect' : ''; $status_priority = array( @@ -30,29 +29,31 @@ 'incorrect' => 2, 'pending' => 3, ); -$first_question_id = is_array( $questions ) && ! empty( $questions ) ? (int) ( $questions[0]->question_id ?? 0 ) : 0; -$first_question_id = $first_question_id > 0 ? $first_question_id : ''; if ( isset( $attempt_data ) && is_object( $attempt_data ) && ! empty( $attempt_data->attempt_id ) ) { - $attempt_answers = QuizModel::get_quiz_answers_by_attempt_id( (int) $attempt_data->attempt_id ); + $questions = QuizModel::get_quiz_answers_by_attempt_id( (int) $attempt_data->attempt_id ); + $questions = is_array( $questions ) ? $questions : array(); - if ( is_array( $attempt_answers ) ) { - foreach ( $attempt_answers as $answer_row ) { - $question_id = (int) ( $answer_row->question_id ?? 0 ); - if ( ! $question_id ) { - continue; - } + foreach ( $questions as $answer_row ) { + $question_id = (int) ( $answer_row->question_id ?? 0 ); + if ( ! $question_id ) { + continue; + } - $answer_status = QuizModel::get_attempt_answer_status( $answer_row ); - $item_status = 'correct' === $answer_status ? 'correct' : ( 'pending' === $answer_status ? 'pending' : 'incorrect' ); - $current = $question_status_map[ $question_id ] ?? ''; + $answer_status = QuizModel::get_attempt_answer_status( $answer_row ); + $item_status = 'correct' === $answer_status ? 'correct' : ( 'pending' === $answer_status ? 'pending' : 'incorrect' ); + $current = $question_status_map[ $question_id ] ?? ''; - if ( ! $current || $status_priority[ $item_status ] > $status_priority[ $current ] ) { - $question_status_map[ $question_id ] = $item_status; - } + if ( ! $current || $status_priority[ $item_status ] > $status_priority[ $current ] ) { + $question_status_map[ $question_id ] = $item_status; } } +} else { + $questions = tutor_utils()->get_questions_by_quiz( $quiz_id ); } + +$first_question_id = is_array( $questions ) && ! empty( $questions ) ? (int) ( $questions[0]->question_id ?? 0 ) : 0; +$first_question_id = $first_question_id > 0 ? $first_question_id : ''; ?>
question_id ); $question_answers = is_array( $question_answers ) ? $question_answers : array(); $given_values = array(); -if ( $attempt_answer ) { - $given_raw = maybe_unserialize( $attempt_answer->given_answer ); +if ( isset( $question->given_answer ) ) { + $given_raw = maybe_unserialize( $question->given_answer ); if ( is_array( $given_raw ) ) { $given_values = array_values( array_map( 'strval', $given_raw ) ); } elseif ( is_string( $given_raw ) && '' !== trim( $given_raw ) ) { diff --git a/templates/shared/components/quiz/attempt-details/questions/multiple-choice.php b/templates/shared/components/quiz/attempt-details/questions/multiple-choice.php index 9d9c578be2..803be27fa1 100644 --- a/templates/shared/components/quiz/attempt-details/questions/multiple-choice.php +++ b/templates/shared/components/quiz/attempt-details/questions/multiple-choice.php @@ -15,7 +15,6 @@ return; } -$attempt_answer = isset( $attempt_answer ) && is_object( $attempt_answer ) ? $attempt_answer : null; $question_settings = maybe_unserialize( $question->question_settings ); $question_settings = is_array( $question_settings ) ? $question_settings : array(); $question_answers = QuizModel::get_answers_by_quiz_question( (int) $question->question_id ); @@ -23,8 +22,8 @@ $has_multiple_correct_answer = isset( $question_settings['has_multiple_correct_answer'] ) && '1' === (string) $question_settings['has_multiple_correct_answer']; $given_ids = array(); -if ( $attempt_answer ) { - $given_value = maybe_unserialize( $attempt_answer->given_answer ); +if ( isset( $question->given_answer ) ) { + $given_value = maybe_unserialize( $question->given_answer ); $given_ids = is_array( $given_value ) ? array_values( $given_value ) : array( $given_value ); } $given_ids = array_map( 'intval', array_filter( $given_ids ) ); diff --git a/templates/shared/components/quiz/attempt-details/questions/open-ended.php b/templates/shared/components/quiz/attempt-details/questions/open-ended.php index 56c8f4478d..a43beaa654 100644 --- a/templates/shared/components/quiz/attempt-details/questions/open-ended.php +++ b/templates/shared/components/quiz/attempt-details/questions/open-ended.php @@ -13,11 +13,10 @@ return; } -$attempt_answer = isset( $attempt_answer ) && is_object( $attempt_answer ) ? $attempt_answer : null; -$given_answer = ''; +$given_answer = ''; -if ( $attempt_answer ) { - $given_raw = maybe_unserialize( $attempt_answer->given_answer ); +if ( isset( $question->given_answer ) ) { + $given_raw = maybe_unserialize( $question->given_answer ); if ( is_array( $given_raw ) ) { $given_answer = implode( ', ', array_map( 'strval', $given_raw ) ); } else { diff --git a/templates/shared/components/quiz/attempt-details/questions/review-answer-dnd.php b/templates/shared/components/quiz/attempt-details/questions/review-answer-dnd.php index b57ecfe2b1..976cef8ed3 100644 --- a/templates/shared/components/quiz/attempt-details/questions/review-answer-dnd.php +++ b/templates/shared/components/quiz/attempt-details/questions/review-answer-dnd.php @@ -30,8 +30,7 @@ $question_settings['is_image_matching'] = $is_image_matching ? '1' : ( $question_settings['is_image_matching'] ?? '0' ); $question_answers = QuizModel::get_answers_by_quiz_question( (int) $question->question_id ); $question_answers = is_array( $question_answers ) ? array_values( $question_answers ) : array(); -$attempt_answer = isset( $attempt_answer ) && is_object( $attempt_answer ) ? $attempt_answer : null; -$given_raw = $attempt_answer->given_answer ?? null; +$given_raw = $question->given_answer ?? null; $given_answer = maybe_unserialize( $given_raw ); $normalize = static function ( $value ) { @@ -84,7 +83,7 @@ } } elseif ( 'image_answering' === $question_type ) { $given_map = is_array( $given_answer ) ? $given_answer : array(); - $answer_status = $attempt_answer ? QuizModel::get_attempt_answer_status( $attempt_answer ) : 'incorrect'; + $answer_status = QuizModel::get_attempt_answer_status( $question ); $row_item_state = 'correct' === $answer_status ? 'correct' : ( 'pending' === $answer_status ? 'pending' : 'incorrect' ); foreach ( $question_answers as $correct_item ) { diff --git a/templates/shared/components/quiz/attempt-details/questions/true-false.php b/templates/shared/components/quiz/attempt-details/questions/true-false.php index 4f2a043ae2..b0e87130b0 100644 --- a/templates/shared/components/quiz/attempt-details/questions/true-false.php +++ b/templates/shared/components/quiz/attempt-details/questions/true-false.php @@ -17,13 +17,12 @@ return; } -$attempt_answer = isset( $attempt_answer ) && is_object( $attempt_answer ) ? $attempt_answer : null; $question_answers = QuizModel::get_answers_by_quiz_question( (int) $question->question_id ); $question_answers = is_array( $question_answers ) ? $question_answers : array(); $given_ids = array(); -if ( $attempt_answer ) { - $given_value = maybe_unserialize( $attempt_answer->given_answer ); +if ( isset( $question->given_answer ) ) { + $given_value = maybe_unserialize( $question->given_answer ); $given_ids = is_array( $given_value ) ? array_values( $given_value ) : array( $given_value ); } $given_ids = array_map( 'intval', array_filter( $given_ids ) ); diff --git a/templates/shared/components/quiz/attempt-details/review-answers.php b/templates/shared/components/quiz/attempt-details/review-answers.php index 7a3e3e14dc..0730934725 100644 --- a/templates/shared/components/quiz/attempt-details/review-answers.php +++ b/templates/shared/components/quiz/attempt-details/review-answers.php @@ -10,25 +10,11 @@ defined( 'ABSPATH' ) || exit; use Tutor\Quiz; -use Tutor\Models\QuizModel; $questions = isset( $questions ) && is_array( $questions ) ? $questions : array(); $attempt_data = isset( $attempt_data ) && is_object( $attempt_data ) ? $attempt_data : null; $back_url = isset( $back_url ) ? (string) $back_url : ''; $context = isset( $context ) ? (string) $context : ''; - -$attempt_answers_map = array(); -if ( $attempt_data && ! empty( $attempt_data->attempt_id ) ) { - $attempt_answers = QuizModel::get_quiz_answers_by_attempt_id( (int) $attempt_data->attempt_id ); - if ( is_array( $attempt_answers ) ) { - foreach ( $attempt_answers as $attempt_answer ) { - $qid = (int) ( $attempt_answer->question_id ?? 0 ); - if ( $qid > 0 ) { - $attempt_answers_map[ $qid ] = $attempt_answer; - } - } - } -} ?>
@@ -49,8 +35,6 @@ $is_coordinates = 'coordinates' === $question_type; $is_puzzle = 'puzzle' === $question_type; - $attempt_answer = $attempt_answers_map[ $question_id ] ?? null; - $question_template = ''; if ( $is_dnd ) { @@ -83,7 +67,6 @@ 'shared.components.quiz.attempt-details.question', array( 'question' => $question, - 'attempt_answer' => $attempt_answer, 'index' => (int) $index + 1, 'question_template' => $question_template, 'attempt_id' => (int) ( $attempt_data->attempt_id ?? 0 ),