| @@ -1,5 +1,12 @@ | ||
| 1 | 1 | <?php |
| 2 | + | |
| 3 | +use LearnPress\Helpers\Template; | |
| 4 | +use LearnPress\Models\CourseModel; | |
| 5 | +use LearnPress\Models\UserItems\UserCourseModel; | |
| 6 | +use LearnPress\Models\UserItems\UserItemModel; | |
| 7 | +use LearnPress\Models\UserModel; | |
| 8 | + | |
| 2 | 9 | defined( 'ABSPATH' ) || exit; |
| 3 | 10 | |
| 4 | 11 | if ( ! class_exists( 'LP_AJAX' ) ) { |
| 5 | 12 | class LP_AJAX { |
| @@ -11,9 +18,9 @@ | ||
| 11 | 18 | 'checkout-user-email-exists:nopriv', |
| 12 | 19 | 'recover-order', |
| 13 | 20 | 'request-become-a-teacher:nonce', |
| 14 | 21 | 'checkout:nopriv', |
| 15 | - 'complete-lesson', | |
| 22 | + //'complete-lesson', | |
| 16 | 23 | 'finish-course', // finish_course. |
| 17 | 24 | 'external-link:nopriv', |
| 18 | 25 | ); |
| 19 | 26 | |
| @@ -65,9 +72,18 @@ | ||
| 65 | 72 | public static function request_become_a_teacher() { |
| 66 | 73 | LP_Forms_Handler::process_become_teacher(); |
| 67 | 74 | } |
| 68 | 75 | |
| 76 | + /** | |
| 77 | + * Recover order | |
| 78 | + * | |
| 79 | + * @since 4.0.0 | |
| 80 | + * @version 4.0.1 | |
| 81 | + * @return void | |
| 82 | + */ | |
| 69 | 83 | public static function recover_order() { |
| 84 | + $response = new LP_REST_Response(); | |
| 85 | + | |
| 70 | 86 | if ( ! LP_Request::verify_nonce( 'recover-order' ) ) { |
| 71 | 87 | return; |
| 72 | 88 | } |
| 73 | 89 | |
| @@ -74,60 +90,57 @@ | ||
| 74 | 90 | $factory = new LP_Order_CURD(); |
| 75 | 91 | $user_id = get_current_user_id(); |
| 76 | 92 | $order_key = LP_Request::get_string( 'order-key' ); |
| 77 | 93 | $order = $factory->recover( $order_key, $user_id ); |
| 78 | - $result = array( 'result' => 'success' ); | |
| 79 | 94 | |
| 80 | 95 | if ( is_wp_error( $order ) ) { |
| 81 | - $result['message'] = $order->get_error_message(); | |
| 82 | - $result['result'] = 'error'; | |
| 96 | + $response->message = $order->get_error_message(); | |
| 83 | 97 | } else { |
| 84 | - $result['message'] = sprintf( | |
| 98 | + $response->status = 'success'; | |
| 99 | + $response->message = sprintf( | |
| 85 | 100 | __( 'The order %s has been successfully recovered.', 'learnpress' ), |
| 86 | 101 | $order_key |
| 87 | 102 | ); |
| 88 | - $result['redirect'] = $order->get_view_order_url(); | |
| 103 | + $response->data->redirect = $order->get_view_order_url(); | |
| 89 | 104 | } |
| 90 | 105 | |
| 91 | - $result = apply_filters( 'learn-press/order/recover-result', $result, $order_key, $user_id ); | |
| 106 | + wp_send_json( $response ); | |
| 107 | + } | |
| 92 | 108 | |
| 93 | - learn_press_maybe_send_json( $result ); | |
| 109 | + public static function checkout_user_email_exists() { | |
| 110 | + $response = new LP_REST_Response(); | |
| 94 | 111 | |
| 95 | - if ( ! empty( $result['message'] ) ) { | |
| 96 | - learn_press_add_message( $result['message'] ); | |
| 97 | - } | |
| 112 | + try { | |
| 113 | + $email = LP_Request::get_email( 'email' ); | |
| 114 | + $user_can_register = get_option( 'users_can_register' ); | |
| 115 | + $html_wrapper = [ | |
| 116 | + '<label class="lp-guest-checkout-output">' => '</label>', | |
| 117 | + ]; | |
| 98 | 118 | |
| 99 | - if ( ! empty( $result['redirect'] ) ) { | |
| 100 | - wp_redirect( $result['redirect'] ); | |
| 101 | - exit(); | |
| 102 | - } | |
| 103 | - } | |
| 119 | + if ( email_exists( $email ) ) { | |
| 120 | + $output = __( | |
| 121 | + 'Your email already exists. Do you want to continue with this email?', | |
| 122 | + 'learnpress' | |
| 123 | + ); | |
| 124 | + } elseif ( $user_can_register ) { | |
| 125 | + $output = sprintf( | |
| 126 | + '<input type="checkbox" name="checkout-email-option" value="new-account"> <span>%s</span>', | |
| 127 | + __( | |
| 128 | + 'Create a new account with this email. The account information will be sent with this email.', | |
| 129 | + 'learnpress' | |
| 130 | + ) | |
| 131 | + ); | |
| 132 | + } else { | |
| 133 | + $output = __( 'The system does not allow the creation of a new account, you must enter an existing account.', 'learnpress' ); | |
| 134 | + } | |
| 104 | 135 | |
| 105 | - public static function checkout_user_email_exists() { | |
| 106 | - $email = LP_Request::get_email( 'email' ); | |
| 107 | - $response = array( | |
| 108 | - 'exists' => 0, | |
| 109 | - ); | |
| 110 | - | |
| 111 | - if ( email_exists( $email ) ) { | |
| 112 | - $response['exists'] = $email; | |
| 113 | - $output = '<div class="lp-guest-checkout-output">' . __( | |
| 114 | - 'Your email already exists. Do you want to continue with this email?', | |
| 115 | - 'learnpress' | |
| 116 | - ) . '</div>'; | |
| 117 | - } else { | |
| 118 | - $output = '<label class="lp-guest-checkout-output"> | |
| 119 | - <input type="checkbox" name="checkout-email-option" value="new-account"> | |
| 120 | - ' . __( | |
| 121 | - 'Create a new account with this email. The account information will be sent with this email.', | |
| 122 | - 'learnpress' | |
| 123 | - ) . ' | |
| 124 | - </label>'; | |
| 136 | + $response->status = 'success'; | |
| 137 | + $response->data->content = Template::instance()->nest_elements( $html_wrapper, $output ); | |
| 138 | + } catch ( Throwable $e ) { | |
| 139 | + $response->message = $e->getMessage(); | |
| 125 | 140 | } |
| 126 | 141 | |
| 127 | - $response['output'] = apply_filters( 'learnpress/guest_checkout_email_exist_output', $output, $email ); | |
| 128 | - | |
| 129 | - learn_press_maybe_send_json( $response ); | |
| 142 | + wp_send_json( $response ); | |
| 130 | 143 | } |
| 131 | 144 | |
| 132 | 145 | /** |
| 133 | 146 | * Request finish course |
| @@ -134,52 +147,58 @@ | ||
| 134 | 147 | * |
| 135 | 148 | * TODO: should move this function to api - tungnx |
| 136 | 149 | */ |
| 137 | 150 | public static function finish_course() { |
| 138 | - $nonce = LP_Request::get_string( 'finish-course-nonce' ); | |
| 139 | - $course_id = LP_Request::get_int( 'course-id' ); | |
| 140 | - $course = learn_press_get_course( $course_id ); | |
| 141 | - $user = learn_press_get_current_user(); | |
| 151 | + $link_redirect = ''; | |
| 152 | + $message_data = [ | |
| 153 | + 'status' => 'error', | |
| 154 | + 'content' => '', | |
| 155 | + ]; | |
| 142 | 156 | |
| 143 | - $nonce_action = sprintf( 'finish-course-%d-%d', $course_id, $user->get_id() ); | |
| 157 | + try { | |
| 158 | + $nonce = LP_Request::get_param( 'finish-course-nonce', '', 'text', 'post' ); | |
| 159 | + $course_id = LP_Request::get_param( 'course-id', 0, 'int', 'post' ); | |
| 160 | + $courseModel = CourseModel::find( $course_id, true ); | |
| 161 | + $user_id = get_current_user_id(); | |
| 162 | + $userModel = UserModel::find( $user_id, true ); | |
| 144 | 163 | |
| 145 | - if ( ! $user->get_id() || ! $course || ! wp_verify_nonce( $nonce, $nonce_action ) ) { | |
| 146 | - wp_die( __( 'Access denied!', 'learnpress' ) ); | |
| 147 | - } | |
| 164 | + $nonce_action = sprintf( 'finish-course-%d-%d', $course_id, $user_id ); | |
| 165 | + if ( ! $courseModel || ! $userModel || ! wp_verify_nonce( $nonce, $nonce_action ) ) { | |
| 166 | + throw new Exception( __( 'Request is invalid!', 'learnpress' ) ); | |
| 167 | + } | |
| 148 | 168 | |
| 149 | - $finished = $user->finish_course( $course_id ); | |
| 150 | - $lp_redirect = LP_Settings::get_option( 'course_finish_redirect' ); | |
| 151 | - $redirect = ! empty( $lp_redirect ) ? $lp_redirect : get_the_permalink( $course_id ); | |
| 169 | + $userCourseModel = UserCourseModel::find( $user_id, $course_id, true ); | |
| 170 | + if ( ! $userCourseModel instanceof UserCourseModel ) { | |
| 171 | + throw new Exception( __( 'You have not enrolled in this course.', 'learnpress' ) ); | |
| 172 | + } | |
| 152 | 173 | |
| 153 | - $response = array( | |
| 154 | - 'redirect' => apply_filters( | |
| 155 | - 'learn-press/finish-course-redirect', | |
| 156 | - $redirect, | |
| 157 | - $course_id | |
| 158 | - ), | |
| 159 | - ); | |
| 174 | + $can_finish = $userCourseModel->can_finish(); | |
| 175 | + if ( is_wp_error( $can_finish ) ) { | |
| 176 | + throw new Exception( $can_finish->get_error_message() ); | |
| 177 | + } | |
| 160 | 178 | |
| 161 | - if ( $finished ) { | |
| 162 | - learn_press_update_user_item_meta( $finished, 'finishing_type', 'click' ); | |
| 163 | - learn_press_add_message( sprintf( __( 'You have finished this course "%s"', 'learnpress' ), $course->get_title() ) ); | |
| 164 | - $response['result'] = 'success'; | |
| 165 | - } else { | |
| 166 | - learn_press_add_message( __( 'Error! You cannot finish this course. Please contact your administrator for more information.', 'learnpress' ) ); | |
| 167 | - $response['result'] = 'error'; | |
| 179 | + $userCourseModel->handle_finish(); | |
| 180 | + $lp_redirect = LP_Settings::get_option( 'course_finish_redirect' ); | |
| 181 | + $link_redirect = ! empty( $lp_redirect ) ? $lp_redirect : $courseModel->get_permalink(); | |
| 182 | + $link_redirect = esc_url_raw( $link_redirect ); | |
| 183 | + $message_data['status'] = 'success'; | |
| 184 | + $message_data['content'] = __( 'Course has been finished successfully.', 'learnpress' ); | |
| 185 | + } catch ( Throwable $e ) { | |
| 186 | + $message_data['content'] = $e->getMessage(); | |
| 168 | 187 | } |
| 169 | 188 | |
| 170 | - learn_press_maybe_send_json( $response ); | |
| 171 | - | |
| 172 | - if ( ! empty( $response['redirect'] ) ) { | |
| 173 | - wp_redirect( $response['redirect'] ); | |
| 174 | - exit(); | |
| 189 | + learn_press_set_message( $message_data ); | |
| 190 | + if ( ! empty( $link_redirect ) ) { | |
| 191 | + wp_redirect( $link_redirect ); | |
| 192 | + die(); | |
| 175 | 193 | } |
| 176 | 194 | } |
| 177 | 195 | |
| 178 | 196 | /** |
| 179 | 197 | * Complete lesson |
| 198 | + * @deprecated 4.2.7.6 | |
| 180 | 199 | */ |
| 181 | - public static function complete_lesson() { | |
| 200 | + /*public static function complete_lesson() { | |
| 182 | 201 | $response = array( |
| 183 | 202 | 'result' => 'error', |
| 184 | 203 | 'redirect' => '', |
| 185 | 204 | ); |
| @@ -184,11 +203,12 @@ | ||
| 184 | 203 | 'redirect' => '', |
| 185 | 204 | ); |
| 186 | 205 | |
| 187 | 206 | try { |
| 188 | - $nonce = LP_Request::get_param( 'complete-lesson-nonce' ); | |
| 189 | - $lesson_id = LP_Request::get_param( 'id', 0, 'int' ); | |
| 190 | - $course_id = LP_Request::get_param( 'course_id', 0, 'int' ); | |
| 207 | + $nonce = LP_Request::get_param( 'complete-lesson-nonce' ); | |
| 208 | + $lesson_id = LP_Request::get_param( 'id', 0, 'int' ); | |
| 209 | + $course_id = LP_Request::get_param( 'course_id', 0, 'int' ); | |
| 210 | + $item_id_next = LP_Request::get_param( 'item_id_next', 0, 'int' ); | |
| 191 | 211 | |
| 192 | 212 | if ( ! wp_verify_nonce( $nonce, 'lesson-complete' ) ) { |
| 193 | 213 | throw new Exception( __( 'Error! Invalid lesson or failed security check.', 'learnpress' ) ); |
| 194 | 214 | } |
| @@ -212,10 +232,14 @@ | ||
| 212 | 232 | if ( ! $item instanceof LP_Course_Item ) { |
| 213 | 233 | throw new Exception( 'Item is invalid!', 'learnpress' ); |
| 214 | 234 | } |
| 215 | 235 | |
| 216 | - $result = $user->complete_lesson( $lesson_id, $course_id ); | |
| 217 | - $response['redirect'] = $course->get_item_link( $lesson_id ); | |
| 236 | + $result = $user->complete_lesson( $lesson_id, $course_id ); | |
| 237 | + if ( $item_id_next ) { | |
| 238 | + $response['redirect'] = $course->get_item_link( $item_id_next ); | |
| 239 | + } else { | |
| 240 | + $response['redirect'] = $item->get_permalink(); | |
| 241 | + } | |
| 218 | 242 | |
| 219 | 243 | if ( ! is_wp_error( $result ) ) { |
| 220 | 244 | if ( $course->get_next_item() ) { |
| 221 | 245 | $next = $course->get_next_item(); |
| @@ -246,9 +270,9 @@ | ||
| 246 | 270 | if ( ! empty( $response['redirect'] ) ) { |
| 247 | 271 | wp_redirect( $response['redirect'] ); |
| 248 | 272 | exit(); |
| 249 | 273 | } |
| 250 | - } | |
| 274 | + }*/ | |
| 251 | 275 | } |
| 252 | 276 | } |
| 253 | 277 | |
| 254 | 278 | LP_AJAX::init(); |