Skip to content
4 changes: 2 additions & 2 deletions classes/Utils.php
Original file line number Diff line number Diff line change
Expand Up @@ -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 ) {
Expand Down
19 changes: 4 additions & 15 deletions templates/dashboard/quiz-attempts/quiz-reviews.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Expand Down
2 changes: 1 addition & 1 deletion templates/shared/components/quiz/attempt-details.php
Original file line number Diff line number Diff line change
Expand Up @@ -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 );
?>
<div class="tutor-quiz-summary-page">
Expand Down
18 changes: 8 additions & 10 deletions templates/shared/components/quiz/attempt-details/question.php
Original file line number Diff line number Diff line change
Expand Up @@ -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 ?? '' );
Expand All @@ -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();

Expand Down Expand Up @@ -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,
Expand All @@ -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() );
}
?>
</div>
Original file line number Diff line number Diff line change
Expand Up @@ -22,37 +22,38 @@
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(
'correct' => 1,
'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 : '';
?>

<div
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,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_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 ) ) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,15 @@
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 );
$question_answers = is_array( $question_answers ) ? $question_answers : array();
$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 ) );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 ) {
Expand Down Expand Up @@ -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 ) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 ) );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
}
}
?>

<div class="tutor-quiz tutor-quiz-questions">
Expand All @@ -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 ) {
Expand Down Expand Up @@ -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 ),
Expand Down
Loading