REST_Author.php
5 years ago
REST_Course.php
4 years ago
REST_Course_Announcement.php
5 years ago
REST_Lesson.php
5 years ago
REST_Quiz.php
5 years ago
REST_Rating.php
5 years ago
REST_Response.php
5 years ago
REST_Topic.php
5 years ago
REST_Quiz.php
211 lines
| 1 | <?php |
| 2 | /* |
| 3 | @REST API for quiz |
| 4 | @author : themeum |
| 5 | */ |
| 6 | |
| 7 | namespace TUTOR; |
| 8 | use WP_REST_Request; |
| 9 | |
| 10 | if(!defined ('ABSPATH')) |
| 11 | exit; |
| 12 | |
| 13 | class REST_Quiz { |
| 14 | |
| 15 | use REST_Response; |
| 16 | |
| 17 | private $post_type = "tutor_quiz"; |
| 18 | private $post_parent; |
| 19 | private $t_quiz_question = "tutor_quiz_questions"; |
| 20 | private $t_quiz_ques_ans = "tutor_quiz_question_answers"; |
| 21 | private $t_quiz_attempt = "tutor_quiz_attempts"; |
| 22 | private $t_quiz_attempt_ans = "tutor_quiz_attempt_answers"; |
| 23 | |
| 24 | public function quiz_with_settings(WP_REST_Request $request) { |
| 25 | $this->post_parent = $request->get_param('id'); |
| 26 | |
| 27 | global $wpdb; |
| 28 | |
| 29 | $table = $wpdb->prefix."posts"; |
| 30 | |
| 31 | $quizs = $wpdb->get_results( |
| 32 | $wpdb->prepare("SELECT ID, post_title, post_content, post_name FROM $table WHERE post_type = %s AND post_parent = %d", $this->post_type, $this->post_parent) |
| 33 | ); |
| 34 | |
| 35 | $data = []; |
| 36 | |
| 37 | if (count($quizs)>0) { |
| 38 | foreach ($quizs as $quiz) { |
| 39 | $quiz->quiz_settings = get_post_meta($quiz->ID,'tutor_quiz_option',false); |
| 40 | |
| 41 | array_push($data, $quiz); |
| 42 | |
| 43 | $response = array( |
| 44 | 'status_code'=> 'success', |
| 45 | 'message'=> __("Quiz retrieved successfully",'tutor'), |
| 46 | 'data'=> $data |
| 47 | ); |
| 48 | } |
| 49 | return self::send($response); |
| 50 | } |
| 51 | $response = array( |
| 52 | 'status_code'=> 'not_found', |
| 53 | 'message'=> __("Quiz not found for given ID",'tutor'), |
| 54 | 'data'=> $data |
| 55 | ); |
| 56 | return self::send($response); |
| 57 | } |
| 58 | |
| 59 | public function quiz_question_ans(WP_REST_Request $request) { |
| 60 | global $wpdb; |
| 61 | |
| 62 | $this->post_parent = $request->get_param('id'); |
| 63 | |
| 64 | |
| 65 | $q_t = $wpdb->prefix.$this->t_quiz_question;//question table |
| 66 | |
| 67 | $q_a_t = $wpdb->prefix.$this->t_quiz_ques_ans;//question answer table |
| 68 | |
| 69 | $quizs = $wpdb->get_results( |
| 70 | $wpdb->prepare("SELECT question_id,question_title, question_description, question_type, question_mark, question_settings FROM $q_t WHERE quiz_id = %d", $this->post_parent) |
| 71 | ); |
| 72 | $data = []; |
| 73 | |
| 74 | if (count($quizs)>0) { |
| 75 | |
| 76 | //get question ans by question_id |
| 77 | foreach ($quizs as $quiz) { |
| 78 | //unserialized question settings |
| 79 | $quiz->question_settings = maybe_unserialize($quiz->question_settings); |
| 80 | |
| 81 | //question options with correct ans |
| 82 | $options = $wpdb->get_results( |
| 83 | $wpdb->prepare("SELECT answer_title,is_correct FROM $q_a_t WHERE belongs_question_id = %d", $quiz->question_id) |
| 84 | ); |
| 85 | |
| 86 | //set question_answers as quiz property |
| 87 | $quiz->question_answers = $options; |
| 88 | |
| 89 | array_push($data, $quiz); |
| 90 | } |
| 91 | |
| 92 | $response = array( |
| 93 | 'status_code'=> 'success', |
| 94 | 'message'=> __('Question retrieved successfully','tutor'), |
| 95 | 'data'=> $data |
| 96 | ); |
| 97 | |
| 98 | return self::send($response); |
| 99 | } |
| 100 | |
| 101 | $response = array( |
| 102 | 'status_code'=> 'not_found', |
| 103 | 'message'=> __('Question not found for given ID','tutor'), |
| 104 | 'data'=> [] |
| 105 | ); |
| 106 | |
| 107 | return self::send($response); |
| 108 | } |
| 109 | |
| 110 | public function quiz_attempt_details(WP_REST_Request $request) { |
| 111 | $quiz_id = $request->get_param('id'); |
| 112 | |
| 113 | global $wpdb; |
| 114 | $quiz_attempt = $wpdb->prefix.$this->t_quiz_attempt; |
| 115 | |
| 116 | $attempts = $wpdb->get_results( |
| 117 | $wpdb->prepare("SELECT att.user_id,att.total_questions,att.total_answered_questions,att.total_marks,att.earned_marks,att.attempt_info,att.attempt_status,att.attempt_started_at,att.attempt_ended_at,att.is_manually_reviewed,att.manually_reviewed_at FROM $quiz_attempt att WHERE att.quiz_id = %d", $quiz_id) |
| 118 | ); |
| 119 | |
| 120 | if (count($attempts)>0) { |
| 121 | //unserialize each attempt info |
| 122 | foreach ($attempts as $key => $attempt) { |
| 123 | $attempt->attempt_info = maybe_unserialize($attempt->attempt_info); |
| 124 | //attach attempt ans |
| 125 | $answers = $this->get_quiz_attemp_ans($quiz_id); |
| 126 | |
| 127 | if($answers !==false) |
| 128 | { |
| 129 | $attempt->attempts_answer = $answers; |
| 130 | } |
| 131 | else |
| 132 | { |
| 133 | $attempt->attempts_answer = []; |
| 134 | } |
| 135 | |
| 136 | } |
| 137 | |
| 138 | $response = array( |
| 139 | 'status_code'=> 'success', |
| 140 | 'message'=> __('Quiz attempts retrieved successfully','tutor'), |
| 141 | 'data'=> $attempts |
| 142 | ); |
| 143 | |
| 144 | return self::send($response); |
| 145 | } |
| 146 | $response = array( |
| 147 | 'status_code'=> 'not_found', |
| 148 | 'message'=> __('Quiz attempts not found for given ID','tutor'), |
| 149 | 'data'=> [] |
| 150 | ); |
| 151 | |
| 152 | return self::send($response); |
| 153 | } |
| 154 | |
| 155 | /* |
| 156 | *required quiz_id |
| 157 | *return attempts ans |
| 158 | */ |
| 159 | protected function get_quiz_attemp_ans($quiz_id) { |
| 160 | global $wpdb; |
| 161 | $quiz_attempt_ans = $wpdb->prefix.$this->t_quiz_attempt_ans; |
| 162 | $quiz_question = $wpdb->prefix.$this->t_quiz_question; |
| 163 | //get attempt answers |
| 164 | $answers = $wpdb->get_results( |
| 165 | $wpdb->prepare("SELECT q.question_title,att_ans.given_answer,att_ans.question_mark,att_ans.achieved_mark,att_ans.minus_mark,att_ans.is_correct FROM $quiz_attempt_ans as att_ans JOIN $quiz_question q ON q.question_id = att_ans.question_id WHERE att_ans.quiz_id = %d",$quiz_id) |
| 166 | ); |
| 167 | |
| 168 | if (count($answers)>0) { |
| 169 | //unserialize each given answer |
| 170 | foreach ($answers as $key => $answer) { |
| 171 | $answer->given_answer = maybe_unserialize($answer->given_answer); |
| 172 | |
| 173 | if(is_numeric($answer->given_answer) || is_array($answer->given_answer)) |
| 174 | { |
| 175 | $ids = $answer->given_answer; |
| 176 | $ans_title = $this->answer_titles_by_id($ids); |
| 177 | $answer->given_answer = $ans_title; |
| 178 | } |
| 179 | } |
| 180 | |
| 181 | return $answers; |
| 182 | } |
| 183 | return false; |
| 184 | } |
| 185 | |
| 186 | /* |
| 187 | *require ids (1,2,3) |
| 188 | *return results containing answer title |
| 189 | */ |
| 190 | protected function answer_titles_by_id($id) { |
| 191 | global $wpdb; |
| 192 | $table = $wpdb->prefix.$this->t_quiz_ques_ans; |
| 193 | |
| 194 | if(is_array($id)) { |
| 195 | $string = implode(',', $id); |
| 196 | $array=array_map('intval', explode(',', $string)); |
| 197 | $array = implode("','",$array); |
| 198 | |
| 199 | $results = $wpdb->get_results( |
| 200 | "SELECT answer_title FROM $table WHERE answer_id IN ('".$array."')" |
| 201 | ); |
| 202 | } else { |
| 203 | $results = $wpdb->get_results( |
| 204 | "SELECT answer_title FROM $table WHERE answer_id = {$id}" |
| 205 | ); |
| 206 | } |
| 207 | |
| 208 | return $results; |
| 209 | } |
| 210 | } |
| 211 |