Esempio n. 1
0
 /**
  * Set the status message displayed to the user for a quiz
  * @param  integer $lesson_id ID of quiz lesson
  * @param  integer $user_id   ID of user
  * @param  bool $is_lesson
  * @return array              Status code and message
  */
 public static function sensei_user_quiz_status_message($lesson_id = 0, $user_id = 0, $is_lesson = false)
 {
     global $current_user;
     if (intval($user_id) == 0) {
         $user_id = $current_user->ID;
     }
     $status = 'not_started';
     $box_class = 'info';
     $message = __("You have not taken this lesson's quiz yet", 'woothemes-sensei');
     $extra = '';
     if ($lesson_id > 0 && $user_id > 0) {
         // Prerequisite lesson
         $prerequisite = get_post_meta($lesson_id, '_lesson_prerequisite', true);
         // Course ID
         $course_id = absint(get_post_meta($lesson_id, '_lesson_course', true));
         // Has user started course
         $started_course = Sensei_Utils::user_started_course($course_id, $user_id);
         // Has user completed lesson
         $user_lesson_status = Sensei_Utils::user_lesson_status($lesson_id, $user_id);
         $lesson_complete = Sensei_Utils::user_completed_lesson($user_lesson_status);
         // Quiz ID
         $quiz_id = Sensei()->lesson->lesson_quizzes($lesson_id);
         // Quiz grade
         $quiz_grade = 0;
         if ($user_lesson_status) {
             $quiz_grade = get_comment_meta($user_lesson_status->comment_ID, 'grade', true);
         }
         // Quiz passmark
         $quiz_passmark = absint(get_post_meta($quiz_id, '_quiz_passmark', true));
         $quiz_passmark_float = (double) $quiz_passmark;
         // Pass required
         $pass_required = get_post_meta($quiz_id, '_pass_required', true);
         // Quiz questions
         $has_quiz_questions = get_post_meta($lesson_id, '_quiz_has_questions', true);
         if (!$started_course) {
             $status = 'not_started_course';
             $box_class = 'info';
             $message = sprintf(__('Please sign up for %1$sthe course%2$s before taking this quiz', 'woothemes-sensei'), '<a href="' . esc_url(get_permalink($course_id)) . '" title="' . esc_attr(__('Sign Up', 'woothemes-sensei')) . '">', '</a>');
         } elseif (!is_user_logged_in()) {
             $status = 'login_required';
             $box_class = 'info';
             $message = __('You must be logged in to take this quiz', 'woothemes-sensei');
         } elseif ($lesson_complete) {
             $status = 'passed';
             $box_class = 'tick';
             // Lesson status will be "complete" (has no Quiz)
             if (!$has_quiz_questions) {
                 $message = sprintf(__('Congratulations! You have passed this lesson.', 'woothemes-sensei'));
             } elseif (empty($quiz_grade)) {
                 $message = sprintf(__('Congratulations! You have completed this lesson.', 'woothemes-sensei'));
             } elseif (!empty($quiz_grade) && abs($quiz_grade) >= 0) {
                 if ($is_lesson) {
                     $message = sprintf(__('Congratulations! You have passed this lesson\'s quiz achieving %s%%', 'woothemes-sensei'), Sensei_Utils::round($quiz_grade));
                 } else {
                     $message = sprintf(__('Congratulations! You have passed this quiz achieving %s%%', 'woothemes-sensei'), Sensei_Utils::round($quiz_grade));
                 }
             }
             // add next lesson button
             $nav_id_array = sensei_get_prev_next_lessons($lesson_id);
             $next_lesson_id = absint($nav_id_array['next_lesson']);
             // Output HTML
             if (0 < $next_lesson_id) {
                 $message .= ' ' . '<a class="next-lesson" href="' . esc_url(get_permalink($next_lesson_id)) . '" rel="next"><span class="meta-nav"></span>' . __('Next Lesson', 'woothemes-sensei') . '</a>';
             }
         } else {
             // Lesson/Quiz isn't "complete" instead it's ungraded (previously this "state" meant that it *was* complete)
             if (isset($user_lesson_status->comment_approved) && 'ungraded' == $user_lesson_status->comment_approved) {
                 $status = 'complete';
                 $box_class = 'info';
                 if ($is_lesson) {
                     $message = sprintf(__('You have completed this lesson\'s quiz and it will be graded soon. %1$sView the lesson quiz%2$s', 'woothemes-sensei'), '<a href="' . esc_url(get_permalink($quiz_id)) . '" title="' . esc_attr(get_the_title($quiz_id)) . '">', '</a>');
                 } else {
                     $message = sprintf(__('You have completed this quiz and it will be graded soon. You require %1$s%% to pass.', 'woothemes-sensei'), Sensei_Utils::round($quiz_passmark));
                 }
             } elseif (isset($user_lesson_status->comment_approved) && 'failed' == $user_lesson_status->comment_approved) {
                 $status = 'failed';
                 $box_class = 'alert';
                 if ($is_lesson) {
                     $message = sprintf(__('You require %1$d%% to pass this lesson\'s quiz. Your grade is %2$s%%', 'woothemes-sensei'), Sensei_Utils::round($quiz_passmark), Sensei_Utils::round($quiz_grade));
                 } else {
                     $message = sprintf(__('You require %1$d%% to pass this quiz. Your grade is %2$s%%', 'woothemes-sensei'), Sensei_Utils::round($quiz_passmark), Sensei_Utils::round($quiz_grade));
                 }
             } elseif ($pass_required) {
                 $status = 'not_started';
                 $box_class = 'info';
                 if ($is_lesson) {
                     $message = sprintf(__('You require %1$d%% to pass this lesson\'s quiz.', 'woothemes-sensei'), Sensei_Utils::round($quiz_passmark));
                 } else {
                     $message = sprintf(__('You require %1$d%% to pass this quiz.', 'woothemes-sensei'), Sensei_Utils::round($quiz_passmark));
                 }
             }
         }
     }
     // Legacy filter
     $message = apply_filters('sensei_user_quiz_status_' . $status, $message);
     if ($is_lesson && !in_array($status, array('login_required', 'not_started_course'))) {
         $quiz_id = Sensei()->lesson->lesson_quizzes($lesson_id);
         $extra = '<p><a class="button" href="' . esc_url(get_permalink($quiz_id)) . '" title="' . __('View the lesson quiz', 'woothemes-sensei') . '">' . __('View the lesson quiz', 'woothemes-sensei') . '</a></p>';
     }
     // Filter of all messages
     return apply_filters('sensei_user_quiz_status', array('status' => $status, 'box_class' => $box_class, 'message' => $message, 'extra' => $extra), $lesson_id, $user_id, $is_lesson);
 }
Esempio n. 2
0
 /**
  * Display the leeson quiz status if it should be shown
  *
  * @param int $lesson_id defaults to the global lesson id
  * @param int $user_id defaults to the current user id
  *
  * @since 1.9.0
  */
 public static function user_lesson_quiz_status_message($lesson_id = 0, $user_id = 0)
 {
     $lesson_id = empty($lesson_id) ? get_the_ID() : $lesson_id;
     $user_id = empty($lesson_id) ? get_current_user_id() : $user_id;
     $lesson_course_id = (int) get_post_meta($lesson_id, '_lesson_course', true);
     $quiz_id = Sensei()->lesson->lesson_quizzes($lesson_id);
     $has_user_completed_lesson = Sensei_Utils::user_completed_lesson(intval($lesson_id), $user_id);
     if ($quiz_id && is_user_logged_in() && Sensei_Utils::user_started_course($lesson_course_id, $user_id)) {
         $no_quiz_count = 0;
         $has_quiz_questions = get_post_meta($lesson_id, '_quiz_has_questions', true);
         // Display lesson quiz status message
         if ($has_user_completed_lesson || $has_quiz_questions) {
             $status = Sensei_Utils::sensei_user_quiz_status_message($lesson_id, $user_id, true);
             echo '<div class="sensei-message ' . $status['box_class'] . '">' . $status['message'] . '</div>';
             if ($has_quiz_questions) {
                 // echo $status['extra'];
             }
             // End If Statement
         }
         // End If Statement
     }
 }
Esempio n. 3
0
 /**
  * Calculate module progess for user
  *
  * @since 1.8.0
  *
  * @param  integer $user_id ID of user
  * @param  integer $module_id ID of module
  * @param  integer $course_id ID of course
  * @return integer            Module progress percentage
  */
 public function calculate_user_module_progress($user_id = 0, $module_id = 0, $course_id = 0)
 {
     $args = array('post_type' => 'lesson', 'post_status' => 'publish', 'posts_per_page' => -1, 'tax_query' => array(array('taxonomy' => $this->taxonomy, 'field' => 'id', 'terms' => $module_id)), 'meta_query' => array(array('key' => '_lesson_course', 'value' => $course_id)), 'fields' => 'ids');
     $lessons = get_posts($args);
     if (is_wp_error($lessons) || 0 >= count($lessons)) {
         return 0;
     }
     $completed = false;
     $lesson_count = 0;
     $completed_count = 0;
     foreach ($lessons as $lesson_id) {
         $completed = Sensei_Utils::user_completed_lesson($lesson_id, $user_id);
         ++$lesson_count;
         if ($completed) {
             ++$completed_count;
         }
     }
     $module_progress = $completed_count / $lesson_count * 100;
     return (double) $module_progress;
 }
/**
 * Returns the lesson status class
 *
 * must be used in the loop.
 * @since 1.9.0
 *
 * @return string $status_class
 */
function get_the_lesson_status_class()
{
    $status_class = '';
    $lesson_completed = Sensei_Utils::user_completed_lesson(get_the_ID(), get_current_user_id());
    if ($lesson_completed) {
        $status_class = 'completed';
    }
    return $status_class;
}
 public function sensei_has_user_completed_lesson($post_id = 0, $user_id = 0)
 {
     _deprecated_function(__FUNCTION__, '1.7', "WooThemes_Sensei_Utils::user_completed_lesson()");
     return Sensei_Utils::user_completed_lesson($post_id, $user_id);
 }
Esempio n. 6
0
 /**
  * check_user_permissions function.
  *
  * @access public
  * @param string $page (default: '')
  *
  * @return bool
  */
 public function check_user_permissions($page = '')
 {
     // REFACTOR
     global $current_user, $post;
     // if use is not logged in
     // skipped for single lesson
     if (empty($current_user->caps) && Sensei()->settings->get('access_permission') && 'lesson-single' != $page) {
         $this->permissions_message['title'] = __('Restricted Access', 'woothemes-sensei');
         $this->permissions_message['message'] = sprintf(__('You must be logged in to view this %s'), get_post_type());
         return false;
     }
     $user_allowed = false;
     switch ($page) {
         case 'course-single':
             // check for prerequisite course or lesson,
             $course_prerequisite_id = (int) get_post_meta($post->ID, '_course_prerequisite', true);
             $update_course = $this->woocommerce_course_update($post->ID);
             // Count completed lessons
             if (0 < absint($course_prerequisite_id)) {
                 $prerequisite_complete = Sensei_Utils::user_completed_course($course_prerequisite_id, $current_user->ID);
             } else {
                 $prerequisite_complete = true;
             }
             // End If Statement
             // Handles restrictions
             if (!$prerequisite_complete && 0 < absint($course_prerequisite_id)) {
                 $this->permissions_message['title'] = get_the_title($post->ID) . ': ' . __('Restricted Access', 'woothemes-sensei');
                 $course_link = '<a href="' . esc_url(get_permalink($course_prerequisite_id)) . '">' . __('course', 'woothemes-sensei') . '</a>';
                 $this->permissions_message['message'] = sprintf(__('Please complete the previous %1$s before taking this course.', 'woothemes-sensei'), $course_link);
             } else {
                 $user_allowed = true;
             }
             // End If Statement
             break;
         case 'lesson-single':
             // Check for WC purchase
             $lesson_course_id = get_post_meta($post->ID, '_lesson_course', true);
             $update_course = $this->woocommerce_course_update($lesson_course_id);
             $is_preview = Sensei_Utils::is_preview_lesson($post->ID);
             if ($this->access_settings() && Sensei_Utils::user_started_course($lesson_course_id, $current_user->ID)) {
                 $user_allowed = true;
             } elseif ($this->access_settings() && false == $is_preview) {
                 $user_allowed = true;
             } else {
                 $this->permissions_message['title'] = get_the_title($post->ID) . ': ' . __('Restricted Access', 'woothemes-sensei');
                 $course_link = '<a href="' . esc_url(get_permalink($lesson_course_id)) . '">' . __('course', 'woothemes-sensei') . '</a>';
                 $wc_post_id = get_post_meta($lesson_course_id, '_course_woocommerce_product', true);
                 if (Sensei_WC::is_woocommerce_active() && 0 < $wc_post_id) {
                     if ($is_preview) {
                         $this->permissions_message['message'] = sprintf(__('This is a preview lesson. Please purchase the %1$s to access all lessons.', 'woothemes-sensei'), $course_link);
                     } else {
                         $this->permissions_message['message'] = sprintf(__('Please purchase the %1$s before starting this Lesson.', 'woothemes-sensei'), $course_link);
                     }
                 } else {
                     if ($is_preview) {
                         $this->permissions_message['message'] = sprintf(__('This is a preview lesson. Please sign up for the %1$s to access all lessons.', 'woothemes-sensei'), $course_link);
                     } else {
                         /** This filter is documented in class-woothemes-sensei-frontend.php */
                         $this->permissions_message['message'] = sprintf(__('Please sign up for the %1$s before starting the lesson.', 'woothemes-sensei'), $course_link);
                     }
                 }
                 // End If Statement
             }
             // End If Statement
             break;
         case 'quiz-single':
             $lesson_id = get_post_meta($post->ID, '_quiz_lesson', true);
             $lesson_course_id = get_post_meta($lesson_id, '_lesson_course', true);
             $update_course = $this->woocommerce_course_update($lesson_course_id);
             if ($this->access_settings() && Sensei_Utils::user_started_course($lesson_course_id, $current_user->ID) || sensei_all_access()) {
                 // Check for prerequisite lesson for this quiz
                 $lesson_prerequisite_id = (int) get_post_meta($lesson_id, '_lesson_prerequisite', true);
                 $user_lesson_prerequisite_complete = Sensei_Utils::user_completed_lesson($lesson_prerequisite_id, $current_user->ID);
                 // Handle restrictions
                 if (sensei_all_access()) {
                     $user_allowed = true;
                 } else {
                     if (0 < absint($lesson_prerequisite_id) && !$user_lesson_prerequisite_complete) {
                         $this->permissions_message['title'] = get_the_title($post->ID) . ': ' . __('Restricted Access', 'woothemes-sensei');
                         $lesson_link = '<a href="' . esc_url(get_permalink($lesson_prerequisite_id)) . '">' . __('lesson', 'woothemes-sensei') . '</a>';
                         $this->permissions_message['message'] = sprintf(__('Please complete the previous %1$s before taking this Quiz.', 'woothemes-sensei'), $lesson_link);
                     } else {
                         $user_allowed = true;
                     }
                     // End If Statement
                 }
                 // End If Statement
             } elseif ($this->access_settings()) {
                 // Check if the user has started the course
                 if (is_user_logged_in() && !Sensei_Utils::user_started_course($lesson_course_id, $current_user->ID) && (isset($this->settings->settings['access_permission']) && true == $this->settings->settings['access_permission'])) {
                     $user_allowed = false;
                     $this->permissions_message['title'] = get_the_title($post->ID) . ': ' . __('Restricted Access', 'woothemes-sensei');
                     $course_link = '<a href="' . esc_url(get_permalink($lesson_course_id)) . '">' . __('course', 'woothemes-sensei') . '</a>';
                     $wc_post_id = get_post_meta($lesson_course_id, '_course_woocommerce_product', true);
                     if (Sensei_WC::is_woocommerce_active() && 0 < $wc_post_id) {
                         $this->permissions_message['message'] = sprintf(__('Please purchase the %1$s before starting this Quiz.', 'woothemes-sensei'), $course_link);
                     } else {
                         $this->permissions_message['message'] = sprintf(__('Please sign up for the %1$s before starting this Quiz.', 'woothemes-sensei'), $course_link);
                     }
                     // End If Statement
                 } else {
                     $user_allowed = true;
                 }
                 // End If Statement
             } else {
                 $this->permissions_message['title'] = get_the_title($post->ID) . ': ' . __('Restricted Access', 'woothemes-sensei');
                 $course_link = '<a href="' . esc_url(get_permalink(get_post_meta(get_post_meta($post->ID, '_quiz_lesson', true), '_lesson_course', true))) . '">' . __('course', 'woothemes-sensei') . '</a>';
                 $this->permissions_message['message'] = sprintf(__('Please sign up for the %1$s before taking this Quiz.', 'woothemes-sensei'), $course_link);
             }
             // End If Statement
             break;
         default:
             $user_allowed = true;
             break;
     }
     // End Switch Statement
     /**
      * filter the permissions message shown on sensei post types.
      *
      * @since 1.8.7
      *
      * @param array $permissions_message{
      *
      *   @type string $title
      *   @type string $message
      *
      * }
      * @param string $post_id
      */
     $this->permissions_message = apply_filters('sensei_permissions_message', $this->permissions_message, $post->ID);
     if (sensei_all_access() || Sensei_Utils::is_preview_lesson($post->ID)) {
         $user_allowed = true;
     }
     return apply_filters('sensei_access_permissions', $user_allowed);
 }
Esempio n. 7
0
 /**
  * Checks how many lessons are completed
  *
  * @since 1.8.0
  *
  * @param int $course_id
  * @param int $user_id
  * @return array $completed_lesson_ids
  */
 public function get_completed_lesson_ids($course_id, $user_id = 0)
 {
     if (!intval($user_id) > 0) {
         $user_id = get_current_user_id();
     }
     $completed_lesson_ids = array();
     $course_lessons = $this->course_lessons($course_id);
     foreach ($course_lessons as $lesson) {
         $is_lesson_completed = Sensei_Utils::user_completed_lesson($lesson->ID, $user_id);
         if ($is_lesson_completed) {
             $completed_lesson_ids[] = $lesson->ID;
         }
     }
     return $completed_lesson_ids;
 }
Esempio n. 8
0
 /**
  * Generate the question template data and return it as an array.
  *
  * @since 1.9.0
  *
  * @param string $question_id
  * @param $quiz_id
  * @return array $question_data
  */
 public static function get_template_data($question_id, $quiz_id)
 {
     $lesson_id = Sensei()->quiz->get_lesson_id($quiz_id);
     $reset_allowed = get_post_meta($quiz_id, '_enable_quiz_reset', true);
     //backwards compatibility
     if ('on' == $reset_allowed) {
         $reset_allowed = 1;
     }
     // Check again that the lesson is complete
     $user_lesson_end = Sensei_Utils::user_completed_lesson(Sensei()->quiz->get_lesson_id($quiz_id), get_current_user_id());
     $user_lesson_complete = false;
     if ($user_lesson_end) {
         $user_lesson_complete = true;
     }
     //setup the question data
     $data['ID'] = $question_id;
     $data['title'] = get_the_title($question_id);
     $data['content'] = get_post($question_id)->post_content;
     $data['quiz_id'] = $quiz_id;
     $data['lesson_id'] = Sensei()->quiz->get_lesson_id($quiz_id);
     $data['type'] = Sensei()->question->get_question_type($question_id);
     $data['question_grade'] = Sensei()->question->get_question_grade($question_id);
     $data['user_question_grade'] = Sensei()->quiz->get_user_question_grade($lesson_id, $question_id, get_current_user_id());
     $data['question_right_answer'] = get_post_meta($question_id, '_question_right_answer', true);
     $data['question_wrong_answers'] = get_post_meta($question_id, '_question_wrong_answers', true);
     $data['user_answer_entry'] = Sensei()->quiz->get_user_question_answer($lesson_id, $question_id, get_current_user_id());
     $data['lesson_completed'] = Sensei_Utils::user_completed_course($lesson_id, get_current_user_id());
     $data['quiz_grade_type'] = get_post_meta($quiz_id, '_quiz_grade_type', true);
     $data['reset_quiz_allowed'] = $reset_allowed;
     $data['lesson_complete'] = $user_lesson_complete;
     /**
      * Filter the question template data. This filter fires  in
      * the get_template_data function
      *
      * @hooked self::boolean_load_question_data
      *
      * @since 1.9.0
      *
      * @param array $data
      * @param string $question_id
      * @param string $quiz_id
      */
     return apply_filters('sensei_get_question_template_data', $data, $question_id, $quiz_id);
 }
Esempio n. 9
0
    /**
     * The quiz action buttons needed to ouput quiz
     * action such as reset complete and save.
     *
     * @since 1.3.0
     */
    public static function action_buttons()
    {
        global $post, $current_user;
        $lesson_id = (int) get_post_meta($post->ID, '_quiz_lesson', true);
        $lesson_course_id = (int) get_post_meta($lesson_id, '_lesson_course', true);
        $lesson_prerequisite = (int) get_post_meta($lesson_id, '_lesson_prerequisite', true);
        $show_actions = true;
        $user_lesson_status = Sensei_Utils::user_lesson_status($lesson_id, $current_user->ID);
        //setup quiz grade
        $user_quiz_grade = '';
        if (!empty($user_lesson_status)) {
            $user_quiz_grade = get_comment_meta($user_lesson_status->comment_ID, 'grade', true);
        }
        if (intval($lesson_prerequisite) > 0) {
            // If the user hasn't completed the prereq then hide the current actions
            $show_actions = Sensei_Utils::user_completed_lesson($lesson_prerequisite, $current_user->ID);
        }
        if ($show_actions && is_user_logged_in() && Sensei_Utils::user_started_course($lesson_course_id, $current_user->ID)) {
            // Get Reset Settings
            $reset_quiz_allowed = get_post_meta($post->ID, '_enable_quiz_reset', true);
            ?>

             <!-- Action Nonce's -->
             <input type="hidden" name="woothemes_sensei_complete_quiz_nonce" id="woothemes_sensei_complete_quiz_nonce"
                    value="<?php 
            echo esc_attr(wp_create_nonce('woothemes_sensei_complete_quiz_nonce'));
            ?>
" />
             <input type="hidden" name="woothemes_sensei_reset_quiz_nonce" id="woothemes_sensei_reset_quiz_nonce"
                    value="<?php 
            echo esc_attr(wp_create_nonce('woothemes_sensei_reset_quiz_nonce'));
            ?>
" />
             <input type="hidden" name="woothemes_sensei_save_quiz_nonce" id="woothemes_sensei_save_quiz_nonce"
                    value="<?php 
            echo esc_attr(wp_create_nonce('woothemes_sensei_save_quiz_nonce'));
            ?>
" />
             <!--#end Action Nonce's -->

             <?php 
            if ('' == $user_quiz_grade) {
                ?>

                 <span><input type="submit" name="quiz_complete" class="quiz-submit complete" value="<?php 
                _e('Complete Quiz', 'woothemes-sensei');
                ?>
"/></span>

                 <span><input type="submit" name="quiz_save" class="quiz-submit save" value="<?php 
                _e('Save Quiz', 'woothemes-sensei');
                ?>
"/></span>

             <?php 
            }
            // End If Statement
            ?>

             <?php 
            if (isset($reset_quiz_allowed) && $reset_quiz_allowed) {
                ?>

                 <span><input type="submit" name="quiz_reset" class="quiz-submit reset" value="<?php 
                _e('Reset Quiz', 'woothemes-sensei');
                ?>
"/></span>

             <?php 
            }
            ?>

         <?php 
        }
    }