File "REST_Quiz.php"
Full Path: /home/dcqnetm/intuns/wp-content/plugins/tutor/restapi/REST_Quiz.php
File size: 5.52 KB
MIME-type: text/x-php
Charset: utf-8
<?php
/*
@REST API for quiz
@author : themeum
*/
namespace TUTOR;
use WP_REST_Request;
if(!defined ('ABSPATH'))
exit;
class REST_Quiz {
use REST_Response;
private $post_type = "tutor_quiz";
private $post_parent;
private $t_quiz_question = "tutor_quiz_questions";
private $t_quiz_ques_ans = "tutor_quiz_question_answers";
private $t_quiz_attempt = "tutor_quiz_attempts";
private $t_quiz_attempt_ans = "tutor_quiz_attempt_answers";
public function quiz_with_settings(WP_REST_Request $request) {
$this->post_parent = $request->get_param('id');
global $wpdb;
$table = $wpdb->prefix."posts";
$quizs = $wpdb->get_results(
$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)
);
$data = [];
if (count($quizs)>0) {
foreach ($quizs as $quiz) {
$quiz->quiz_settings = get_post_meta($quiz->ID,'tutor_quiz_option',false);
array_push($data, $quiz);
$response = array(
'status_code'=> 'success',
'message'=> __("Quiz retrieved successfully",'tutor'),
'data'=> $data
);
}
return self::send($response);
}
$response = array(
'status_code'=> 'not_found',
'message'=> __("Quiz not found for given ID",'tutor'),
'data'=> $data
);
return self::send($response);
}
public function quiz_question_ans(WP_REST_Request $request) {
global $wpdb;
$this->post_parent = $request->get_param('id');
$q_t = $wpdb->prefix.$this->t_quiz_question;//question table
$q_a_t = $wpdb->prefix.$this->t_quiz_ques_ans;//question answer table
$quizs = $wpdb->get_results(
$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)
);
$data = [];
if (count($quizs)>0) {
//get question ans by question_id
foreach ($quizs as $quiz) {
//unserialized question settings
$quiz->question_settings = maybe_unserialize($quiz->question_settings);
//question options with correct ans
$options = $wpdb->get_results(
$wpdb->prepare("SELECT answer_title,is_correct FROM $q_a_t WHERE belongs_question_id = %d", $quiz->question_id)
);
//set question_answers as quiz property
$quiz->question_answers = $options;
array_push($data, $quiz);
}
$response = array(
'status_code'=> 'success',
'message'=> __('Question retrieved successfully','tutor'),
'data'=> $data
);
return self::send($response);
}
$response = array(
'status_code'=> 'not_found',
'message'=> __('Question not found for given ID','tutor'),
'data'=> []
);
return self::send($response);
}
public function quiz_attempt_details(WP_REST_Request $request) {
$quiz_id = $request->get_param('id');
global $wpdb;
$quiz_attempt = $wpdb->prefix.$this->t_quiz_attempt;
$attempts = $wpdb->get_results(
$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)
);
if (count($attempts)>0) {
//unserialize each attempt info
foreach ($attempts as $key => $attempt) {
$attempt->attempt_info = maybe_unserialize($attempt->attempt_info);
//attach attempt ans
$answers = $this->get_quiz_attemp_ans($quiz_id);
if($answers !==false)
{
$attempt->attempts_answer = $answers;
}
else
{
$attempt->attempts_answer = [];
}
}
$response = array(
'status_code'=> 'success',
'message'=> __('Quiz attempts retrieved successfully','tutor'),
'data'=> $attempts
);
return self::send($response);
}
$response = array(
'status_code'=> 'not_found',
'message'=> __('Quiz attempts not found for given ID','tutor'),
'data'=> []
);
return self::send($response);
}
/*
*required quiz_id
*return attempts ans
*/
protected function get_quiz_attemp_ans($quiz_id) {
global $wpdb;
$quiz_attempt_ans = $wpdb->prefix.$this->t_quiz_attempt_ans;
$quiz_question = $wpdb->prefix.$this->t_quiz_question;
//get attempt answers
$answers = $wpdb->get_results(
$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)
);
if (count($answers)>0) {
//unserialize each given answer
foreach ($answers as $key => $answer) {
$answer->given_answer = maybe_unserialize($answer->given_answer);
if(is_numeric($answer->given_answer) || is_array($answer->given_answer))
{
$ids = $answer->given_answer;
$ans_title = $this->answer_titles_by_id($ids);
$answer->given_answer = $ans_title;
}
}
return $answers;
}
return false;
}
/*
*require ids (1,2,3)
*return results containing answer title
*/
protected function answer_titles_by_id($id) {
global $wpdb;
$table = $wpdb->prefix.$this->t_quiz_ques_ans;
if(is_array($id)) {
$string = implode(',', $id);
$array=array_map('intval', explode(',', $string));
$array = implode("','",$array);
$results = $wpdb->get_results(
"SELECT answer_title FROM $table WHERE answer_id IN ('".$array."')"
);
} else {
$results = $wpdb->get_results(
"SELECT answer_title FROM $table WHERE answer_id = {$id}"
);
}
return $results;
}
}