| @@ -1,79 +1,102 @@ | ||
| 1 | 1 | <?php |
| 2 | 2 | /** |
| 3 | 3 | * Template for printing js code used for Quiz. |
| 4 | + * Call from hook 'learn-press/content-item-summary/lp_quiz' | |
| 4 | 5 | * |
| 5 | 6 | * @author ThimPress |
| 6 | 7 | * @package LearnPress/Templates |
| 7 | - * @version 4.0.0 | |
| 8 | + * @version 4.0.2 | |
| 8 | 9 | */ |
| 9 | 10 | |
| 11 | +use LearnPress\Models\CourseModel; | |
| 12 | +use LearnPress\Models\QuizPostModel; | |
| 13 | +use LearnPress\Models\UserItems\UserQuizModel; | |
| 14 | +use LearnPress\Models\UserModel; | |
| 15 | + | |
| 10 | 16 | defined( 'ABSPATH' ) || exit; |
| 11 | 17 | |
| 12 | -$user = learn_press_get_current_user(); | |
| 13 | -$course = learn_press_get_course(); | |
| 14 | -if ( ! $course ) { | |
| 18 | +global $lpCourseModel; | |
| 19 | +$courseModel = $lpCourseModel; | |
| 20 | +if ( ! $courseModel instanceof CourseModel ) { | |
| 15 | 21 | return; |
| 16 | 22 | } |
| 17 | 23 | |
| 24 | +$userModel = UserModel::find( get_current_user_id(), true ); | |
| 25 | + | |
| 18 | 26 | $quiz = LP_Global::course_item_quiz(); |
| 19 | 27 | if ( ! $quiz ) { |
| 20 | 28 | return; |
| 21 | 29 | } |
| 22 | 30 | |
| 23 | -$total_question = $quiz->count_questions(); | |
| 31 | +$quizPostModel = QuizPostModel::find( $quiz->get_id(), true ); | |
| 32 | +if ( ! $quizPostModel instanceof QuizPostModel ) { | |
| 33 | + return; | |
| 34 | +} | |
| 35 | + | |
| 36 | +$total_question = $quizPostModel->count_questions(); | |
| 24 | 37 | $questions = array(); |
| 25 | -$show_check = $quiz->get_instant_check(); | |
| 26 | -$show_correct_review = $quiz->get_show_correct_review(); | |
| 27 | -$question_ids = $quiz->get_question_ids(); | |
| 38 | +$show_check = $quizPostModel->has_instant_check(); | |
| 39 | +$show_correct_review = $quizPostModel->has_show_correct_review(); | |
| 40 | +$question_ids = $quizPostModel->get_question_ids(); | |
| 28 | 41 | $user_js = array(); |
| 29 | 42 | |
| 30 | - | |
| 31 | -$user_course = $user->get_course_data( $course->get_id() ); | |
| 32 | -/** | |
| 33 | - * @var LP_User_Item_Quiz $user_quiz | |
| 34 | - */ | |
| 35 | -$user_quiz = $user_course ? $user_course->get_item( $quiz->get_id() ) : false; | |
| 36 | 43 | $answered = array(); |
| 37 | 44 | $status = ''; |
| 38 | 45 | $checked_questions = array(); |
| 39 | 46 | |
| 40 | 47 | $crypto_js_aes = false; |
| 41 | -$editable = $user->is_admin() || get_post_field( $user->is_author_of( $course->get_id() ) ); | |
| 42 | -$max_retrying = learn_press_get_quiz_max_retrying( $quiz->get_id(), $course->get_id() ); | |
| 48 | +$user = learn_press_get_current_user(); | |
| 49 | +$editable = $user->is_admin() || get_post_field( $user->is_author_of( $courseModel->get_id() ) ); | |
| 50 | +$max_retrying = learn_press_get_quiz_max_retrying( $quiz->get_id(), $courseModel->get_id() ); | |
| 43 | 51 | $quiz_results = null; |
| 52 | +$userQuizModel = null; | |
| 44 | 53 | |
| 45 | -if ( $user_quiz ) { | |
| 46 | - $status = $user_quiz->get_status(); | |
| 47 | - if ( LP_ITEM_STARTED === $status ) { | |
| 48 | - $quiz_results = LP_User_Items_Result_DB::instance()->get_result( $user_quiz->get_user_item_id() ); | |
| 49 | - } | |
| 54 | +if ( $userModel ) { | |
| 55 | + $userQuizModel = UserQuizModel::find_user_item( | |
| 56 | + $userModel->get_id(), | |
| 57 | + $quiz->get_id(), | |
| 58 | + LP_QUIZ_CPT, | |
| 59 | + $courseModel->get_id(), | |
| 60 | + LP_COURSE_CPT, | |
| 61 | + true | |
| 62 | + ); | |
| 50 | 63 | |
| 51 | - if ( ! $quiz_results ) { | |
| 52 | - $quiz_results = $user_quiz->get_result(); | |
| 53 | - } | |
| 64 | + if ( $userQuizModel instanceof UserQuizModel ) { | |
| 65 | + $status = $userQuizModel->get_status(); | |
| 66 | + $quiz_results = $userQuizModel->get_result(); | |
| 67 | + $checked_questions = $userQuizModel->get_checked_questions(); | |
| 54 | 68 | |
| 55 | - $checked_questions = $user_quiz->get_checked_questions(); | |
| 69 | + $start_time_obj = new LP_Datetime( $userQuizModel->get_start_time() ); | |
| 70 | + $start_time_timestamp = $start_time_obj->getTimestamp(); | |
| 56 | 71 | |
| 57 | - $user_js = array( | |
| 58 | - 'status' => $status, | |
| 59 | - 'attempts' => $user_quiz->get_attempts(), | |
| 60 | - 'checked_questions' => $checked_questions, | |
| 61 | - 'start_time' => $user_quiz->get_start_time()->toSql( false ), | |
| 62 | - 'retaken' => absint( $user_quiz->get_retaken_count() ), | |
| 63 | - ); | |
| 72 | + $user_js = array( | |
| 73 | + 'status' => $status, | |
| 74 | + 'attempts' => $userQuizModel->get_history(), | |
| 75 | + 'checked_questions' => $checked_questions, | |
| 76 | + 'start_time' => $userQuizModel->get_start_time(), | |
| 77 | + 'time_spend' => time() - $start_time_timestamp, | |
| 78 | + 'retaken' => $userQuizModel->get_retaken_count(), | |
| 79 | + 'total_time' => $userQuizModel->get_time_remaining(), | |
| 80 | + 'results' => $quiz_results, | |
| 81 | + ); | |
| 64 | 82 | |
| 65 | - $time_remaining = $user_quiz->get_timestamp_remaining(); | |
| 66 | - $user_js['total_time'] = $time_remaining; | |
| 83 | + $answered = $quiz_results['questions']; | |
| 84 | + } | |
| 85 | +} | |
| 67 | 86 | |
| 68 | - if ( $quiz_results ) { | |
| 69 | - $user_js['results'] = $quiz_results; | |
| 70 | - $answered = $quiz_results['questions']; | |
| 71 | - } | |
| 72 | -} else { | |
| 87 | +if ( ! $userQuizModel ) { | |
| 73 | 88 | // Display quiz content. |
| 74 | 89 | echo '<div class="quiz-content">'; |
| 75 | - learn_press_echo_vuejs_write_on_php( $quiz->get_content() ); | |
| 90 | + global $post; | |
| 91 | + $original_post = $post; | |
| 92 | + $post = get_post( $quizPostModel->get_id() ); | |
| 93 | + setup_postdata( $post ); | |
| 94 | + | |
| 95 | + echo $quizPostModel->get_the_content(); | |
| 96 | + | |
| 97 | + $post = $original_post; | |
| 98 | + setup_postdata( $post ); | |
| 76 | 99 | echo '</div>'; |
| 77 | 100 | } |
| 78 | 101 | |
| 79 | 102 | $questions = learn_press_rest_prepare_user_questions( |
| @@ -90,12 +113,12 @@ | ||
| 90 | 113 | |
| 91 | 114 | $duration = $quiz->get_duration(); |
| 92 | 115 | |
| 93 | 116 | $js = array( |
| 94 | - 'course_id' => $course->get_id(), | |
| 117 | + 'course_id' => $courseModel->get_id(), | |
| 95 | 118 | 'nonce' => wp_create_nonce( sprintf( 'user-quiz-%d', get_current_user_id() ) ), |
| 96 | - 'id' => $quiz->get_id(), | |
| 97 | - 'title' => $quiz->get_title(), | |
| 119 | + 'id' => $quizPostModel->get_id(), | |
| 120 | + 'title' => $quizPostModel->get_the_title(), | |
| 98 | 121 | 'content' => '', |
| 99 | 122 | 'questions' => $questions, |
| 100 | 123 | 'question_ids' => $question_ids, |
| 101 | 124 | 'number_questions_to_do' => $quiz->get_number_questions_to_do(), |
| @@ -104,47 +127,55 @@ | ||
| 104 | 127 | 'status' => '', |
| 105 | 128 | 'attempts' => array(), |
| 106 | 129 | 'answered' => $answered ? (object) $answered : new stdClass(), |
| 107 | 130 | 'checked_questions' => array(), |
| 108 | - 'passing_grade' => $quiz->get_passing_grade(), | |
| 109 | - 'negative_marking' => $quiz->get_negative_marking(), | |
| 131 | + 'passing_grade' => $quizPostModel->get_passing_grade(), | |
| 132 | + 'negative_marking' => $quizPostModel->has_negative_marking(), | |
| 110 | 133 | 'show_correct_review' => $show_correct_review, |
| 111 | - 'instant_check' => $quiz->get_instant_check(), | |
| 112 | - 'retake_count' => absint( $quiz->get_retake_count() ), | |
| 134 | + 'instant_check' => $quizPostModel->has_instant_check(), | |
| 135 | + 'retake_count' => absint( $quizPostModel->get_retake_count() ), | |
| 113 | 136 | 'retaken' => 0, |
| 114 | 137 | 'questions_per_page' => $quiz->get_pagination(), |
| 115 | 138 | 'page_numbers' => get_post_meta( $quiz->get_id(), '_lp_pagination_numbers', true ) === 'yes', |
| 116 | - 'review_questions' => $quiz->get_review_questions(), | |
| 139 | + 'review_questions' => $quizPostModel->get_meta_value_by_key( QuizPostModel::META_KEY_REVIEW, 'yes' ) === 'yes', | |
| 117 | 140 | 'support_options' => learn_press_get_question_support_answer_options(), |
| 118 | 141 | 'duration' => $duration ? $duration->get() : false, |
| 119 | 142 | 'crypto' => $crypto_js_aes, |
| 120 | - 'edit_permalink' => $editable ? get_edit_post_link( $quiz->get_id() ) : '', | |
| 143 | + 'edit_permalink' => $editable ? $quizPostModel->get_edit_link() : '', | |
| 121 | 144 | 'results' => array(), |
| 122 | 145 | 'required_password' => post_password_required( $quiz->get_id() ), |
| 123 | - 'allow_retake' => $quiz->get_retake_count() == -1, | |
| 146 | + 'allow_retake' => $quizPostModel->get_retake_count() == - 1, | |
| 124 | 147 | ); |
| 125 | 148 | |
| 149 | +global $post; | |
| 150 | +$original_post = $post; | |
| 151 | +$post = get_post( $quizPostModel->get_id() ); | |
| 152 | +setup_postdata( $post ); | |
| 153 | + | |
| 154 | +$js['quiz_description'] = $quizPostModel->get_the_content(); | |
| 155 | + | |
| 156 | +$post = $original_post; | |
| 157 | +setup_postdata( $post ); | |
| 158 | + | |
| 126 | 159 | $js = array_merge( $js, $user_js ); |
| 127 | 160 | |
| 128 | -if ( $total_question ) : | |
| 161 | +// To show data debug. | |
| 162 | +LP_Helper::print_inline_script_tag( 'lp_quiz_js_data', [ 'data' => $js ] ); | |
| 163 | + | |
| 164 | +if ( $total_question ) { | |
| 129 | 165 | ?> |
| 130 | 166 | <div id="learn-press-quiz-app"></div> |
| 131 | 167 | |
| 132 | 168 | <script> |
| 133 | - document.addEventListener( 'DOMContentLoaded', () => { | |
| 134 | - if ( typeof LP !== 'undefined' ) { | |
| 135 | - LP.Hook.addAction('course-ready', () => { | |
| 169 | + document.addEventListener('DOMContentLoaded', () => { | |
| 170 | + if (typeof LP !== 'undefined') { | |
| 136 | 171 | LP.quiz.init( |
| 137 | 172 | '#learn-press-quiz-app', |
| 138 | 173 | <?php echo json_encode( $js ); ?> |
| 139 | 174 | ) |
| 140 | - }); | |
| 141 | - } | |
| 142 | - }); | |
| 175 | + } | |
| 176 | + }); | |
| 143 | 177 | </script> |
| 144 | - | |
| 145 | 178 | <?php |
| 146 | -else : | |
| 179 | +} else { | |
| 147 | 180 | esc_html_e( 'You haven\'t any question!', 'learnpress' ); |
| 148 | - ?> | |
| 149 | - | |
| 150 | -<?php endif; ?> | |
| 181 | +} | |