PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 1.4.1
Tutor LMS – eLearning and online course solution v1.4.1
3.9.15 3.9.14 3.9.13 3.9.12 3.9.11 trunk 1.0.0 1.0.0-alpha 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.1.0 1.1.1 1.2.0 1.2.1 1.2.11 1.2.12 1.2.13 1.2.20 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 1.7.3 1.7.4 1.7.5 1.7.6 1.7.7 1.7.8 1.7.9 1.8.0 1.8.1 1.8.10 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9.0 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.14 1.9.15 1.9.16 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.1 2.0.10 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 2.1.0 2.1.1 2.1.10 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.3.0 2.4.0 2.5.0 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 3.0.0 3.0.1 3.0.2 3.1.0 3.2.0 3.2.1 3.2.2 3.2.3 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.7.0 3.7.1 3.7.2 3.7.3 3.7.4 3.8.0 3.8.1 3.8.2 3.8.3 3.9.0 3.9.1 3.9.10 3.9.2 3.9.3 3.9.4 3.9.5 3.9.6 3.9.7 3.9.8 3.9.9
tutor / classes / Quiz.php
tutor / classes Last commit date
Addons.php 6 years ago Admin.php 6 years ago Ajax.php 6 years ago Assets.php 6 years ago Course.php 6 years ago Course_Settings_Tabs.php 6 years ago Course_Widget.php 6 years ago Dashboard.php 6 years ago Gutenberg.php 6 years ago Instructor.php 6 years ago Instructors_List.php 6 years ago Lesson.php 6 years ago Options.php 6 years ago Post_types.php 6 years ago Q_and_A.php 6 years ago Question.php 6 years ago Question_Answers_List.php 6 years ago Quiz.php 6 years ago Quiz_Attempts_List.php 6 years ago Rewrite_Rules.php 6 years ago Shortcode.php 6 years ago Student.php 6 years ago Students_List.php 6 years ago Taxonomies.php 6 years ago Template.php 6 years ago Theme_Compatibility.php 6 years ago Tools.php 6 years ago Tutor.php 6 years ago TutorEDD.php 6 years ago Tutor_Base.php 6 years ago Tutor_List_Table.php 6 years ago Upgrader.php 6 years ago User.php 6 years ago Utils.php 6 years ago Video_Stream.php 6 years ago Withdraw.php 6 years ago Withdraw_Requests_List.php 6 years ago WooCommerce.php 6 years ago
Quiz.php
1125 lines
1 <?php
2
3 /**
4 * Quize class
5 *
6 * @author: themeum
7 * @author_uri: https://themeum.com
8 * @package Tutor
9 * @since v.1.0.0
10 */
11
12 namespace TUTOR;
13
14 if ( ! defined( 'ABSPATH' ) )
15 exit;
16
17 class Quiz {
18
19 public function __construct() {
20 add_filter( "manage_tutor_quiz_posts_columns", array($this, 'add_column'), 10,1 );
21 add_action( "manage_tutor_quiz_posts_custom_column" , array($this, 'custom_question_column'), 10, 2 );
22
23 add_action( 'add_meta_boxes', array($this, 'register_meta_box') );
24 add_action('save_post_tutor_quiz', array($this, 'save_quiz_meta'));
25
26 //Depricated at alpha version
27 add_action('wp_ajax_tutor_load_quiz_modal', array($this, 'tutor_load_quiz_modal'));
28
29 add_action('wp_ajax_tutor_load_quiz_builder_modal', array($this, 'tutor_load_quiz_builder_modal'));
30 add_action('wp_ajax_tutor_add_quiz_to_post', array($this, 'tutor_add_quiz_to_post'));
31 add_action('wp_ajax_remove_quiz_from_post', array($this, 'remove_quiz_from_post'));
32
33 add_action('wp_ajax_tutor_quiz_timeout', array($this, 'tutor_quiz_timeout'));
34
35 //User take the quiz
36 add_action('template_redirect', array($this, 'start_the_quiz'));
37 add_action('template_redirect', array($this, 'answering_quiz'));
38 add_action('template_redirect', array($this, 'finishing_quiz_attempt'));
39
40 add_action('admin_action_review_quiz_answer', array($this, 'review_quiz_answer'));
41 add_action('wp_ajax_review_quiz_answer', array($this, 'review_quiz_answer'));
42
43 /**
44 * New Design Quiz
45 */
46
47 add_action('wp_ajax_tutor_create_quiz_and_load_modal', array($this, 'tutor_create_quiz_and_load_modal'));
48 add_action('wp_ajax_tutor_delete_quiz_by_id', array($this, 'tutor_delete_quiz_by_id'));
49 add_action('wp_ajax_tutor_quiz_builder_quiz_update', array($this, 'tutor_quiz_builder_quiz_update'));
50 add_action('wp_ajax_tutor_load_edit_quiz_modal', array($this, 'tutor_load_edit_quiz_modal'));
51 add_action('wp_ajax_tutor_quiz_builder_get_question_form', array($this, 'tutor_quiz_builder_get_question_form'));
52 add_action('wp_ajax_tutor_quiz_modal_update_question', array($this, 'tutor_quiz_modal_update_question'));
53 add_action('wp_ajax_tutor_quiz_builder_question_delete', array($this, 'tutor_quiz_builder_question_delete'));
54 add_action('wp_ajax_tutor_quiz_add_question_answers', array($this, 'tutor_quiz_add_question_answers'));
55 add_action('wp_ajax_tutor_quiz_edit_question_answer', array($this, 'tutor_quiz_edit_question_answer'));
56 add_action('wp_ajax_tutor_save_quiz_answer_options', array($this, 'tutor_save_quiz_answer_options'));
57 add_action('wp_ajax_tutor_update_quiz_answer_options', array($this, 'tutor_update_quiz_answer_options'));
58 add_action('wp_ajax_tutor_quiz_builder_get_answers_by_question', array($this, 'tutor_quiz_builder_get_answers_by_question'));
59 add_action('wp_ajax_tutor_quiz_builder_delete_answer', array($this, 'tutor_quiz_builder_delete_answer'));
60 add_action('wp_ajax_tutor_quiz_question_sorting', array($this, 'tutor_quiz_question_sorting'));
61 add_action('wp_ajax_tutor_quiz_answer_sorting', array($this, 'tutor_quiz_answer_sorting'));
62 add_action('wp_ajax_tutor_mark_answer_as_correct', array($this, 'tutor_mark_answer_as_correct'));
63 add_action('wp_ajax_tutor_quiz_modal_update_settings', array($this, 'tutor_quiz_modal_update_settings'));
64
65
66
67 /**
68 * Frontend Stuff
69 */
70
71 add_action('wp_ajax_tutor_render_quiz_content', array($this, 'tutor_render_quiz_content'));
72
73 }
74
75 public function add_column($columns){
76 $date_col = $columns['date'];
77 unset($columns['date']);
78 $columns['quiz'] = __('Course', 'tutor');
79 $columns['questions'] = __('Questions', 'tutor');
80 $columns['date'] = $date_col;
81
82 return $columns;
83 }
84
85 public function custom_question_column($column, $post_id ){
86 if ($column === 'quiz'){
87 $quiz = tutor_utils()->get_course_by_quiz($post_id);
88
89 if ($quiz){
90 echo '<a href="'.admin_url('post.php?post='.$quiz->ID.'&action=edit').'">'.get_the_title($quiz->ID).'</a>';
91 }
92 }
93
94 if ($column === 'questions'){
95 echo tutor_utils()->total_questions_for_student_by_quiz($post_id);
96 }
97 }
98
99 public function register_meta_box(){
100 add_meta_box( 'tutor-quiz-questions', __( 'Questions', 'tutor' ), array($this, 'quiz_questions'), 'tutor_quiz' );
101 add_meta_box( 'tutor-quiz-settings', __( 'Settings', 'tutor' ), array($this, 'quiz_settings'), 'tutor_quiz' );
102 }
103
104 public function quiz_questions(){
105 include tutor()->path.'views/metabox/quiz_questions.php';
106 }
107
108 public function quiz_settings(){
109 include tutor()->path.'views/metabox/quizzes.php';
110 }
111
112 public function save_quiz_meta($post_ID){
113 if (isset($_POST['quiz_option'])){
114 $quiz_option = tutor_utils()->sanitize_array($_POST['quiz_option']);
115 update_post_meta($post_ID, 'tutor_quiz_option', $quiz_option);
116 }
117 }
118
119 /**
120 * @depricated at alpha version
121 * Check tutor_load_quiz_builder_modal instead of this method
122 */
123 public function tutor_load_quiz_modal(){
124 $quiz_for_post_id = (int) sanitize_text_field($_POST['quiz_for_post_id']);
125
126 $search_terms = sanitize_text_field(tutor_utils()->avalue_dot('search_terms', $_POST));
127 $quizzes = tutor_utils()->get_unattached_quiz(array('search_term' => $search_terms));
128
129 $output = '';
130 if ($quizzes){
131 foreach ($quizzes as $quiz){
132 $output .= "<p><label><input type='checkbox' name='quiz_for[{$quiz_for_post_id}][quiz_id][]' value='{$quiz->ID}' > {$quiz->post_title} </label></p>";
133 }
134 $output .= '<p class="quiz-search-suggest-text">Search the quiz to get specific quiz</p>';
135 }else{
136 $add_question_url = admin_url('post-new.php?post_type=tutor_quiz');
137 $output .= sprintf('No quiz available right now, please %s add some quiz %s', '<a href="'.$add_question_url.'" target="_blank">', '</a>' );
138 }
139
140 ob_start();
141 ?>
142 <div class="tutor-option-field-row">
143 <div class="tutor-option-field-label">
144 <label for="">
145 <?php _e('New quiz title', 'tutor'); ?>
146 </label>
147 </div>
148 <div class="tutor-option-field">
149 <input type="text" name="quiz_title" placeholder="<?php _e('Place quiz title to create new quiz', 'tutor'); ?>" >
150 <p class="desc"><?php _e('Provide a quiz title to create a quiz from here.'); ?></p>
151 </div>
152 </div>
153
154 <?php
155 $output .= ob_get_clean();
156
157 wp_send_json_success(array('output' => $output));
158 }
159
160 /**
161 * Tutor Quiz Builder Modal
162 */
163 public function tutor_load_quiz_builder_modal(){
164 ob_start();
165 include tutor()->path.'views/modal/add_quiz.php';
166 $output = ob_get_clean();
167
168 wp_send_json_success(array('output' => $output));
169
170 }
171
172 public function tutor_add_quiz_to_post(){
173 global $wpdb;
174
175 $quiz_data = tutor_utils()->avalue_dot('quiz_for', $_POST);
176
177 $output = '';
178 $post_id = (int) sanitize_text_field(tutor_utils()->avalue_dot('parent_post_id', $_POST)) ;
179 if ($quiz_data){
180 foreach ($quiz_data as $post_id => $quiz_ids_a);
181
182 $quiz_ids = tutor_utils()->avalue_dot('quiz_id', $quiz_ids_a);
183 foreach ($quiz_ids as $quiz_id){
184 $wpdb->update($wpdb->posts, array('post_parent' => $post_id), array('ID' => $quiz_id) );
185 }
186 }
187
188 $quiz_title = sanitize_text_field(tutor_utils()->avalue_dot('quiz_title', $_POST));
189 if ($quiz_title){
190 wp_insert_post(array(
191 'post_parent' => $post_id,
192 'post_title' => $quiz_title,
193 'post_type' => 'tutor_quiz',
194 'post_status' => 'publish',
195 ));
196 }
197
198 if ($post_id) {
199 ob_start();
200 $attached_quizzes = tutor_utils()->get_attached_quiz( $post_id );
201 if ( $attached_quizzes ) {
202 foreach ( $attached_quizzes as $attached_quiz ) {
203 ?>
204 <div id="added-quiz-id-<?php echo $attached_quiz->ID; ?>" class="added-quiz-item added-quiz-item-<?php echo $attached_quiz->ID; ?>" data-quiz-id="<?php echo $attached_quiz->ID; ?>">
205 <span class="quiz-icon"><i class="dashicons dashicons-clock"></i></span>
206 <span class="quiz-name">
207 <?php edit_post_link( $attached_quiz->post_title, null, null, $attached_quiz->ID ); ?>
208 </span>
209 <span class="quiz-control">
210 <a href="javascript:;" class="tutor-quiz-delete-btn"><i class="dashicons dashicons-trash"></i></a>
211 </span>
212 </div>
213 <?php
214 }
215 }
216 $output .= ob_get_clean();
217 }
218
219 wp_send_json_success(array('output' => $output));
220 }
221
222 public function remove_quiz_from_post(){
223 global $wpdb;
224 $quiz_id = (int) tutor_utils()->avalue_dot('quiz_id', $_POST);
225 $wpdb->update($wpdb->posts, array('post_parent' => 0), array('ID' => $quiz_id) );
226 wp_send_json_success();
227 }
228
229 /**
230 *
231 * Start Quiz from here...
232 *
233 * @since v.1.0.0
234 */
235
236 public function start_the_quiz(){
237 if ( ! isset($_POST['tutor_action']) || $_POST['tutor_action'] !== 'tutor_start_quiz' ){
238 return;
239 }
240 //Checking nonce
241 tutor_utils()->checking_nonce();
242
243 if ( ! is_user_logged_in()){
244 //TODO: need to set a view in the next version
245 die('Please sign in to do this operation');
246 }
247
248 global $wpdb;
249
250 $user_id = get_current_user_id();
251 $user = get_userdata($user_id);
252
253 $quiz_id = (int) sanitize_text_field($_POST['quiz_id']);
254
255 $quiz = get_post($quiz_id);
256 $course = tutor_utils()->get_course_by_quiz($quiz_id);
257 if ( empty($course->ID)){
258 die('There is something went wrong with course, please check if quiz attached with a course');
259 }
260
261 $date = date("Y-m-d H:i:s");
262
263 $tutor_quiz_option = (array) maybe_unserialize(get_post_meta($quiz_id, 'tutor_quiz_option', true));
264 $attempts_allowed = tutor_utils()->get_quiz_option($quiz_id, 'attempts_allowed', 0);
265
266 $time_limit = tutor_utils()->get_quiz_option($quiz_id, 'time_limit.time_value');
267 $time_limit_seconds = 0;
268 $time_type = 'seconds';
269 if ($time_limit){
270 $time_type = tutor_utils()->get_quiz_option($quiz_id, 'time_limit.time_type');
271
272 switch ($time_type){
273 case 'seconds':
274 $time_limit_seconds = $time_limit;
275 break;
276 case 'minutes':
277 $time_limit_seconds = $time_limit * 60;
278 break;
279 case 'hours':
280 $time_limit_seconds = $time_limit * 60 * 60;
281 break;
282 case 'days':
283 $time_limit_seconds = $time_limit * 60 * 60 * 24;
284 break;
285 case 'weeks':
286 $time_limit_seconds = $time_limit * 60 * 60 * 24 * 7;
287 break;
288 }
289 }
290
291 $max_question_allowed = tutor_utils()->max_questions_for_take_quiz($quiz_id);
292 $tutor_quiz_option['time_limit']['time_limit_seconds'] = $time_limit_seconds;
293
294 $attempt_data = array(
295 'course_id' => $course->ID,
296 'quiz_id' => $quiz_id,
297 'user_id' => $user_id,
298 'total_questions' => $max_question_allowed,
299 'total_answered_questions' => 0,
300 'attempt_info' => maybe_serialize($tutor_quiz_option),
301 'attempt_status' => 'attempt_started',
302 'attempt_ip' => tutor_utils()->get_ip(),
303 'attempt_started_at' => $date,
304 );
305
306 $wpdb->insert($wpdb->prefix.'tutor_quiz_attempts', $attempt_data);
307 $attempt_id = (int) $wpdb->insert_id;
308
309 wp_redirect(get_permalink($quiz_id));
310 die();
311 }
312
313 public function answering_quiz(){
314 if ( ! isset($_POST['tutor_action']) || $_POST['tutor_action'] !== 'tutor_answering_quiz_question' ){
315 return;
316 }
317 //Checking nonce
318 tutor_utils()->checking_nonce();
319
320 $attempt_id = (int) sanitize_text_field(tutor_utils()->avalue_dot('attempt_id', $_POST));
321 $attempt = tutor_utils()->get_attempt($attempt_id);
322
323 $attempt_answers = isset($_POST['attempt']) ? $_POST['attempt'] : false;
324 if ( ! is_user_logged_in()){
325 die('Please sign in to do this operation');
326 }
327
328 global $wpdb;
329 $user_id = get_current_user_id();
330
331 if ($attempt_answers && is_array($attempt_answers) && count($attempt_answers)){
332 foreach ($attempt_answers as $attempt_id => $attempt_answers){
333
334 /**
335 * Get total marks of all question comes
336 */
337 $question_ids = tutor_utils()->avalue_dot('quiz_question_ids', $attempt_answers);
338 if (is_array($question_ids) && count($question_ids)){
339 $question_ids_string = "'".implode("','", $question_ids)."'";
340 $total_question_marks = $wpdb->get_var("SELECT SUM(question_mark) FROM {$wpdb->prefix}tutor_quiz_questions WHERE question_id IN({$question_ids_string}) ;");
341 $wpdb->update($wpdb->prefix.'tutor_quiz_attempts', array('total_marks' =>$total_question_marks ), array('attempt_id' => $attempt_id ));
342 }
343
344 if ( ! $attempt || $user_id != $attempt->user_id){
345 die('Operation not allowed, attempt not found or permission denied');
346 }
347
348 $quiz_answers = tutor_utils()->avalue_dot('quiz_question', $attempt_answers);
349 $total_marks = 0;
350 foreach ($quiz_answers as $question_id => $answers){
351 $question = tutor_utils()->get_quiz_question_by_id($question_id);
352 $question_type = $question->question_type;
353
354 $is_answer_was_correct = false;
355 $given_answer = '';
356
357 if ($question_type === 'true_false' || $question_type === 'single_choice'){
358
359 $given_answer = $answers;
360 $is_answer_was_correct = (bool) $wpdb->get_var("SELECT is_correct FROM {$wpdb->prefix}tutor_quiz_question_answers WHERE answer_id = {$answers} ");
361
362 }elseif ($question_type === 'multiple_choice'){
363
364 $given_answer = maybe_serialize($answers);
365 $get_original_answers = (array) $wpdb->get_col("SELECT answer_id FROM {$wpdb->prefix}tutor_quiz_question_answers WHERE belongs_question_id = {$question->question_id} AND belongs_question_type = '{$question_type}' AND is_correct = 1 ;");
366 if (maybe_serialize($get_original_answers) == $given_answer){
367 $is_answer_was_correct = true;
368 }
369
370 }elseif ($question_type === 'fill_in_the_blank'){
371
372 $given_answer = (array) array_map('sanitize_text_field', $answers);
373 $given_answer = maybe_serialize($given_answer);
374
375 $get_original_answer = $wpdb->get_row("SELECT * FROM {$wpdb->prefix}tutor_quiz_question_answers WHERE belongs_question_id = {$question->question_id} AND belongs_question_type = '{$question_type}' ;");
376 $gap_answer = (array) explode('|', $get_original_answer->answer_two_gap_match);
377
378 $gap_answer = array_map('sanitize_text_field', $gap_answer);
379 if ($given_answer == maybe_serialize($gap_answer)){
380 $is_answer_was_correct = true;
381 }
382
383 }elseif ($question_type === 'open_ended' || $question_type === 'short_answer'){
384
385 $given_answer = wp_kses_post($answers);
386
387 }elseif ($question_type === 'ordering' || $question_type === 'matching'|| $question_type === 'image_matching' ){
388
389 $given_answer = (array) array_map('sanitize_text_field', tutor_utils()->avalue_dot('answers', $answers));
390 $given_answer = maybe_serialize($given_answer);
391
392 $get_original_answers = (array) $wpdb->get_col("SELECT answer_id FROM {$wpdb->prefix}tutor_quiz_question_answers WHERE belongs_question_id = {$question->question_id} AND belongs_question_type = '{$question_type}' ORDER BY answer_order ASC ;");
393 $get_original_answers = array_map('sanitize_text_field', $get_original_answers);
394
395 if ($given_answer == maybe_serialize($get_original_answers)){
396 $is_answer_was_correct = true;
397 }
398
399 }elseif ($question_type === 'image_answering'){
400 echo '<pre>';
401
402 $image_inputs = tutor_utils()->avalue_dot('answer_id', $answers);
403 $image_inputs = (array) array_map('sanitize_text_field', $image_inputs);
404 $given_answer = maybe_serialize($image_inputs);
405 $is_answer_was_correct = false;
406
407 $db_answer = $wpdb->get_col("SELECT answer_title FROM {$wpdb->prefix}tutor_quiz_question_answers WHERE belongs_question_id = {$question_id} AND belongs_question_type =
408 'image_answering' ORDER BY answer_order asc ;");
409
410 if (is_array($db_answer) && count($db_answer)){
411 $is_answer_was_correct = (strtolower(maybe_serialize(array_values($image_inputs))) == strtolower(maybe_serialize($db_answer)) );
412 }
413 }
414
415 $question_mark = $is_answer_was_correct ? $question->question_mark : 0;
416 $total_marks += $question_mark;
417
418 $answers_data = array(
419 'user_id' => $user_id,
420 'quiz_id' => $attempt->quiz_id,
421 'question_id' => $question_id,
422 'quiz_attempt_id' => $attempt_id,
423 'given_answer' => $given_answer,
424 'question_mark' => $question->question_mark,
425 'achieved_mark' => $question_mark,
426 'minus_mark' => 0,
427 'is_correct' => $is_answer_was_correct ? 1 : 0,
428 );
429 $wpdb->insert($wpdb->prefix.'tutor_quiz_attempt_answers', $answers_data);
430 }
431
432 $attempt_info = array(
433 'total_answered_questions' => count($quiz_answers),
434 'earned_marks' => $total_marks,
435 'attempt_status' => 'attempt_ended',
436 'attempt_ended_at' => date("Y-m-d H:i:s"),
437 );
438 $wpdb->update($wpdb->prefix.'tutor_quiz_attempts', $attempt_info, array('attempt_id' => $attempt_id));
439 }
440 }
441
442 wp_redirect(get_the_permalink($attempt->quiz_id));
443 die();
444 }
445
446
447 /**
448 * Quiz attempt will be finish here
449 *
450 */
451
452 public function finishing_quiz_attempt(){
453 if ( ! isset($_POST['tutor_action']) || $_POST['tutor_action'] !== 'tutor_finish_quiz_attempt' ){
454 return;
455 }
456 //Checking nonce
457 tutor_utils()->checking_nonce();
458
459 if ( ! is_user_logged_in()){
460 die('Please sign in to do this operation');
461 }
462
463 global $wpdb;
464
465 $quiz_id = (int) sanitize_text_field($_POST['quiz_id']);
466 $attempt = tutor_utils()->is_started_quiz($quiz_id);
467 $attempt_id = $attempt->attempt_id;
468
469 $attempt_info = array(
470 'total_answered_questions' => 0,
471 'earned_marks' => 0,
472 'attempt_status' => 'attempt_ended',
473 'attempt_ended_at' => date("Y-m-d H:i:s"),
474 );
475
476 do_action('tutor_quiz_before_finish', $attempt_id, $quiz_id, $attempt->user_id);
477 $wpdb->update($wpdb->prefix.'tutor_quiz_attempts', $attempt_info, array('attempt_id' => $attempt_id));
478 do_action('tutor_quiz_finished', $attempt_id, $quiz_id, $attempt->user_id);
479
480 wp_redirect(tutor_utils()->input_old('_wp_http_referer'));
481 }
482
483 /**
484 * Quiz timeout by ajax
485 */
486 public function tutor_quiz_timeout(){
487 global $wpdb;
488
489 $quiz_id = (int) sanitize_text_field($_POST['quiz_id']);
490 $attempt = tutor_utils()->is_started_quiz($quiz_id);
491
492 if ($attempt) {
493 $attempt_id = $attempt->attempt_id;
494
495 $data = array(
496 'attempt_status' => 'attempt_timeout',
497 'attempt_ended_at' => date("Y-m-d H:i:s"),
498 );
499 $wpdb->update($wpdb->prefix.'tutor_quiz_attempts', $data, array('attempt_id' => $attempt->attempt_id));
500
501 do_action('tutor_quiz_timeout', $attempt_id, $quiz_id, $attempt->user_id);
502
503 wp_send_json_success();
504 }
505
506 wp_send_json_error(__('Quiz has been timeout already', 'tutor'));
507 }
508
509 /**
510 * Review the answer and change individual answer result
511 */
512
513 public function review_quiz_answer(){
514 global $wpdb;
515 $attempt_id = (int) sanitize_text_field($_GET['attempt_id']);
516 $attempt_answer_id = (int) sanitize_text_field($_GET['attempt_answer_id']);
517 $mark_as = sanitize_text_field($_GET['mark_as']);
518
519 $attempt_answer = $wpdb->get_row("SELECT * FROM {$wpdb->prefix}tutor_quiz_attempt_answers WHERE attempt_answer_id = {$attempt_answer_id} ");
520 $attempt = tutor_utils()->get_attempt($attempt_id);
521
522 $is_correct = (int) $attempt_answer->is_correct;
523
524 do_action('tutor_quiz_review_answer_before', $attempt_answer_id, $attempt_id, $mark_as);
525
526 if ($mark_as === 'correct' && ! $is_correct){
527
528 $answer_update_data = array(
529 'achieved_mark' => $attempt_answer->question_mark,
530 'is_correct' => 1,
531 );
532 $wpdb->update($wpdb->prefix.'tutor_quiz_attempt_answers', $answer_update_data, array('attempt_answer_id' => $attempt_answer_id ));
533
534 $attempt_update_data = array(
535 'earned_marks' => $attempt->earned_marks + $attempt_answer->question_mark,
536 'is_manually_reviewed' => 1,
537 'manually_reviewed_at' => date("Y-m-d H:i:s"),
538 );
539
540 $wpdb->update($wpdb->prefix.'tutor_quiz_attempts', $attempt_update_data, array('attempt_id' => $attempt_id ));
541
542 }elseif($mark_as === 'incorrect' && $is_correct){
543
544 $answer_update_data = array(
545 'achieved_mark' => '0.00',
546 'is_correct' => 0,
547 );
548 $wpdb->update($wpdb->prefix.'tutor_quiz_attempt_answers', $answer_update_data, array('attempt_answer_id' => $attempt_answer_id ));
549
550 $attempt_update_data = array(
551 'earned_marks' => $attempt->earned_marks - $attempt_answer->question_mark,
552 'is_manually_reviewed' => 1,
553 'manually_reviewed_at' => date("Y-m-d H:i:s"),
554 );
555
556 $wpdb->update($wpdb->prefix.'tutor_quiz_attempts', $attempt_update_data, array('attempt_id' => $attempt_id ));
557 }
558 do_action('tutor_quiz_review_answer_after', $attempt_answer_id, $attempt_id, $mark_as);
559
560 if (wp_doing_ajax()){
561 wp_send_json_success();
562 }else{
563 wp_redirect(admin_url("admin.php?page=tutor_quiz_attempts&sub_page=view_attempt&attempt_id=".$attempt_id));
564 }
565
566 die();
567 }
568
569
570 /**
571 * New Design Quiz
572 */
573 public function tutor_create_quiz_and_load_modal(){
574 $topic_id = sanitize_text_field($_POST['topic_id']);
575 $quiz_title = sanitize_text_field($_POST['quiz_title']);
576 $quiz_description = sanitize_text_field($_POST['quiz_description']);
577 $next_order_id = tutor_utils()->get_next_course_content_order_id($topic_id);
578
579 $post_arr = array(
580 'post_type' => 'tutor_quiz',
581 'post_title' => $quiz_title,
582 'post_content' => $quiz_description,
583 'post_status' => 'publish',
584 'post_author' => get_current_user_id(),
585 'post_parent' => $topic_id,
586 'menu_order' => $next_order_id,
587 );
588 $quiz_id = wp_insert_post( $post_arr );
589 do_action('tutor_initial_quiz_created', $quiz_id);
590
591 ob_start();
592 include tutor()->path.'views/modal/edit_quiz.php';
593 $output = ob_get_clean();
594
595 ob_start();
596 ?>
597 <div id="tutor-quiz-<?php echo $quiz_id; ?>" class="course-content-item tutor-quiz tutor-quiz-<?php echo $quiz_id; ?>">
598 <div class="tutor-lesson-top">
599 <i class="tutor-icon-move"></i>
600 <a href="javascript:;" class="open-tutor-quiz-modal" data-quiz-id="<?php echo $quiz_id; ?>" data-topic-id="<?php echo $topic_id;
601 ?>"> <i class=" tutor-icon-doubt"></i>[QUIZ] <?php echo $quiz_title; ?> </a>
602 <a href="javascript:;" class="tutor-delete-quiz-btn" data-quiz-id="<?php echo $quiz_id; ?>"><i class="tutor-icon-garbage"></i></a>
603 </div>
604 </div>
605 <?php
606 $output_quiz_row = ob_get_clean();
607
608 wp_send_json_success(array('output' => $output, 'output_quiz_row' => $output_quiz_row));
609 }
610
611 public function tutor_delete_quiz_by_id(){
612 global $wpdb;
613
614 $quiz_id = (int) sanitize_text_field($_POST['quiz_id']);
615 $post = get_post($quiz_id);
616
617 if ( $post->post_type === 'tutor_quiz'){
618 do_action('tutor_delete_quiz_before', $quiz_id);
619
620 $wpdb->delete($wpdb->prefix.'tutor_quiz_attempts', array('quiz_id' => $quiz_id));
621 $wpdb->delete($wpdb->prefix.'tutor_quiz_attempt_answers', array('quiz_id' => $quiz_id));
622
623 $questions_ids = $wpdb->get_col("SELECT question_id FROM {$wpdb->prefix}tutor_quiz_questions WHERE quiz_id = {$quiz_id} ");
624 if (is_array($questions_ids) && count($questions_ids)){
625 $in_question_ids = "'".implode("','", $questions_ids)."'";
626 $wpdb->query("DELETE FROM {$wpdb->prefix}tutor_quiz_question_answers WHERE belongs_question_id IN({$in_question_ids}) ");
627 }
628 $wpdb->delete($wpdb->prefix.'tutor_quiz_questions', array('quiz_id' => $quiz_id));
629
630 wp_delete_post($quiz_id, true);
631 delete_post_meta($quiz_id, '_tutor_course_id_for_lesson');
632
633 do_action('tutor_delete_quiz_after', $quiz_id);
634
635
636 wp_send_json_success();
637 }
638
639 wp_send_json_error();
640 }
641
642 /**
643 * Update Quiz from quiz builder modal
644 *
645 * @since v.1.0.0
646 */
647 public function tutor_quiz_builder_quiz_update(){
648 $quiz_id = sanitize_text_field($_POST['quiz_id']);
649 $topic_id = sanitize_text_field($_POST['topic_id']);
650 $quiz_title = sanitize_text_field($_POST['quiz_title']);
651 $quiz_description = sanitize_text_field($_POST['quiz_description']);
652
653 $post_arr = array(
654 'ID' => $quiz_id,
655 'post_title' => $quiz_title,
656 'post_content' => $quiz_description,
657
658 );
659 $quiz_id = wp_update_post( $post_arr );
660
661 do_action('tutor_quiz_updated', $quiz_id);
662
663 ob_start();
664 ?>
665 <div class="tutor-lesson-top">
666 <i class="tutor-icon-move"></i>
667 <a href="javascript:;" class="open-tutor-quiz-modal" data-quiz-id="<?php echo $quiz_id; ?>" data-topic-id="<?php echo $topic_id;
668 ?>"> <i class=" tutor-icon-doubt"></i>[QUIZ] <?php echo $quiz_title; ?> </a>
669 <a href="javascript:;" class="tutor-delete-quiz-btn" data-quiz-id="<?php echo $quiz_id; ?>"><i class="tutor-icon-garbage"></i></a>
670 </div>
671 <?php
672 $output_quiz_row = ob_get_clean();
673
674 wp_send_json_success(array('output_quiz_row' => $output_quiz_row));
675 }
676
677 /**
678 * Load quiz Modal for edit quiz
679 *
680 * @since v.1.0.0
681 */
682 public function tutor_load_edit_quiz_modal(){
683 $quiz_id = sanitize_text_field($_POST['quiz_id']);
684
685 ob_start();
686 include tutor()->path.'views/modal/edit_quiz.php';
687 $output = ob_get_clean();
688
689 wp_send_json_success(array('output' => $output));
690 }
691
692 /**
693 * Load quiz question form for quiz
694 *
695 * @since v.1.0.0
696 */
697 public function tutor_quiz_builder_get_question_form(){
698 global $wpdb;
699 $quiz_id = sanitize_text_field($_POST['quiz_id']);
700 $question_id = sanitize_text_field(tutor_utils()->avalue_dot('question_id', $_POST));
701
702 if ( ! $question_id){
703 $next_question_id = tutor_utils()->quiz_next_question_id();
704 $next_question_order = tutor_utils()->quiz_next_question_order_id($quiz_id);
705
706 $new_question_data = array(
707 'quiz_id' => $quiz_id,
708 'question_title' => __('Question ').$next_question_id,
709 'question_description' => '',
710 'question_type' => 'true_false',
711 'question_mark' => 1,
712 'question_settings' => maybe_serialize(array()),
713 'question_order' => $next_question_order,
714 );
715
716 $wpdb->insert($wpdb->prefix.'tutor_quiz_questions', $new_question_data);
717 $question_id = $wpdb->insert_id;
718 }
719
720 $question = $wpdb->get_row("SELECT * FROM {$wpdb->prefix}tutor_quiz_questions where question_id = {$question_id} ");
721
722 ob_start();
723 include tutor()->path.'views/modal/question_form.php';
724 $output = ob_get_clean();
725
726 wp_send_json_success(array('output' => $output));
727 }
728
729 public function tutor_quiz_modal_update_question(){
730 global $wpdb;
731
732 $question_data = $_POST['tutor_quiz_question'];
733
734 foreach ($question_data as $question_id => $question){
735 $question_title = sanitize_text_field($question['question_title']);
736 $question_description = $question['question_description'];
737 $question_type = $question['question_type'];
738 $question_mark = $question['question_mark'];
739
740 unset($question['question_title']);
741 unset($question['question_description']);
742
743 $data = array(
744 'question_title' => $question_title,
745 'question_description' => $question_description,
746 'question_type' => $question_type,
747 'question_mark' => $question_mark,
748 'question_settings' => maybe_serialize($question),
749 );
750
751 $wpdb->update($wpdb->prefix.'tutor_quiz_questions', $data, array('question_id' => $question_id) );
752
753
754 /**
755 * Validation
756 */
757 if ($question_type === 'true_false' || $question_type === 'single_choice'){
758 $question_options = tutils()->get_answers_by_quiz_question($question_id);
759 if (tutils()->count($question_options)){
760 $required_validate = true;
761 foreach ($question_options as $question_option){
762 if ($question_option->is_correct){
763 $required_validate = false;
764 }
765 }
766 if ($required_validate){
767 $validation_msg = "<p class='tutor-error-msg'>".__('Please select the correct answer', 'tutor')."</p>";
768 wp_send_json_error(array('validation_msg' => $validation_msg ));
769 }
770 }else{
771 $validation_msg = "<p class='tutor-error-msg'>".__('Please make sure you have added more than one option and saved them', 'tutor')."</p>";
772 wp_send_json_error(array('validation_msg' => $validation_msg ));
773 }
774 }
775 }
776
777 wp_send_json_success();
778 }
779
780 public function tutor_quiz_builder_question_delete(){
781 global $wpdb;
782
783 $question_id = sanitize_text_field(tutor_utils()->avalue_dot('question_id', $_POST));
784 if ($question_id){
785 $wpdb->delete($wpdb->prefix.'tutor_quiz_questions', array('question_id' => $question_id));
786 }
787
788 wp_send_json_success();
789 }
790
791 /**
792 * Get answers options form for quiz question
793 *
794 * @since v.1.0.0
795 */
796 public function tutor_quiz_add_question_answers(){
797 $question_id = sanitize_text_field($_POST['question_id']);
798 $question = tutor_utils()->avalue_dot($question_id, $_POST['tutor_quiz_question']);
799 $question_type = $question['question_type'];
800
801 ob_start();
802 include tutor()->path.'views/modal/question_answer_form.php';
803 $output = ob_get_clean();
804
805 wp_send_json_success(array('output' => $output));
806 }
807
808 /**
809 * Edit Answer Form
810 *
811 * @since v.1.0.0
812 */
813 public function tutor_quiz_edit_question_answer(){
814 $answer_id = (int) sanitize_text_field($_POST['answer_id']);
815 $old_answer = tutor_utils()->get_answer_by_id($answer_id);
816 foreach ($old_answer as $old_answer);
817 $question_id = $old_answer->belongs_question_id;
818 $question_type = $old_answer->belongs_question_type;
819
820 ob_start();
821 include tutor()->path.'views/modal/question_answer_edit_form.php';
822 $output = ob_get_clean();
823
824 wp_send_json_success(array('output' => $output));
825 }
826
827 public function tutor_save_quiz_answer_options(){
828 global $wpdb;
829
830 $questions = $_POST['tutor_quiz_question'];
831 $answers = $_POST['quiz_answer'];
832
833 foreach ($answers as $question_id => $answer){
834 $question = tutor_utils()->avalue_dot($question_id, $questions);
835 $question_type = $question['question_type'];
836
837 //Getting next sorting order
838 $next_order_id = (int) $wpdb->get_var("SELECT MAX(answer_order) FROM {$wpdb->prefix}tutor_quiz_question_answers where belongs_question_id = {$question_id} AND belongs_question_type = '{$question_type}' ");
839 $next_order_id = $next_order_id + 1;
840
841 if ($question){
842 if ($question_type === 'true_false'){
843 $wpdb->delete($wpdb->prefix.'tutor_quiz_question_answers', array('belongs_question_id' => $question_id, 'belongs_question_type' => $question_type));
844 $data_true_false = array(
845 array(
846 'belongs_question_id' => $question_id,
847 'belongs_question_type' => $question_type,
848 'answer_title' => __('True', 'tutor'),
849 'is_correct' => $answer['true_false'] == 'true' ? 1 : 0,
850 'answer_two_gap_match' => 'true',
851 ),
852 array(
853 'belongs_question_id' => $question_id,
854 'belongs_question_type' => $question_type,
855 'answer_title' => __('False', 'tutor'),
856 'is_correct' => $answer['true_false'] == 'false' ? 1 : 0,
857 'answer_two_gap_match' => 'false',
858 ),
859 );
860
861 foreach ($data_true_false as $true_false_data){
862 $wpdb->insert($wpdb->prefix.'tutor_quiz_question_answers', $true_false_data);
863 }
864
865 }elseif($question_type === 'multiple_choice' || $question_type === 'single_choice' || $question_type === 'ordering' ||
866 $question_type === 'matching' || $question_type === 'image_matching' || $question_type === 'image_answering' ){
867
868 $answer_data = array(
869 'belongs_question_id' => $question_id,
870 'belongs_question_type' => $question_type,
871 'answer_title' => $answer['answer_title'],
872 'image_id' => isset($answer['image_id']) ? $answer['image_id'] : 0,
873 'answer_view_format' => isset($answer['answer_view_format']) ? $answer['answer_view_format'] : 0,
874 'answer_order' => $next_order_id,
875 );
876 if (isset($answer['matched_answer_title'])){
877 $answer_data['answer_two_gap_match'] = $answer['matched_answer_title'];
878 }
879
880 $wpdb->insert($wpdb->prefix.'tutor_quiz_question_answers', $answer_data);
881
882 }elseif($question_type === 'fill_in_the_blank'){
883 $wpdb->delete($wpdb->prefix.'tutor_quiz_question_answers', array('belongs_question_id' => $question_id, 'belongs_question_type' => $question_type));
884 $answer_data = array(
885 'belongs_question_id' => $question_id,
886 'belongs_question_type' => $question_type,
887 'answer_title' => $answer['answer_title'],
888 'answer_two_gap_match' => isset($answer['answer_two_gap_match']) ? strtolower(trim($answer['answer_two_gap_match'])) : null,
889 );
890 $wpdb->insert($wpdb->prefix.'tutor_quiz_question_answers', $answer_data);
891 }
892 }
893 }
894
895 wp_send_json_success();
896 }
897
898 /**
899 * Tutor Update Answer
900 *
901 * @since v.1.0.0
902 */
903 public function tutor_update_quiz_answer_options(){
904 global $wpdb;
905
906 $answer_id = (int) sanitize_text_field($_POST['tutor_quiz_answer_id']);
907 $questions = $_POST['tutor_quiz_question'];
908 $answers = $_POST['quiz_answer'];
909
910 foreach ($answers as $question_id => $answer){
911 $question = tutor_utils()->avalue_dot($question_id, $questions);
912 $question_type = $question['question_type'];
913
914 if ($question){
915 if($question_type === 'multiple_choice' || $question_type === 'single_choice' || $question_type === 'ordering' || $question_type === 'matching' || $question_type === 'image_matching' || $question_type === 'fill_in_the_blank' || $question_type === 'image_answering' ){
916
917 $answer_data = array(
918 'belongs_question_id' => $question_id,
919 'belongs_question_type' => $question_type,
920 'answer_title' => $answer['answer_title'],
921 'image_id' => isset($answer['image_id']) ? $answer['image_id'] : 0,
922 'answer_view_format' => isset($answer['answer_view_format']) ? $answer['answer_view_format'] : '',
923 );
924 if (isset($answer['matched_answer_title'])){
925 $answer_data['answer_two_gap_match'] = $answer['matched_answer_title'];
926 }
927
928 if ($question_type === 'fill_in_the_blank'){
929 $answer_data['answer_two_gap_match'] = isset($answer['answer_two_gap_match']) ? strtolower(trim($answer['answer_two_gap_match'])) : null;
930 }
931
932 $wpdb->update($wpdb->prefix.'tutor_quiz_question_answers', $answer_data, array('answer_id' => $answer_id));
933 }
934 }
935 }
936
937 //die(print_r($_POST));
938 wp_send_json_success();
939 }
940
941 public function tutor_quiz_builder_get_answers_by_question(){
942 global $wpdb;
943 $question_id = sanitize_text_field($_POST['question_id']);
944 $question_type = sanitize_text_field($_POST['question_type']);
945
946 $question = $wpdb->get_row("SELECT * FROM {$wpdb->prefix}tutor_quiz_questions WHERE question_id = {$question_id} ");
947 $answers = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}tutor_quiz_question_answers where belongs_question_id = {$question_id} AND belongs_question_type = '{$question_type}' order by answer_order asc ;");
948
949 ob_start();
950
951 /*
952 * @TODO: Should We remove this text?
953 * Screenshot: http://prntscr.com/ngl2mb
954 * Screenshot: http://prntscr.com/ngl2ak
955 */
956
957 switch ($question_type){
958 case 'true_false':
959 echo '<label>'.__('Answer options &amp; mark correct', 'tutor').'</label>';
960 break;
961 case 'ordering':
962 echo '<label>'.__('Make sure you’re saving the answers in the right order. Students will have to match this order exactly.', 'tutor').'</label>';
963 break;
964 }
965
966 if (is_array($answers) && count($answers)){
967 foreach ($answers as $answer){
968 ?>
969 <div class="tutor-quiz-answer-wrap" data-answer-id="<?php echo $answer->answer_id; ?>">
970 <div class="tutor-quiz-answer">
971 <span class="tutor-quiz-answer-title">
972 <?php
973 echo stripslashes($answer->answer_title);
974 if ($answer->belongs_question_type === 'fill_in_the_blank'){
975 echo ' ('.__('Answer', 'tutor').' : ';
976 echo "<strong>{$answer->answer_two_gap_match} </strong>)";
977 }
978 if ($answer->belongs_question_type === 'matching'){
979 echo " - {$answer->answer_two_gap_match}";
980 }
981 ?>
982 </span>
983
984 <?php
985 if ($answer->image_id){
986 echo '<span class="tutor-question-answer-image"><img src="'.wp_get_attachment_image_url($answer->image_id).'" /> </span>';
987 }
988 if ($question_type === 'true_false' || $question_type === 'single_choice'){
989 ?>
990 <span class="tutor-quiz-answers-mark-correct-wrap">
991 <input type="radio" name="mark_as_correct[<?php echo $answer->belongs_question_id; ?>]" value="<?php echo $answer->answer_id; ?>" title="<?php _e('Mark as correct', 'tutor'); ?>" <?php checked(1, $answer->is_correct); ?> >
992 </span>
993 <?php
994 }elseif ($question_type === 'multiple_choice'){
995 ?>
996 <span class="tutor-quiz-answers-mark-correct-wrap">
997 <input type="checkbox" name="mark_as_correct[<?php echo $answer->belongs_question_id; ?>]" value="<?php echo $answer->answer_id; ?>" title="<?php _e('Mark as correct', 'tutor'); ?>" <?php checked(1, $answer->is_correct); ?> >
998 </span>
999 <?php
1000 }
1001 ?>
1002 <span class="tutor-quiz-answer-edit">
1003 <a href="javascript:;"><i class="tutor-icon-pencil"></i> </a>
1004 </span>
1005 <span class="tutor-quiz-answer-sort-icon"><i class="tutor-icon-menu-2"></i> </span>
1006 </div>
1007
1008 <div class="tutor-quiz-answer-trash-wrap">
1009 <a href="javascript:;" class="answer-trash-btn" data-answer-id="<?php echo $answer->answer_id; ?>"><i class="tutor-icon-garbage"></i> </a>
1010 </div>
1011 </div>
1012 <?php
1013 }
1014 }
1015 $output = ob_get_clean();
1016
1017 wp_send_json_success(array('output' => $output));
1018 }
1019
1020 public function tutor_quiz_builder_delete_answer(){
1021 global $wpdb;
1022 $answer_id = sanitize_text_field($_POST['answer_id']);
1023
1024 $wpdb->delete($wpdb->prefix.'tutor_quiz_question_answers', array('answer_id' => $answer_id));
1025 wp_send_json_success();
1026 }
1027
1028 /**
1029 * Save quiz questions sorting
1030 */
1031 public function tutor_quiz_question_sorting(){
1032 global $wpdb;
1033
1034 $question_ids = tutor_utils()->avalue_dot('sorted_question_ids', $_POST);
1035 if (is_array($question_ids) && count($question_ids) ){
1036 $i = 0;
1037 foreach ($question_ids as $key => $question_id){
1038 $i++;
1039 $wpdb->update($wpdb->prefix.'tutor_quiz_questions', array('question_order' => $i), array('question_id' => $question_id));
1040 }
1041 }
1042 }
1043
1044 /**
1045 * Save sorting data for quiz answers
1046 */
1047 public function tutor_quiz_answer_sorting(){
1048 global $wpdb;
1049
1050 if ( ! empty($_POST['sorted_answer_ids']) && is_array($_POST['sorted_answer_ids']) && count($_POST['sorted_answer_ids']) ){
1051 $answer_ids = $_POST['sorted_answer_ids'];
1052 $i = 0;
1053 foreach ($answer_ids as $key => $answer_id){
1054 $i++;
1055 $wpdb->update($wpdb->prefix.'tutor_quiz_question_answers', array('answer_order' => $i), array('answer_id' => $answer_id));
1056 }
1057 }
1058
1059 }
1060
1061 /**
1062 * Mark answer as correct
1063 */
1064
1065 public function tutor_mark_answer_as_correct(){
1066 global $wpdb;
1067
1068 $answer_id = sanitize_text_field($_POST['answer_id']);
1069 $inputValue = sanitize_text_field($_POST['inputValue']);
1070
1071 $answer = $wpdb->get_row("SELECT * FROM {$wpdb->prefix}tutor_quiz_question_answers WHERE answer_id = {$answer_id} LIMIT 0,1 ;");
1072 if ($answer->belongs_question_type === 'single_choice'){
1073 $wpdb->update($wpdb->prefix.'tutor_quiz_question_answers', array('is_correct' => 0), array('belongs_question_id' => $answer->belongs_question_id));
1074 }
1075 $wpdb->update($wpdb->prefix.'tutor_quiz_question_answers', array('is_correct' => $inputValue), array('answer_id' => $answer_id));
1076 }
1077
1078 /**
1079 * Update quiz settings from modal
1080 *
1081 * @since : v.1.0.0
1082 */
1083 public function tutor_quiz_modal_update_settings(){
1084 $quiz_id = sanitize_text_field($_POST['quiz_id']);
1085
1086 $quiz_option = tutor_utils()->sanitize_array($_POST['quiz_option']);
1087 update_post_meta($quiz_id, 'tutor_quiz_option', $quiz_option);
1088
1089 do_action('tutor_quiz_settings_updated', $quiz_id);
1090
1091 wp_send_json_success();
1092 }
1093
1094
1095 //=========================//
1096 // Front end stuffs
1097 //=========================//
1098
1099 /**
1100 * Rendering quiz for frontend
1101 *
1102 * @since v.1.0.0
1103 */
1104
1105 public function tutor_render_quiz_content(){
1106 $quiz_id = (int) sanitize_text_field(tutor_utils()->avalue_dot('quiz_id', $_POST));
1107
1108 ob_start();
1109 global $post;
1110
1111 $post = get_post($quiz_id);
1112 setup_postdata($post);
1113 //tutor_lesson_content();
1114
1115 single_quiz_contents();
1116
1117 wp_reset_postdata();
1118
1119
1120 $html = ob_get_clean();
1121 wp_send_json_success(array('html' => $html));
1122 }
1123
1124
1125 }