PageRenderTime 47ms CodeModel.GetById 8ms RepoModel.GetById 1ms app.codeStats 0ms

/wp-content/plugins/learnpress/inc/quiz/class-lp-quiz-factory.php

https://gitlab.com/gregtyka/lfmawordpress
PHP | 255 lines | 228 code | 22 blank | 5 comment | 31 complexity | 058e5d0984dd2f56ed88ee3ff51ae8c1 MD5 | raw file
  1. <?php
  2. class LP_Quiz_Factory {
  3. static $user = null;
  4. static $quiz = null;
  5. static function init() {
  6. $actions = array(
  7. 'start-quiz' => 'start_quiz',
  8. 'finish-quiz' => 'finish_quiz',
  9. 'retake-quiz' => 'retake_quiz',
  10. 'check-question' => 'check_question'
  11. );
  12. foreach ( $actions as $k => $v ) {
  13. LP_Request_Handler::register_ajax( $k, array( __CLASS__, $v ) );
  14. }
  15. /*
  16. add_action( 'learn_press_before_user_start_quiz', array( __CLASS__, 'xxx' ), 5, 3 );
  17. add_action( 'init', array( __CLASS__, 'yyy' ) );
  18. add_action( 'init', array( __CLASS__, '_delete_anonymous_users' ) );*/
  19. }
  20. static function yyy() {
  21. $user = learn_press_get_current_user();
  22. if ( $user instanceof LP_User_Guest ) {
  23. $expire = get_user_meta( $user->id, '_lp_anonymous_user_expire', true );
  24. $current = time();
  25. if ( ( $current - ( $expire - 60 ) ) < 10 ) {
  26. update_user_meta( $user->id, '_lp_anonymous_user_expire', $current + 60 );
  27. }
  28. }
  29. }
  30. static function _delete_anonymous_users() {
  31. global $wpdb;
  32. $sql = $wpdb->prepare( "
  33. DELETE a, b FROM $wpdb->users a, $wpdb->usermeta b
  34. WHERE a.ID = b.user_id
  35. AND b.meta_key = %s
  36. AND b.meta_value < %d
  37. ", '_lp_anonymous_user_expire', time() );
  38. //$wpdb->query( $sql );
  39. }
  40. static function xxx( $start, $quiz_id, $user_id ) {
  41. $start = false;
  42. $x = 60;
  43. $expire = $x + time();
  44. $user = get_user_by( 'id', $user_id );
  45. if ( $user ) {
  46. if ( $expire_time = get_user_meta( $user_id, '_lp_anonymous_user_expire', true ) ) {
  47. $current_time = time();
  48. if ( $expire_time - $current_time <= 0 ) {
  49. update_user_meta( $user_id, '_lp_anonymous_user_expire', $expire );
  50. }
  51. }
  52. return $start;
  53. }
  54. $new_user_id = wp_create_user( uniqid( 'user_' . time() ), '12345' );
  55. if ( $new_user_id ) {
  56. global $wpdb;
  57. if ( $wpdb->update( $wpdb->users, array( 'ID' => $user_id ), array( 'ID' => $new_user_id ) ) ) {
  58. update_user_meta( $user_id, '_lp_anonymous_user_expire', $expire );
  59. }
  60. }
  61. return $start;
  62. }
  63. static function start_quiz() {
  64. $quiz_id = learn_press_get_request( 'quiz_id' );
  65. $response = array( 'result' => 'success' );
  66. $quiz = LP_Quiz::get_quiz( $quiz_id );
  67. self::_verify_nonce();
  68. LP()->set_object( 'quiz', $quiz, true );
  69. $user = learn_press_get_current_user();
  70. if ( $quiz->is_require_enrollment() && $user->is( 'guest' ) ) {
  71. learn_press_send_json(
  72. array(
  73. 'result' => 'error',
  74. 'message' => array( 'title' => __( 'Error', 'learnpress' ), 'message' => __( 'You need to login to do this quiz.', 'learnpress' ) )
  75. )
  76. );
  77. }
  78. if ( learn_press_get_request( 'preview' ) == 'true' ) {
  79. learn_press_send_json(
  80. array(
  81. 'result' => 'error',
  82. 'message' => array( 'title' => __( 'Error', 'learnpress' ), 'message' => __( 'You can not start quiz in preview mode.', 'learnpress' ) )
  83. )
  84. );
  85. }
  86. if ( $quiz->is_require_enrollment() && $user->is( 'guest' ) ) {
  87. learn_press_send_json(
  88. array(
  89. 'result' => 'error',
  90. 'message' => array( 'title' => __( 'Error', 'learnpress' ), 'message' => __( 'You need to login to do this quiz.', 'learnpress' ) )
  91. )
  92. );
  93. }
  94. $user->set_quiz( $quiz );
  95. switch ( strtolower( $user->get_quiz_status( $quiz_id ) ) ) {
  96. case 'completed':
  97. learn_press_send_json(
  98. array(
  99. 'result' => 'error',
  100. 'message' => array( 'title' => __( 'Error', 'learnpress' ), 'message' => __( 'You have completed this quiz', 'learnpress' ) ),
  101. 'data' => $user->get_quiz_result(),
  102. 'redirect' => $quiz->permalink
  103. )
  104. );
  105. break;
  106. case 'started':
  107. learn_press_send_json(
  108. array(
  109. 'result' => 'error',
  110. 'message' => array( 'title' => __( 'Error', 'learnpress' ), 'message' => __( 'You have started this quiz', 'learnpress' ) ),
  111. 'data' => array(
  112. 'status' => $user->get_quiz_status()
  113. ),
  114. 'redirect' => $quiz->permalink
  115. )
  116. );
  117. break;
  118. default:
  119. $result = $user->start_quiz();
  120. $current_question = !empty( $result['current_question'] ) ? $result['current_question'] : $user->get_current_question_id( $quiz_id );
  121. $question = LP_Question_Factory::get_question( $current_question );
  122. if ( $question ) {
  123. $quiz->current_question = $question;
  124. ob_start();
  125. $question->render();
  126. $content = ob_get_clean();
  127. } else {
  128. $content = '';
  129. }
  130. learn_press_send_json(
  131. array(
  132. 'result' => $result === false ? 'fail' : 'success',
  133. 'message' => $result === false ? array(
  134. 'title' => __( 'Error', 'learnpress' ),
  135. 'message' => __( 'Start quiz failed', 'learnpress' )
  136. ) : '',
  137. 'data' => $result,
  138. 'question' =>
  139. array(
  140. 'id' => $current_question,
  141. 'permalink' => learn_press_get_user_question_url( $quiz_id, $current_question ),
  142. 'content' => $content
  143. )
  144. )
  145. );
  146. }
  147. learn_press_send_json( $response );
  148. }
  149. static function finish_quiz() {
  150. $quiz_id = learn_press_get_request( 'quiz_id' );
  151. $quiz = LP_Quiz::get_quiz( $quiz_id );
  152. $user = learn_press_get_current_user();
  153. self::_verify_nonce();
  154. LP()->set_object( 'quiz', $quiz, true );
  155. if ( $user->get_quiz_status( $quiz->id ) != 'completed' ) {
  156. $user->finish_quiz( $quiz_id );
  157. $response = array(
  158. 'redirect' => get_the_permalink( $quiz_id )
  159. );
  160. learn_press_send_json( $response );
  161. }
  162. }
  163. static function retake_quiz() {
  164. $quiz_id = learn_press_get_request( 'quiz_id' );
  165. $user = learn_press_get_current_user();
  166. self::_verify_nonce();
  167. LP()->set_object( 'quiz', LP_Quiz::get_quiz( $quiz_id ), true );
  168. if ( $user->get_quiz_status( $quiz_id ) == 'completed' ) {
  169. $response = $user->retake_quiz( $quiz_id );
  170. learn_press_send_json( $response );
  171. }
  172. learn_press_send_json(
  173. array(
  174. 'result' => 'error',
  175. 'message' => array(
  176. 'title' => __( 'Error', 'learnpress' ),
  177. 'message' => __( 'You can not retake this quiz', 'learnpress' )
  178. )
  179. )
  180. );
  181. }
  182. static function check_question() {
  183. self::_verify_nonce();
  184. $user_id = learn_press_get_request( 'user_id' );
  185. $quiz_id = learn_press_get_request( 'quiz_id' );
  186. $question_id = learn_press_get_request( 'question_id' );
  187. $user = learn_press_get_user( $user_id );
  188. $quiz = LP_Quiz::get_quiz( $quiz_id );
  189. LP()->set_object( 'quiz', $quiz, true );
  190. $question_answer = LP_Question_Factory::save_question_if_needed( $question_id, $quiz_id, $user_id );
  191. if ( !$quiz || !$quiz->id ) {
  192. return;
  193. }
  194. if ( $quiz->show_check_answer != 'yes' ) {
  195. return;
  196. }
  197. if ( $quiz ) {
  198. $quiz->check_question( $question_id, $user );
  199. }
  200. if ( $question_id && $question = LP_Question_Factory::get_question( $question_id ) ) {
  201. $include = apply_filters( 'learn_press_check_question_answers_include_fields', null, $question_id, $quiz_id, $user_id );
  202. $exclude = apply_filters( 'learn_press_check_question_answers_exclude_fields', array( 'text' ), $question_id, $quiz_id, $user_id );
  203. $checked = $question->get_answers( $include, $exclude );
  204. if ( $checked ) {
  205. $checked = array_values( $checked );
  206. }
  207. } else {
  208. $checked = false;
  209. }
  210. $checked = apply_filters( 'learn_press_check_question_answers', $checked, $question_id, $quiz_id, $user_id );
  211. $response = array(
  212. 'result' => 'success',
  213. 'checked' => $checked,
  214. 'answered' => $question_answer
  215. );
  216. learn_press_send_json( $response );
  217. }
  218. static function _verify_nonce() {
  219. $quiz_id = learn_press_get_request( 'quiz_id' );
  220. $user_id = learn_press_get_current_user_id();
  221. $security = learn_press_get_request( 'nonce' );
  222. $quiz = LP_Quiz::get_quiz( $quiz_id );
  223. if ( !wp_verify_nonce( $security, 'learn-press-quiz-action-' . $quiz_id . '-' . $user_id ) || !$quiz->id ) {
  224. learn_press_send_json(
  225. array(
  226. 'result' => 'error',
  227. 'message' => array( 'title' => __( 'Error', 'learnpress' ), 'message' => __( 'Please contact site\'s administrator for more information.', 'learnpress' ) )
  228. )
  229. );
  230. }
  231. }
  232. }
  233. LP_Quiz_Factory::init();