Пример #1
0
 /**
  * __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;
 }
Пример #2
0
/**
 * 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);
}
Пример #4
0
<?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');
?>
Пример #5
0
 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);
     }
 }
Пример #9
0
 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;
 }
Пример #10
0
 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;
 }
Пример #11
0
 /**
  * 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 "&nbsp;|&nbsp;";
                     printf('<a href="%s">%s</a>', get_the_permalink($course->ID), __('View', 'learn_press'));
                     echo "&nbsp;|&nbsp;";
                     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);
     }
 }
Пример #12
0
 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;
 }
Пример #13
0
 /**
  * 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 "&nbsp;|&nbsp;";
                     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) : '_';
     }
 }