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 ),