/** * __get function. * * @param string $key * * @return mixed */ public function __get($key) { if (empty($this->{$key})) { $value = false; switch ($key) { case 'current_item': $item_type = !empty($_REQUEST['course-item']) ? $_REQUEST['course-item'] : ''; if ($item_type) { $item_id = ($item_id = learn_press_get_request("{$item_type}_id")) && $this->has('item', $item_id) ? $item_id : null; if ($item_id) { $value = $item_type == 'lesson' ? LP_Lesson::get_lesson($item_id) : LP_Quiz::get_quiz($item_id); } } break; case 'current_lesson': $lesson_id = ($lesson_id = learn_press_get_request("lesson_id")) && $this->has('item', $lesson_id) ? $lesson_id : null; if ($lesson_id) { $value = LP_Lesson::get_lesson($lesson_id); } break; case 'permalink': $value = get_the_permalink($this->id); break; default: // default is get course meta key $value = get_post_meta($this->id, '_lp_' . $key, true); } if (!empty($value)) { $this->{$key} = $value; } } return !empty($this->{$key}) ? $this->{$key} : null; }
/** * Get all questions of a quiz * * @author TuNN * * @param int $quiz_id The ID of a quiz to get all questions * @param boolean $only_ids return an array of questions with IDs only or as post objects * * @return array|null */ function learn_press_get_quiz_questions($quiz_id = null, $only_ids = true) { if (!$quiz_id) { $quiz_id = get_the_ID(); } return ($quiz = LP_Quiz::get_quiz($quiz_id)) ? $quiz->get_questions() : false; }
function lp_get_quiz($the_quiz) { return LP_Quiz::get_quiz($the_quiz); }
<?php global $post; $quiz = LP_Quiz::get_quiz($post->ID); $current_user = get_current_user_id(); $question_types = learn_press_question_types(); $exclude_ids = array(); $questions = $quiz->get_questions(); $hidden = (array) get_post_meta($quiz->id, '_admin_hidden_questions', true); $question_ids = $questions ? array_keys($questions) : array(); $hidden_all = sizeof($hidden) && sizeof(array_diff($hidden, $question_ids)) == 0; ?> <div id="learn-press-quiz-questions-wrap"> <h3 class="quiz-questions-heading"> <?php _e('Questions', 'learn_press'); ?> <p align="right" class="questions-toggle"> <a href="" data-action="expand" class="dashicons dashicons-plus <?php echo $hidden_all ? '' : ' hide-if-js'; ?> " title="<?php _e('Expand All', 'learn_press'); ?> "></a> <a href="" data-action="collapse" class="dashicons dashicons-minus <?php echo !$hidden_all ? '' : ' hide-if-js'; ?> " title="<?php _e('Collapse All', 'learn_press'); ?>
function finish_quiz($quiz_id) { $quiz = LP_Quiz::get_quiz($quiz_id); if (!$quiz) { return; } $user_id = $this->id; $time = current_time('timestamp'); $quiz_start = get_user_meta($user_id, '_lpr_quiz_start_time', true); $quiz_completed = get_user_meta($user_id, '_lpr_quiz_completed', true); $quiz_duration = absint(get_post_meta($quiz_id, '_lpr_duration', true)) * 60; if ($time - $quiz_start[$quiz_id] > $quiz_duration) { $time = $quiz_start[$quiz_id] - $quiz_duration; } $quiz_completed[$quiz_id] = $time; update_user_meta($user_id, '_lpr_quiz_completed', $quiz_completed); $course_id = learn_press_get_course_by_quiz($quiz_id); if (!learn_press_user_has_finished_course($course_id)) { if (learn_press_user_has_completed_all_parts($course_id, $user_id)) { learn_press_finish_course($course_id, $user_id); } } do_action('learn_press_finish_quiz', $quiz_id, $user_id); }
function _evaluate_course_by_quiz($user_id) { global $wpdb; $final_quiz = LP_Quiz::get_quiz($this->final_quiz); $user = learn_press_get_user($user_id); $results = $user->get_quiz_results($this->final_quiz); if (!$results) { $result = 0; } else { if (!empty($results->results['quiz_mark'])) { $result = $results->results['mark'] / $results->results['quiz_mark']; } else { $result = 0; } } return apply_filters('learn_press_evaluation_course_quiz', $result, $this->id, $user_id); }
/** * Check permission to view page * * @param file $template * * @return file */ function learn_press_page_controller($template) { if (get_post_type() == LP()->quiz_post_type && is_single()) { global $quiz; $user = LP()->user; $quiz = LP_Quiz::get_quiz(get_the_ID()); $quiz_status = LP()->user->get_quiz_status(get_the_ID()); $redirect = false; if (!$user->can('view-quiz', $quiz->id)) { if ($course = $quiz->get_course()) { $redirect = $course->permalink; } } elseif ($quiz_status == 'started' && (empty($_REQUEST['question']) && ($current_question = $user->get_current_quiz_question($quiz->id)))) { $redirect = $quiz->get_question_link($current_question); } elseif ($quiz_status == 'complete' && !empty($_REQUEST['question'])) { $redirect = get_the_permalink($quiz->id); } $redirect = apply_filters('learn_press_quiz_redirect_permalink', $redirect, $quiz_status, $quiz->id, $user); // prevent loop redirect if ($redirect && $redirect != learn_press_get_current_url()) { wp_redirect($redirect); exit; } } return $template; }
static function save() { global $wpdb, $post; $questions = learn_press_get_request('learn_press_question'); if ($all_questions = LP_Quiz::get_quiz($post->ID)->get_questions()) { $all_questions = array_keys($all_questions); } // remove questions if it has removed from $_POST if ($all_questions && $questions && ($remove_ids = array_diff($all_questions, array_keys($questions)))) { $query = $wpdb->prepare("\n\t\t\t\t\tDELETE\n\t\t\t\t\tFROM {$wpdb->learnpress_quiz_questions}\n\t\t\t\t\tWHERE quiz_id = %d\n\t\t\t\t\tAND question_id IN(" . join(',', $remove_ids) . ")\n\t\t\t\t", $post->ID); $wpdb->query($query); do_action('learn_press_remove_quiz_questions', $remove_ids, $post->ID); } if (!$questions) { return; } $titles = learn_press_get_request('learn-press-question-name'); // update the title of questions and save all data foreach ($questions as $id => $data) { $question = LP_Question_Factory::get_question($id); if (!empty($titles[$id])) { $wpdb->update($wpdb->posts, array('post_title' => $titles[$id]), array('ID' => $id), array('%s')); } $question->save($data); } // if there are new questions then insert into quiz if ($new_ids = array_diff(array_keys($questions), $all_questions)) { $values = array(); foreach ($new_ids as $id) { $insert_data = apply_filters('learn_press_quiz_question_insert_data', array('question_id' => $id, 'quiz_id' => $post->ID, 'params' => '')); $values[] = $wpdb->prepare("(%d, %d, %s)", $insert_data['quiz_id'], $insert_data['question_id'], $insert_data['param']); } $query = "\n\t\t\t\t\tINSERT INTO {$wpdb->learnpress_quiz_questions}(`quiz_id`, `question_id`, `params`)\n\t\t\t\t\tVALUES " . join(',', $values) . "\n\t\t\t\t"; $wpdb->query($query); do_action('learn_press_insert_quiz_questions', $new_ids, $post->ID); } }
function __get($key) { if (empty($this->{$key})) { switch ($key) { case 'email': $this->{$key} = LP_Email::instance(); break; case 'checkout': $this->{$key} = LP_Checkout::instance(); break; case 'course': if (is_course()) { $this->{$key} = LP_Course::get_course(get_the_ID()); } break; case 'quiz': if (is_quiz()) { $this->{$key} = LP_Quiz::get_quiz(get_the_ID()); } break; } } return !empty($this->{$key}) ? $this->{$key} : false; }
function start_quiz() { $quiz_id = !empty($_REQUEST['quiz_id']) ? absint($_REQUEST['quiz_id']) : 0; if (!$quiz_id) { learn_press_send_json(array('result' => 'error', 'message' => __('The quiz ID is empty', 'learn_press'))); } $quiz = LP_Quiz::get_quiz($quiz_id); if (!$quiz->id || $quiz->id != $quiz_id) { learn_press_send_json(array('result' => 'error', 'message' => __('Something is wrong! Please try again', 'learn_press'))); } $user = learn_press_get_current_user(); if ($quiz->is_require_enrollment() && $user->is('guest')) { learn_press_send_json(array('result' => 'error', 'message' => __('Please login to do this quiz', 'learn_press'))); } $user->set_quiz($quiz); switch (strtolower($user->get_quiz_status())) { case 'completed': learn_press_send_json(array('result' => 'error', 'message' => __('You have completed this quiz', 'learn_press'), 'data' => $user->get_quiz_result())); break; case 'started': learn_press_send_json(array('result' => 'error', 'message' => __('You have started this quiz', 'learn_press'), 'data' => array('status' => $user->get_quiz_status()))); break; default: $result = $user->start_quiz(); learn_press_send_json(array('result' => 'success', 'data' => $result, 'question_url' => learn_press_get_user_question_url($quiz_id), 'question_content' => $user->get_current_question($quiz_id, 'html'))); } die; }
/** * Display content for custom column * * @param string $name * @param int $post_id */ function columns_content($name, $post_id) { global $post; switch ($name) { case LP()->course_post_type: $courses = learn_press_get_item_courses($post_id); if ($courses) { foreach ($courses as $course) { echo '<div><a href="' . esc_url(add_query_arg(array('filter_course' => $course->ID))) . '">' . get_the_title($course->ID) . '</a>'; echo '<div class="row-actions">'; printf('<a href="%s">%s</a>', admin_url(sprintf('post.php?post=%d&action=edit', $course->ID)), __('Edit', 'learn_press')); echo " | "; printf('<a href="%s">%s</a>', get_the_permalink($course->ID), __('View', 'learn_press')); echo " | "; if ($this->_filter_course()) { printf('<a href="%s">%s</a>', remove_query_arg('filter_course'), __('Remove Filter', 'learn_press')); } else { printf('<a href="%s">%s</a>', add_query_arg('filter_course', $course->ID), __('Filter', 'learn_press')); } echo '</div></div>'; } } else { _e('Not assigned yet', 'learn_press'); } break; case 'num_of_question': if (property_exists($post, 'question_count')) { $count = $post->question_count; } else { $quiz = LP_Quiz::get_quiz($post_id); $questions = $quiz->get_questions(); $count = sizeof($questions); } printf('<span class="lp-label-counter" title="%s">%s</span>', $count ? sprintf(_nx('%d question', '%d questions', $count, 'learn_press'), $count) : __('This quiz has got any questions', 'learn_press'), $count); } }
function evaluate_quiz_results($quiz_id, $progress) { $quiz = LP_Quiz::get_quiz($quiz_id); $results = array('mark' => 0, 'correct' => 0, 'wrong' => 0, 'empty' => 0, 'mark_percent' => 0, 'correct_percent' => 0, 'wrong_percent' => 0, 'empty_percent' => 0, 'quiz_time' => $quiz->duration, 'quiz_mark' => $quiz->get_mark(), 'user_time' => 0, 'questions' => array()); $questions = $quiz->questions; if ($questions) { $questions = array_keys($questions); } if (!empty($questions)) { foreach ($questions as $question_id) { if (!empty($progress->question_answers[$question_id])) { $question = LP_Question_Factory::get_question($question_id); $check = $question->check($progress->question_answers[$question_id]); if ($check['correct']) { $results['correct']++; } else { $results['wrong']++; } $results['mark'] += $check['mark']; } else { $check = false; $results['empty']++; } $results['questions'][$question_id] = $check; } } $results['user_time'] = $progress->end - $progress->start; return $results; }
/** * Display content for custom column * * @param string $name * @param int $post_id */ function columns_content($name, $post_id) { switch ($name) { case LP()->course_post_type: $courses = learn_press_get_item_courses($post_id); if ($courses) { foreach ($courses as $course) { echo '<div><a href="' . esc_url(add_query_arg(array('course_id' => $course->ID))) . '">' . get_the_title($course->ID) . '</a>'; echo '<div class="row-actions">'; printf('<a href="%s">%s</a>', admin_url(sprintf('post.php?post=%d&action=edit', $course->ID)), __('Edit', 'learn_press')); echo " | "; printf('<a href="%s">%s</a>', get_the_permalink($course->ID), __('View', 'learn_press')); echo '</div></div>'; } } else { _e('Not assigned yet', 'learn_press'); } break; case 'num_of_question': $quiz = LP_Quiz::get_quiz($post_id); $questions = $quiz->get_questions(); echo ($n = sizeof($questions)) ? sprintf(_nx('%d question', '%d questions', $n, 'learn_press'), $n) : '_'; } }