PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.9
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.9
4.4.9 4.4.8 4.4.7 4.4.6 4.4.5 4.4.4 4.4.3 4.4.2 4.4.1 4.4.0 4.3.9.1 4.3.9 4.3.8 4.3.7 4.1.6.9 4.1.6.9.1 4.1.6.9.2 4.1.6.9.3 4.1.6.9.4 4.1.7 4.1.7.1 4.1.7.2 4.1.7.3 4.1.7.3.1 4.1.7.3.2 All 140 releases
← All changes | inc/rest-api/v1/frontend/class-lp-rest-users-controller.php +69 -43 4.3.7 → 4.4.9 View file →
@@ -1,8 +1,9 @@
1 1 <?php
2 2
3 3 use LearnPress\Models\CourseModel;
4 -use LearnPress\Models\UserItemMeta\UserQuizMetaModel;
4 +use LearnPress\Models\Question\QuestionPostModel;
5 +use LearnPress\Models\Quiz\QuizQuestionModel;
5 6 use LearnPress\Models\UserItems\UserQuizModel;
6 7
7 8 /**
8 9 * Class LP_REST_Users_Controller
@@ -62,17 +63,8 @@
62 63 'permission_callback' => '__return_true',
63 64 'args' => $this->get_item_endpoint_args(),
64 65 ),
65 66 ),
66 - /*'hint-answer' => array(
67 - array(
68 - 'methods' => WP_REST_Server::EDITABLE,
69 - 'callback' => array( $this, 'hint_answer' ),
70 - // 'permission_callback' => array( $this, 'check_admin_permission' ),
71 - 'permission_callback' => '__return_true',
72 - 'args' => $this->get_item_endpoint_args(),
73 - ),
74 - ),*/
75 67 'check-answer' => array(
76 68 array(
77 69 'methods' => WP_REST_Server::EDITABLE,
78 70 'callback' => array( $this, 'check_answer' ),
@@ -136,9 +128,9 @@
136 128 *
137 129 * @param WP_REST_Request $request
138 130 *
139 131 * @editor tungnx
140 - * @version 1.0.2
132 + * @version 1.0.4
141 133 * @sicne 4.0.0
142 134 * @return WP_REST_Response
143 135 */
144 136 public function start_quiz( WP_REST_Request $request ): WP_REST_Response {
@@ -159,14 +151,16 @@
159 151 $user = learn_press_get_user( $user_id );
160 152 $course = learn_press_get_course( $course_id );
161 153 $quiz = learn_press_get_quiz( $item_id );
162 154
163 - if ( ! $course ) {
164 - throw new Exception( __( 'The course is invalid!', 'learnpress' ) );
155 + $courseModel = CourseModel::find( $course_id, true );
156 + if ( ! $courseModel ) {
157 + throw new Exception( esc_html__( 'The course is invalid', 'learnpress' ) );
165 158 }
166 159
167 - if ( ! $quiz ) {
168 - throw new Exception( __( 'The quiz is invalid!', 'learnpress' ) );
160 + $quizPostModel = $courseModel->get_item_model( $item_id, LP_QUIZ_CPT );
161 + if ( ! $quizPostModel ) {
162 + throw new Exception( esc_html__( 'The quiz is invalid', 'learnpress' ) );
169 163 }
170 164
171 165 $quiz->set_course( $course );
172 166
@@ -171,12 +165,11 @@
171 165 $quiz->set_course( $course );
172 166
173 167 do_action( 'learn-press/user/before/start-quiz', $item_id, $course_id, $user_id );
174 168
175 - $courseModel = CourseModel::find( $course_id, true );
176 - $link = LP_Helper::get_link_no_cache( $courseModel->get_item_link( $item_id, LP_QUIZ_CPT ) );
169 + $link = LP_Helper::get_link_no_cache( $courseModel->get_item_link( $item_id, LP_QUIZ_CPT ) );
177 170
178 - // For no required enroll course
171 + // For no required enroll course (no need login)
179 172 if ( $user->is_guest() && $course->is_no_required_enroll() ) {
180 173 $no_required_enroll = new LP_Course_No_Required_Enroll( $course );
181 174 $response = $no_required_enroll->guest_start_quiz( $quiz );
182 175 $response['redirect_url'] = $link;
@@ -267,9 +260,9 @@
267 260 *
268 261 * @return WP_Error|WP_HTTP_Response|WP_REST_Response
269 262 * @editor tungnx
270 263 * @modify 4.1.4.1
271 - * @version 1.0.2
264 + * @version 1.0.3
272 265 */
273 266 public function submit_quiz( WP_REST_Request $request ) {
274 267 //$response = new LP_REST_Response();
275 268 $response = array(
@@ -285,19 +278,26 @@
285 278 $time_spend = $request['time_spend'] ?? 0;
286 279 $user = learn_press_get_user( $user_id );
287 280 $course = learn_press_get_course( $course_id );
288 281
289 - if ( ! $course ) {
290 - throw new Exception( 'The course is invalid!' );
282 + $courseModel = CourseModel::find( $course_id, true );
283 + if ( ! $courseModel ) {
284 + throw new Exception( esc_html__( 'The course is invalid', 'learnpress' ) );
291 285 }
286 +
287 + $quizPostModel = $courseModel->get_item_model( $item_id, LP_QUIZ_CPT );
288 + if ( ! $quizPostModel ) {
289 + throw new Exception( esc_html__( 'The quiz is invalid', 'learnpress' ) );
290 + }
291 +
292 292 // Use for Review Quiz.
293 293 $quiz = learn_press_get_quiz( $item_id );
294 294 if ( ! $quiz ) {
295 - throw new Exception( __( 'The quiz is invalid!', 'learnpress' ) );
295 + throw new Exception( esc_html__( 'The quiz is invalid!', 'learnpress' ) );
296 296 }
297 297 $quiz->set_course( $course );
298 298
299 - // Course is no required enroll
299 + // Course is no required enroll (no need login)
300 300 if ( $course->is_no_required_enroll() ) {
301 301 $no_required_enroll = new LP_Course_No_Required_Enroll( $course );
302 302
303 303 $result = $no_required_enroll->get_result_quiz( $quiz, $answered );
@@ -359,8 +359,16 @@
359 359 }
360 360
361 361 $user_quiz->complete();
362 362
363 + /**
364 + * Clear cache result quiz
365 + * Cache set on @see LP_User_Item_Quiz::get_results, and start_quiz() clears the same
366 + * key. Without this the next read still serves the in-progress result and the
367 + * submitted answers all come back as skipped.
368 + */
369 + $user_quiz->clear_results_cache();
370 +
363 371 do_action( 'learn-press/user/quiz-finished', $item_id, $course_id, $user_id, $user_quiz );
364 372
365 373 $result['status'] = $user_quiz->get_status(); // Must be completed
366 374 $result['attempts'] = $user_quiz->get_attempts();
@@ -375,27 +383,17 @@
375 383 return rest_ensure_response( $response );
376 384 }
377 385
378 386 /**
379 - * Hint the question and response hint content.
387 + * Check answer
380 388 *
381 389 * @param WP_REST_Request $request
382 - *
383 - * @return mixed|WP_REST_Response
390 + * @return WP_Error|WP_HTTP_Response|WP_REST_Response
391 + * @since 4.1.4.1
392 + * @version 1.0.2
384 393 */
385 - /*public function hint_answer( $request ) {
386 - $question_id = $request['question_id'];
387 - $question = learn_press_get_question( $question_id );
388 -
394 + public function check_answer( WP_REST_Request $request ) {
389 395 $response = array(
390 - 'hint' => $question->get_hint(),
391 - );
392 -
393 - return rest_ensure_response( $response );
394 - }*/
395 -
396 - public function check_answer( $request ) {
397 - $response = array(
398 396 'status' => 'error',
399 397 'message' => '',
400 398 );
401 399
@@ -406,25 +404,47 @@
406 404 $quiz_id = $request['item_id'] ?? 0;
407 405 $course = learn_press_get_course( $course_id );
408 406 $checked = [];
409 407
408 + $courseModel = CourseModel::find( $course_id, true );
409 + if ( ! $courseModel ) {
410 + throw new Exception( esc_html__( 'The course is invalid', 'learnpress' ) );
411 + }
412 +
413 + $quizPostModel = $courseModel->get_item_model( $quiz_id, LP_QUIZ_CPT );
414 + if ( ! $quizPostModel ) {
415 + throw new Exception( esc_html__( 'The quiz is invalid', 'learnpress' ) );
416 + }
417 +
418 + // Check question has in quiz
419 + $quizQuestionModel = QuizQuestionModel::find( $quiz_id, $question_id );
420 + if ( ! $quizQuestionModel ) {
421 + throw new Exception( esc_html__( 'The quiz question is invalid', 'learnpress' ) );
422 + }
423 +
424 + $questionModel = QuestionPostModel::find( $question_id, true );
425 + if ( ! $questionModel ) {
426 + throw new Exception( esc_html__( 'The question is invalid', 'learnpress' ) );
427 + }
428 +
429 + // For case user not login
410 430 if ( $course->is_no_required_enroll() ) {
411 431 $no_required_enroll = new LP_Course_No_Required_Enroll( $course );
412 432 $checked = $no_required_enroll->guest_check_question( $question_id, $answered );
413 - } else {
433 + } else { // For case user logged in
414 434 $user = learn_press_get_current_user();
415 435 if ( $user->is_guest() ) {
416 - throw new Exception( 'The user is invalid', 'learnrpess' );
436 + throw new Exception( esc_html__( 'You must be logged in to check answer.', 'learnpress' ) );
417 437 }
418 438
419 439 $user_course = $user->get_course_data( $course_id );
420 440 if ( ! $user_course ) {
421 - throw new Exception( 'User\'s course no data!', 'learnrpess' );
441 + throw new Exception( esc_html__( 'User\'s course no data!', 'learnpress' ) );
422 442 }
423 443
424 444 $user_quiz = $user_course->get_item( $quiz_id );
425 445 if ( ! $user_quiz ) {
426 - throw new Exception( 'User\'s quiz no data!', 'learnrpess' );
446 + throw new Exception( esc_html__( 'User\'s quiz no data!', 'learnpress' ) );
427 447 }
428 448
429 449 $checked = $user_quiz->instant_check_question( $question_id, $answered );
430 450 }
@@ -430,9 +450,15 @@
430 450 }
431 451
432 452 $question = learn_press_get_question( $question_id );
433 453 $response['explanation'] = $question->get_explanation();
434 - $response['options'] = learn_press_get_question_options_for_js( $question, array( 'answer' => $answered ) );
454 + $response['options'] = learn_press_get_question_options_for_js(
455 + $question,
456 + array(
457 + 'include_is_true' => $quizPostModel->has_instant_check(),
458 + 'answer' => $answered,
459 + )
460 + );
435 461 $response['result'] = $checked;
436 462 $response['status'] = 'success';
437 463 } catch ( Throwable $e ) {
438 464 $response['message'] = $e->getMessage();