/** * Fetches all the questions for a quiz depending on certain conditions. * * Determine which questions should be shown depending on: * - admin/teacher selected questions to be shown * - questions shown to a user previously (saved as asked questions) * - limit number of questions lesson setting * * @since 1.0 * @param int $quiz_id (default: 0) * @param string $post_status (default: 'publish') * @param string $orderby (default: 'meta_value_num title') * @param string $order (default: 'ASC') * * @return array $questions { $question type WP_Post } */ public function lesson_quiz_questions($quiz_id = 0, $post_status = 'any', $orderby = 'meta_value_num title', $order = 'ASC') { $quiz_id = (string) $quiz_id; $quiz_lesson_id = get_post_meta($quiz_id, '_quiz_lesson', true); // setup the user id if (is_admin()) { $user_id = isset($_GET['user']) ? $_GET['user'] : ''; } else { $user_id = get_current_user_id(); } // Set the default quesiton order if it has not already been set for this quiz $this->set_default_question_order($quiz_id); // If viewing quiz on the frontend then show questions in random order if set if (!is_admin()) { $random_order = get_post_meta($quiz_id, '_random_question_order', true); if ($random_order && $random_order == 'yes') { $orderby = 'rand'; } } // Get all questions and multiple questions $question_query_args = array('post_type' => array('question', 'multiple_question'), 'posts_per_page' => -1, 'meta_key' => '_quiz_question_order' . $quiz_id, 'orderby' => $orderby, 'order' => $order, 'meta_query' => array(array('key' => '_quiz_id', 'value' => $quiz_id)), 'post_status' => $post_status, 'suppress_filters' => 0); //query the questions $questions_query = new WP_Query($question_query_args); // Set return array to initially include all items $questions = $questions_query->posts; // set the questions array that will be manipulated within this function $questions_array = $questions_query->posts; // If viewing quiz on frontend or in grading then only single questions must be shown $selected_questions = false; if (!is_admin() || is_admin() && isset($_GET['page']) && 'sensei_grading' == $_GET['page'] && isset($_GET['user']) && isset($_GET['quiz_id'])) { // Fetch the questions that the user was asked in their quiz if they have already completed it $lesson_status = WooThemes_Sensei_Utils::user_lesson_status($quiz_lesson_id, $user_id); $questions_asked_string = !empty($lesson_status->comment_ID) ? get_comment_meta($lesson_status->comment_ID, 'questions_asked', true) : false; if (!empty($questions_asked_string)) { $selected_questions = explode(',', $questions_asked_string); // Fetch each question in the order in which they were asked $questions = array(); foreach ($selected_questions as $question_id) { if (!$question_id) { continue; } $question = get_post($question_id); if (!isset($question) || !isset($question->ID)) { continue; } $questions[] = $question; } } else { // Otherwise, make sure that we convert all multiple questions into single questions $multiple_array = array(); $existing_questions = array(); // Set array of questions that already exist so we can prevent duplicates from appearing foreach ($questions_array as $question) { if ('question' != $question->post_type) { continue; } $existing_questions[] = $question->ID; } // Include only single questions in the return array $questions_loop = $questions_array; $questions_array = array(); foreach ($questions_loop as $k => $question) { // If this is a single question then include it if ('question' == $question->post_type) { $questions_array[] = $question; } else { // If this is a multiple question then get the specified amount of questions from the specified category $question_cat = intval(get_post_meta($question->ID, 'category', true)); $question_number = intval(get_post_meta($question->ID, 'number', true)); $qargs = array('post_type' => 'question', 'posts_per_page' => $question_number, 'orderby' => $orderby, 'tax_query' => array(array('taxonomy' => 'question-category', 'field' => 'term_id', 'terms' => $question_cat)), 'post_status' => $post_status, 'suppress_filters' => 0, 'post__not_in' => $existing_questions); $cat_questions = get_posts($qargs); // Merge results into return array $questions_array = array_merge($questions_array, $cat_questions); // Add selected questions to existing questions array to prevent duplicates from being added foreach ($questions_array as $cat_question) { if (in_array($cat_question->ID, $existing_questions)) { continue; } $existing_questions[] = $cat_question->ID; } } } // Set return data $questions = $questions_array; } } // If user has not already taken the quiz and a limited number of questions are to be shown, then show a random selection of the specified amount of questions if (!$selected_questions) { // Only limit questions like this on the frontend if (!is_admin()) { // Get number of questions to show $show_questions = intval(get_post_meta($quiz_id, '_show_questions', true)); if ($show_questions) { // Get random set of array keys from selected questions array $selected_questions = array_rand($questions_array, $show_questions); // Loop through all questions and pick the the ones to be shown based on the random key selection $questions = array(); foreach ($questions_array as $k => $question) { // Random keys will always be an array, unless only one question is to be shown if (is_array($selected_questions)) { if (in_array($k, $selected_questions)) { $questions[] = $question; } } elseif (1 == $show_questions) { if ($selected_questions == $k) { $questions[] = $question; } } } } } } // Save the questions that will be asked for the current user // this happens only once per user/quiz, unless the user resets the quiz if (!is_admin()) { $user_lesson_status = WooThemes_Sensei_Utils::user_lesson_status($quiz_lesson_id, $user_id); if ($user_lesson_status) { $questions_asked = get_comment_meta($user_lesson_status->comment_ID, 'questions_asked', true); if (empty($questions_asked) && $user_lesson_status) { $questions_asked = array(); foreach ($questions as $question) { $questions_asked[] = $question->ID; } // save the questions asked id $questions_asked_csv = implode(',', $questions_asked); update_comment_meta($user_lesson_status->comment_ID, 'questions_asked', $questions_asked_csv); } } } /** * Filter the questions returned by Sensei_Lesson::lessons_quiz_questions * * @hooked Sensei_Teacher::allow_teacher_access_to_questions * @since 1.8.0 */ return apply_filters('sensei_lesson_quiz_questions', $questions, $quiz_id); }
public function calculate_user_module_progress_custom($user_id, $module_id, $course_id) { $lessons = Sensei_Core_Modules::get_lessons($course_id, $module_id); //if (is_wp_error($lessons) || 0 >= count($lessons)) return 0; $completed = false; $lesson_count = 0; $completed_count = 0; $strcom = ''; foreach ($lessons as $lesson) { $lesson_id = $lesson->ID; $lesson_id = (int) $lesson_id; $quiz_id = WooThemes_Sensei_Lesson::lesson_quizzes($lesson_id, $post_status = 'any'); $quiz_id = (int) $quiz_id; $lesson_quiz_questions = WooThemes_Sensei_Utils::sensei_get_quiz_questions($quiz_id); if (count($lesson_quiz_questions) > 0) { $lesson_status = WooThemes_Sensei_Utils::user_lesson_status($lesson_id, $user_id); $lesson_status = $lesson_status->comment_approved; ++$lesson_count; if ($lesson_status == 'passed') { ++$completed_count; } else { $question = $lesson_quiz_questions[0]; $question_title = $question->post_title; if ($question_title == 'Offline Upload') { ++$completed_count; } //$strcom = $strcom.' -- Lesson ID: '.$lesson_id.' '.print_r($lesson_quiz_questions, true); } } //$strcom = $strcom.' -- '.$user_id.' '.$lesson_id.' '.$lesson_status. ' '.print_r($lesson_quizzes, true); } $module_progress = $completed_count / $lesson_count * 100; return (double) $module_progress; //return $strcom; }
public function sensei_quiz_action_buttons() { global $post, $current_user, $woothemes_sensei; $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 = WooThemes_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 = WooThemes_Sensei_Utils::user_completed_lesson($lesson_prerequisite, $current_user->ID); } if ($show_actions && is_user_logged_in() && WooThemes_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 echo apply_filters('sensei_complete_quiz_text', __('Complete Quiz', 'woothemes-sensei')); ?> "/></span> <span><input type="submit" name="quiz_save" class="quiz-submit save" value="<?php echo apply_filters('sensei_save_quiz_text', __('Save Quiz', 'woothemes-sensei')); ?> "/></span> <?php php; ?> <?php php; ?> <span><input type="submit" name="quiz_reset" class="quiz-submit reset" value="<?php echo apply_filters('sensei_reset_quiz_text', __('Reset Quiz', 'woothemes-sensei')); ?> "/></span> <?php php; ?> <?php } }
function savedquest_options() { if (!current_user_can('manage_options')) { wp_die(__('You do not have sufficient permissions to access this page.')); } echo '<div class="wrap" style="background:#fff;">'; if (isset($_GET['tab'])) { $tab = $_GET['tab']; } else { $tab = ""; } saved_admin_tab($tab); if ($tab == "quiztaken" or $tab == "") { ?> <table class="wp-list-table widefat fixed striped pages" width="100%" style="border-spacing: 0; text-align:center;" > <tr> <th>Lesson ID</th> <th>Lesson Title</th> <th>Number Of Questions</th> <th>Question Answered</th> <th>Unanswered Question</th> <th>User</th> <th>User Id</th> <th>DATE And Time</th> </tr> <?php $svequiz = get_option('savequiz_list'); ?> <?php foreach ($svequiz as $quizdata) { ?> <tr> <td><?php echo $quizdata['lesson_id']; ?> </td> <td><?php echo $quizdata['lesson_title']; ?> </td> <td><?php echo $quizdata['total_questtion']; ?> </td> <td><?php echo $quizdata['question_answered']; ?> (<?php echo get_percentage($quizdata['total_questtion'], $quizdata['question_answered']) . "%"; ?> )</td> <td><?php echo $quizdata['remaining_question']; ?> (<?php echo 100 - get_percentage($quizdata['total_questtion'], $quizdata['question_answered']) . "%"; ?> )</td> <td><?php echo $quizdata['fullname']; ?> </td> <td><?php echo $quizdata['user_id']; ?> </td> <td><?php echo $quizdata['DATETIME']; ?> </td> </tr> <?php } ?> </table> <?php } elseif ($tab == "timesession") { $user_last_login_logout = get_option('user_last_login_logout'); ?> <br /><br/> <table class="wp-list-table widefat fixed striped pages" width="100%" style="border-spacing: 0; text-align:center;" > <tr> <th>User ID</th> <th>Full Name</th> <th>Last Login</th> <th>Last Logout</th> <th>Amout of Time Spent</th> <th>Role</th> </tr> <?php $svequiz = get_option('savequiz_list'); ?> <?php foreach ($user_last_login_logout as $last_login_logout) { ?> <?php if ($last_login_logout['user_id'] != "") { ?> <?php $user_info = get_userdata($last_login_logout['user_id']); ?> <tr> <td><?php echo $last_login_logout['user_id']; ?> </td> <td><?php echo $user_info->display_name; ?> </td> <td><?php echo gettime_st($last_login_logout['logintime']); ?> </td> <td><?php echo gettime_st($last_login_logout['logouttime']); ?> </td> <?php if ($last_login_logout['logouttime'] != "") { $date1 = date_create($last_login_logout['logintime']); $date2 = date_create($last_login_logout['logouttime']); $diff = date_diff($date1, $date2); $diftime = $diff->format("%h Hours %i Minute %s Seconds"); } else { $diftime = ""; } ?> <th><?php echo $diftime; ?> </th> <td><?php echo implode(', ', $user_info->roles); ?> </td> </tr> <?php } ?> <?php } ?> </table><br /><br /> <?php } elseif ($tab == "timequizecompleted") { global $woothemes_sensei, $post, $current_user, $wp_query, $learner_user; echo "<table class='wp-list-table widefat fixed striped pages'>"; $allUsers = get_users(); echo "<tr>\r\r\n\t\t\t\t<th>User</th>\r\r\n\t\t\t\t<th>Courses</th>\r\r\n\t\t\t\t<th>Percentage Incomplete</th>\r\r\n\t\t\t\t<th>Percentage Complete</th>\r\r\n\t\t\t\t<th>Percentage Competent</th>\r\r\n\t\t\t\t<th>Percentage Attempted</th>\r\r\n\t\t\t\t<th>Length of time Course Completed</th>\r\r\n\t\t\t </tr>"; foreach ($allUsers as $user) { $args = array('post_type' => 'course'); $courses = get_posts($args); $i = 1; foreach ($courses as $course) { $course_user_grade = WooThemes_Sensei_Utils::sensei_course_user_grade($course->ID, $user->ID); $course_status = WooThemes_Sensei_Utils::user_course_status($course->ID, $user->ID); $course_status_update = get_comment_meta($course_status->comment_ID); if (!empty($course_status)) { $displayed_lessons = array(); $modules = Sensei()->modules->get_course_modules(intval($course->ID)); foreach ($modules as $module) { $args = array('post_type' => 'lesson', 'post_status' => 'publish', 'posts_per_page' => -1, 'meta_query' => array(array('key' => '_lesson_course', 'value' => intval($course->ID), 'compare' => '=')), 'tax_query' => array(array('taxonomy' => Sensei()->modules->taxonomy, 'field' => 'id', 'terms' => intval($module->term_id))), 'meta_key' => '_order_module_' . $module->term_id, 'orderby' => 'meta_value_num date', 'order' => 'ASC', 'suppress_filters' => 0); $lessons = get_posts($args); if (count($lessons) > 0) { $html .= '<h3>' . $module->name . '</h3>' . "\n"; $count = 0; foreach ($lessons as $lesson_item) { $lesson_grade = ' n/a'; $has_questions = get_post_meta($lesson_item->ID, '_quiz_has_questions', true); if ($has_questions) { $lesson_status = WooThemes_Sensei_Utils::user_lesson_status($lesson_item->ID, $user->ID); // Get user quiz grade $lesson_grade = get_comment_meta($lesson_status->comment_ID, 'grade', true); if ($lesson_grade) { $lesson_grade .= '%'; } $modulequizdata = get_comment_meta($lesson_status->comment_ID); //echo "<a href='".get_post_permalink($lesson_item->ID)."'>".$lesson_item->post_title."</a><br />"; $modulequestion_asked = count(explode(",", $modulequizdata['questions_asked'][0])); $moduleanswered_quiz = count(unserialize($modulequizdata['quiz_answers'][0])); //echo "number of questions:".$modulequestion_asked."<br />"; //echo "number of Answered:".$moduleanswered_quiz."<br />"; if ($course_status->comment_approved == "complete") { $attempted = "(100%)"; } else { if ($modulequizdata['grade'][0] == "") { if ($lesson_status->comment_approved == "passed") { $attempted = 'P/Q'; } else { if ($modulequestion_asked >= $moduleanswered_quiz) { if ($modulequizdata['quiz_answers'][0] == "") { $attempted = ""; } else { $attempted = "( " . get_percentage($modulequestion_asked, $moduleanswered_quiz) . "% ) Saved"; } } } } else { $attempted = "( " . get_percentage($modulequestion_asked, $moduleanswered_quiz) . "% )"; } //echo "<pre>"; //echo "Attempted:".$attempted."<br />"; //echo $user->user_email."<br />"; //echo $modulequizdata['grade'][0]."<br />"; //echo $modulequizdata['quiz_answers'][0]."<br />"; //print_r($lesson_status); //echo "</pre>"; } } $html .= '<a href="' . esc_url(get_permalink($lesson_item->ID)) . '" title="' . esc_attr(sprintf(__('Start %s', 'woothemes-sensei'), $lesson_item->post_title)) . '">' . esc_html(sprintf(__('%s', 'woothemes-sensei'), $lesson_item->post_title)) . '</a> ' . $attempted . '<br />'; $displayed_lessons[] = $lesson_item->ID; } } } $args = array('post_type' => 'lesson', 'posts_per_page' => -1, 'suppress_filters' => 0, 'meta_key' => '_order_' . $course->ID, 'orderby' => 'meta_value_num date', 'order' => 'ASC', 'meta_query' => array(array('key' => '_lesson_course', 'value' => intval($course->ID))), 'post__not_in' => $displayed_lessons); $lessons = get_posts($args); //echo "Number of lesson in a course: ".count($lessons); if (0 < count($lessons)) { $html .= '<h3>' . __('Other Lessons', 'woothemes-sensei') . '</h3>' . "\n"; } if ($course_status_update['percent'][0] == 100) { $date1 = date_create($course_status_update['start'][0]); $date2 = date_create($course_status->comment_date); $diff = date_diff($date1, $date2); $diftime = $diff->format("%h Hours %i Minute %s Seconds"); } else { $diftime = "course not completed yet."; } $allcourseid[] = $course->ID; $incomplete = 100 - $course_status_update['percent'][0]; echo "<tr><td>"; echo $user->user_email; echo "</td>"; echo "<td>"; echo "<a href='" . get_post_permalink($course->ID) . "'>" . $course->post_title . "</a>"; echo "</td>"; echo "<td>"; echo $incomplete . "%"; echo "</td>"; echo "<td>"; echo $course_status_update['percent'][0] . "%"; echo "</td>"; echo "<td>"; echo $course_user_grade . "%"; echo "</td>"; echo "<td>"; echo $html; $html = ""; foreach ($lessons as $lesson_item) { $lesson_grade = 'n/a'; $has_questions = get_post_meta($lesson_item->ID, '_quiz_has_questions', true); if ($has_questions) { $lesson_status = WooThemes_Sensei_Utils::user_lesson_status($lesson_item->ID, $user->ID); // Get user quiz grade $lesson_grade = get_comment_meta($lesson_status->comment_ID, 'grade', true); if ($lesson_grade) { $lesson_grade .= '%'; } } $quizdata = get_comment_meta($lesson_status->comment_ID); //echo "<h1>Comment</h1>"; //print_r(get_comment_meta( $lesson_status->comment_ID )); //echo "<h1>LESSON STATUS</h1>"; //print_r($lesson_status); echo "<a href='" . get_post_permalink($lesson_item->ID) . "'>" . $lesson_item->post_title . "</a> "; //print_r($quizdata); $question_asked = count(explode(",", $quizdata['questions_asked'][0])); $answered_quiz = count(unserialize($quizdata['quiz_answers'][0])); if ($quizdata['grade'][0] == "") { if ($question_asked > $answered_quiz) { echo "( " . get_percentage($question_asked, $answered_quiz) . "% )"; } } else { echo "(100%)"; } echo '<br />'; } // End For Loop echo "</td>"; echo "<td>"; echo $diftime; echo "</td>"; echo "</tr>"; //echo $course->post_title." (".$course_status_update['percent'][0]."% Complete) (". $incomplete . "% incomplete) (". $course_user_grade . "% Competent)<br />"; $i++; } } } echo "</table>"; } elseif ($tab == "threshold") { //declare the wpdb for custom query global $wpdb; //check for submitted data if (isset($_POST['submittreshold']) && ($_POST['submittreshold'] = "submit")) { // declare users and variables $allUsers = get_users(); $modules_completed = $_POST['completionpermonth']; $courseid = $_POST['course']; $course_name = get_the_title($courseid); $array_to_csv = array(array('Student Name', 'Course Name ')); //user loop ----- loop user get the groups and course the course they take foreach ($allUsers as $user) { //declare course function calls $course_user_grade = WooThemes_Sensei_Utils::sensei_course_user_grade($courseid, $user->ID); $user_course_status = WooThemes_Sensei_Utils::user_course_status($courseid, $user->ID); $course_status_info = get_comment_meta($user_course_status->comment_ID); $started_course = WooThemes_Sensei_Utils::user_started_course($courseid, $user->ID); $course_status = WooThemes_Sensei_Utils::sensei_user_course_status_message($courseid, $user->ID); $completed_course = WooThemes_Sensei_Utils::user_completed_course($user_course_status); //get the user groups $useringroup = new Groups_User($user->ID); $user_groups = $useringroup->__get('groups'); $displayed_lessons = array(); //declare and get module values $modules = Sensei()->modules->get_course_modules(intval($courseid)); $modules_content = Sensei()->modules->course_module_content(intval($courseid)); //echo "<pre>"; //echo $user->user_email."<br />"; //echo "sensei_user_course_status_message: "; //print_r($course_status); //echo "<br />"; //echo "started_course: "."<br />"; $course_status_info['start'][0]; $datenow = date('Y-m-d h:i:s'); $date1 = date_create($course_status_info['start'][0]); $date2 = date_create($datenow); $diff = date_diff($date1, $date2); $diftime = $diff->format("%m"); if ($diftime < 1) { $diftime = 1; } //echo "</pre>"; //module loop per user foreach ($modules as $module) { $args = array('post_type' => 'lesson', 'post_status' => 'publish', 'posts_per_page' => -1, 'meta_query' => array(array('key' => '_lesson_course', 'value' => intval($courseid), 'compare' => '=')), 'tax_query' => array(array('taxonomy' => Sensei()->modules->taxonomy, 'field' => 'id', 'terms' => intval($module->term_id))), 'meta_key' => '_order_module_' . $module->term_id, 'orderby' => 'meta_value_num date', 'order' => 'ASC', 'suppress_filters' => 0); $lessons = get_posts($args); $num_of_lesson = count($lessons); //lessson loop per user foreach ($lessons as $lesson_item) { $is_lesson_completed = WooThemes_Sensei_Utils::user_completed_lesson($lesson_item->ID, $user->ID); if ($is_lesson_completed == 1) { $lesson_completed[] = $is_lesson_completed; } } //echo "lesson completed:". count($lesson_completed)."<br />"; if (count($lesson_completed) > 0) { if ($num_of_lesson == count($lesson_completed)) { $completed_modules_per_user[] = 1; $total_module_passed[] = 1; //echo "---Module completed <br />"; } else { //echo "---Module not completed <br />"; } } else { //echo "---Module not completed <br />"; } unset($lesson_completed); unset($completed_modules_per_user); } $overaalltotal_module_passed = count($total_module_passed); //echo $overaalltotal_module_passed . " module being passed"; //loop throughout the user group under a user if (is_array($user_groups)) { foreach ($user_groups as $user_group) { if ($user_group->group_id == $_POST['group']) { if (!empty($user_course_status)) { $modules_completed_from_groups = $user_group->description; if ($modules_completed == "") { $modules_completed = $modules_completed_from_groups; } $num_of_module_x_difftime = $modules_completed * $diftime; //echo "<br />num_of_module_x_difftime:".$num_of_module_x_difftime; if ($overaalltotal_module_passed >= $num_of_module_x_difftime) { $array_to_csv[] = array($user->display_name, $course_name); //$userid_within_group[$user->user_email] = $user->ID; } } } //echo $user_group->group_id."<br />"; } } unset($total_module_passed); } //echo "<pre>"; //echo $modules_completed; //print_r($array_to_csv); //echo "</pre>"; convert_to_csv($array_to_csv, 'report-' . md5(date('Y-m-d h:i:s')) . '.csv', ','); } ?> <div class="form-wrap" style="padding:20px;"> <form action="" method="post"> <div> <label> Group: </label> <?php $groups = $wpdb->get_results('SELECT * FROM `wp_groups_group`'); ?> <select name="group"> <?php foreach ($groups as $group) { echo "<option value='" . $group->group_id . "'>"; echo $group->name; echo "</option>"; } ?> </select> </div> <div> <label> Course: </label> <?php $course = new WP_Query(array('post_type' => 'course')); ?> <select name="course"> <?php // The Loop if ($course->have_posts()) { while ($course->have_posts()) { $course->the_post(); echo '<option value="' . $course->post->ID . '">' . get_the_title() . '</option>'; } } /* Restore original Post Data */ ?> </select> <?php wp_reset_postdata(); ?> </div> <div> <label> How many modules should be completed by now? </label> <input type="text" name="completionpermonth" /> </div><br /><br /> <input type="submit" class="button button-primary" name="submittreshold" value="submit" /> </form> </div> <?php } elseif ($tab == "incremental-progress") { wp_enqueue_script('jquery-ui-datepicker'); wp_enqueue_style('jquery-style', 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.2/themes/smoothness/jquery-ui.css'); //declare the wpdb for custom query global $wpdb; //check for submitted data if (isset($_POST['submitincrenmental']) && ($_POST['submitincrenmental'] = "submit")) { // declare users and variables $allUsers = get_users(); $modules_completed = $_POST['completionpermonth']; $courseid = $_POST['course']; $course_name = get_the_title($courseid); $array_to_csv = array(array('Student Name', 'Course Name ', 'Lesson Title')); //user loop ----- loop user get the groups and course the course they take foreach ($allUsers as $user) { //declare course function calls $course_user_grade = WooThemes_Sensei_Utils::sensei_course_user_grade($courseid, $user->ID); $user_course_status = WooThemes_Sensei_Utils::user_course_status($courseid, $user->ID); $course_status_info = get_comment_meta($user_course_status->comment_ID); $started_course = WooThemes_Sensei_Utils::user_started_course($courseid, $user->ID); $course_status = WooThemes_Sensei_Utils::sensei_user_course_status_message($courseid, $user->ID); $completed_course = WooThemes_Sensei_Utils::user_completed_course($user_course_status); //get the user groups $useringroup = new Groups_User($user->ID); $user_groups = $useringroup->__get('groups'); $displayed_lessons = array(); //declare and get module values $modules = Sensei()->modules->get_course_modules(intval($courseid)); $modules_content = Sensei()->modules->course_module_content(intval($courseid)); $course_status_info['start'][0]; $datenow = date('Y-m-d h:i:s'); $date1 = date_create($course_status_info['start'][0]); $date2 = date_create($datenow); $diff = date_diff($date1, $date2); $diftime = $diff->format("%m"); if ($diftime < 1) { $diftime = 1; } //echo "</pre>"; //module loop per user foreach ($modules as $module) { $args = array('post_type' => 'lesson', 'post_status' => 'publish', 'posts_per_page' => -1, 'meta_query' => array(array('key' => '_lesson_course', 'value' => intval($courseid), 'compare' => '=')), 'tax_query' => array(array('taxonomy' => Sensei()->modules->taxonomy, 'field' => 'id', 'terms' => intval($module->term_id))), 'meta_key' => '_order_module_' . $module->term_id, 'orderby' => 'meta_value_num date', 'order' => 'ASC', 'suppress_filters' => 0); $lessons = get_posts($args); $num_of_lesson = count($lessons); //lessson loop per user foreach ($lessons as $lesson_item) { $is_lesson_completed = WooThemes_Sensei_Utils::user_completed_lesson($lesson_item->ID, $user->ID); $lesson_status = WooThemes_Sensei_Utils::user_lesson_status($lesson_item->ID, $user->ID); $modulequizdata = get_comment_meta($lesson_status->comment_ID); if (!empty($lesson_status->comment_date)) { echo "<pre>"; //echo $lesson_status->comment_date."<br />"; //echo $_POST['date1']."<br />"; $lesson_completion_date = date("Y-m-d", strtotime($lesson_status->comment_date)); //echo "<br />"; //echo $_POST['date2']."<br />"; //echo "lesson is completed:".$is_lesson_completed."<br />"; //print_r($lesson_item); echo "</pre>"; } if ($is_lesson_completed == 1) { $date1 = strtotime($_POST['date1']); $date2 = strtotime($_POST['date2']); $lesson_completion_date_str = strtotime($lesson_completion_date); if ($lesson_completion_date_str > $date1 && $lesson_completion_date_str < $date2) { //echo "lesson is completed:".$is_lesson_completed."<br />"; //echo "user ".$user->display_name." pass this". $lesson_completion_date; $user_id_onrange[$user->ID] = $lesson_item->post_title; } } } //echo "lesson completed:". count($lesson_completed)."<br />"; } //loop throughout the user group under a user if (is_array($user_groups)) { foreach ($user_groups as $user_group) { if ($user_group->group_id == $_POST['group']) { if (!empty($user_course_status)) { if (array_key_exists($user->ID, $user_id_onrange)) { $array_to_csv[] = array($user->display_name, $course_name, $user_id_onrange[$user->ID]); } } } //echo $user_group->group_id."<br />"; } } } //print_r($user_id_onrange); //echo "<pre>"; //echo $modules_completed; //print_r($array_to_csv); //echo "</pre>"; convert_to_csv($array_to_csv, 'report-incremental-progress' . md5(date('Y-m-d h:i:s')) . '.csv', $headers); } ?> <div class="form-wrap" style="padding:20px;"> <form action="" method="post"> <div> <label> Group: </label> <?php $groups = $wpdb->get_results('SELECT * FROM `wp_groups_group`'); ?> <select name="group"> <?php foreach ($groups as $group) { echo "<option value='" . $group->group_id . "'>"; echo $group->name; echo "</option>"; } ?> </select> </div><br /> <div> <label> Course: </label> <?php $course = new WP_Query(array('post_type' => 'course')); ?> <select name="course"> <?php // The Loop if ($course->have_posts()) { while ($course->have_posts()) { $course->the_post(); echo '<option value="' . $course->post->ID . '">' . get_the_title() . '</option>'; } } /* Restore original Post Data */ ?> </select> <?php wp_reset_postdata(); ?> </div><br /> <div> <label> Date: </label> From<input type="text" id="date1" name="date1" /> to <input type="text" id="date2" name="date2" /> </div><br /><br /> <input type="submit" class="button button-primary" name="submitincrenmental" value="submit" /> </form> </div> <script> jQuery(document).ready(function() { jQuery('#date1').datepicker({ dateFormat : 'yy-mm-dd' }); jQuery('#date2').datepicker({ dateFormat : 'yy-mm-dd' }); }); </script> <?php } elseif ($tab == "total-progress") { //declare the wpdb for custom query global $wpdb; //check for submitted data if (isset($_POST['submittotalprogress']) && ($_POST['submittotalprogress'] = "submit")) { // declare users and variables $allUsers = get_users(); $modules_completed = $_POST['completionpermonth']; $courseid = $_POST['course']; $course_name = get_the_title($courseid); $array_to_csv = array(array('Student Name', 'Course Name', 'Lesson Title')); //user loop ----- loop user get the groups and course the course they take foreach ($allUsers as $user) { //declare course function calls $course_user_grade = WooThemes_Sensei_Utils::sensei_course_user_grade($courseid, $user->ID); $user_course_status = WooThemes_Sensei_Utils::user_course_status($courseid, $user->ID); $course_status_info = get_comment_meta($user_course_status->comment_ID); $started_course = WooThemes_Sensei_Utils::user_started_course($courseid, $user->ID); $course_status = WooThemes_Sensei_Utils::sensei_user_course_status_message($courseid, $user->ID); $completed_course = WooThemes_Sensei_Utils::user_completed_course($user_course_status); //get the user groups $useringroup = new Groups_User($user->ID); $user_groups = $useringroup->__get('groups'); $displayed_lessons = array(); //declare and get module values $modules = Sensei()->modules->get_course_modules(intval($courseid)); $modules_content = Sensei()->modules->course_module_content(intval($courseid)); //echo "<pre>"; //echo $user->user_email."<br />"; //echo "sensei_user_course_status_message: "; //print_r($course_status); //echo "<br />"; //echo "started_course: "."<br />"; $course_status_info['start'][0]; $datenow = date('Y-m-d h:i:s'); $date1 = date_create($course_status_info['start'][0]); $date2 = date_create($datenow); $diff = date_diff($date1, $date2); $diftime = $diff->format("%m"); if ($diftime < 1) { $diftime = 1; } //echo "</pre>"; //module loop per user foreach ($modules as $module) { $args = array('post_type' => 'lesson', 'post_status' => 'publish', 'posts_per_page' => -1, 'meta_query' => array(array('key' => '_lesson_course', 'value' => intval($courseid), 'compare' => '=')), 'tax_query' => array(array('taxonomy' => Sensei()->modules->taxonomy, 'field' => 'id', 'terms' => intval($module->term_id))), 'meta_key' => '_order_module_' . $module->term_id, 'orderby' => 'meta_value_num date', 'order' => 'ASC', 'suppress_filters' => 0); $lessons = get_posts($args); $num_of_lesson = count($lessons); //lessson loop per user foreach ($lessons as $lesson_item) { $is_lesson_completed = WooThemes_Sensei_Utils::user_completed_lesson($lesson_item->ID, $user->ID); if ($is_lesson_completed == 1) { $lesson_taken[$user->ID][] = $lesson_item->post_title; } } } $overaalltotal_module_passed = count($total_module_passed); //echo $overaalltotal_module_passed . " module being passed"; //loop throughout the user group under a user if (is_array($user_groups)) { foreach ($user_groups as $user_group) { if ($user_group->group_id == $_POST['group']) { if (!empty($user_course_status)) { $array_to_csv[] = array($user->display_name, $course_name, join("|", $lesson_taken[$user->ID])); //$userid_within_group[$user->user_email] = $user->ID; } } //echo $user_group->group_id."<br />"; } } //echo "<pre>"; //print_r($lesson_taken); //echo "<pre>"; unset($total_module_passed); unset($lesson_taken); } //echo "<pre>"; //echo $modules_completed; //print_r($array_to_csv); //echo "</pre>"; convert_to_csv($array_to_csv, 'report-total-progress' . md5(date('Y-m-d h:i:s')) . '.csv', ','); } ?> <div class="form-wrap" style="padding:20px;"> <form action="" method="post"> <div> <label> Group: </label> <?php $groups = $wpdb->get_results('SELECT * FROM `wp_groups_group`'); ?> <select name="group"> <?php foreach ($groups as $group) { echo "<option value='" . $group->group_id . "'>"; echo $group->name; echo "</option>"; } ?> </select> </div> <div> <label> Course: </label> <?php $course = new WP_Query(array('post_type' => 'course')); ?> <select name="course"> <?php // The Loop if ($course->have_posts()) { while ($course->have_posts()) { $course->the_post(); echo '<option value="' . $course->post->ID . '">' . get_the_title() . '</option>'; } } /* Restore original Post Data */ ?> </select> <?php wp_reset_postdata(); ?> </div> <br /><br /> <input type="submit" class="button button-primary" name="submittotalprogress" value="submit" /> </form> </div> <?php } echo '</div>'; }
public static function user_passed_quiz($quiz_id = 0, $user_id = 0) { if (!$quiz_id) { return false; } if (!$user_id) { $user_id = get_current_user_id(); } $lesson_id = get_post_meta($quiz_id, '_quiz_lesson', true); // Quiz Grade $lesson_status = WooThemes_Sensei_Utils::user_lesson_status($lesson_id, $user_id); $quiz_grade = get_comment_meta($lesson_status->comment_ID, 'grade', true); // Check if Grade is greater than or equal to pass percentage $quiz_passmark = abs(round(doubleval(get_post_meta($quiz_id, '_quiz_passmark', true)), 2)); if ($quiz_passmark <= intval($quiz_grade)) { return true; } return false; }
public function sensei_complete_quiz() { global $post, $woothemes_sensei, $current_user; // Default grade $grade = 0; // Get Quiz Questions $lesson_quiz_questions = $woothemes_sensei->post_types->lesson->lesson_quiz_questions($post->ID); $quiz_lesson_id = absint(get_post_meta($post->ID, '_quiz_lesson', true)); // Get quiz grade type $quiz_grade_type = get_post_meta($post->ID, '_quiz_grade_type', true); // Get quiz pass setting $pass_required = get_post_meta($post->ID, '_pass_required', true); // Get quiz pass mark $quiz_passmark = abs(round(doubleval(get_post_meta($post->ID, '_quiz_passmark', true)), 2)); // Handle Quiz Completion if (isset($_POST['quiz_complete']) && wp_verify_nonce($_POST['woothemes_sensei_complete_quiz_noonce'], 'woothemes_sensei_complete_quiz_noonce')) { $sanitized_submit = esc_html($_POST['quiz_complete']); $questions_asked = array_filter(array_map('absint', $_POST['questions_asked'])); $questions_asked_string = implode(',', $questions_asked); switch ($sanitized_submit) { case apply_filters('sensei_complete_quiz_text', __('Complete Quiz', 'woothemes-sensei')): // Mark the Lesson as in-progress (if it isn't already), the entry is needed for WooThemes_Sensei_Utils::sensei_grade_quiz_auto() (optimise at some point?) $activity_logged = WooThemes_Sensei_Utils::sensei_start_lesson($quiz_lesson_id); $lesson_status = 'ungraded'; // Default when completing a quiz // Save questions that were asked in this quiz if (!empty($questions_asked_string)) { update_comment_meta($activity_logged, 'questions_asked', $questions_asked_string); } // Save Quiz Answers if (isset($_POST['sensei_question'])) { WooThemes_Sensei_Utils::sensei_save_quiz_answers($_POST['sensei_question']); } // Grade quiz // 3rd arg is count of total number of questions but it's not used by sensei_grade_quiz_auto() $grade = WooThemes_Sensei_Utils::sensei_grade_quiz_auto($post->ID, $_POST['sensei_question'], count($lesson_quiz_questions), $quiz_grade_type); $lesson_metadata = array(); // Get Lesson Grading Setting if (is_wp_error($grade) || 'auto' != $quiz_grade_type) { $lesson_status = 'ungraded'; // Quiz is manually graded and this was a user submission } else { // Quiz has been automatically Graded if ($pass_required) { // Student has reached the pass mark and lesson is complete if ($quiz_passmark <= $grade) { $lesson_status = 'passed'; } else { $lesson_status = 'failed'; } // End If Statement } else { $lesson_status = 'graded'; } $lesson_metadata['grade'] = $grade; // Technically already set as part of "WooThemes_Sensei_Utils::sensei_grade_quiz_auto()" above } WooThemes_Sensei_Utils::update_lesson_status($current_user->ID, $quiz_lesson_id, $lesson_status, $lesson_metadata); switch ($lesson_status) { case 'passed': case 'graded': do_action('sensei_user_lesson_end', $current_user->ID, $quiz_lesson_id); break; } do_action('sensei_user_quiz_submitted', $current_user->ID, $post->ID, $grade, $quiz_passmark, $quiz_grade_type); break; case apply_filters('sensei_save_quiz_text', __('Save Quiz', 'woothemes-sensei')): $activity_logged = WooThemes_Sensei_Utils::sensei_start_lesson($quiz_lesson_id); if ($activity_logged) { // Save questions that were asked in this quiz if (!empty($questions_asked_string)) { update_comment_meta($activity_logged, 'questions_asked', $questions_asked_string); } if (isset($_POST['sensei_question'])) { WooThemes_Sensei_Utils::sensei_save_quiz_answers($_POST['sensei_question']); } } // Need message in case the data wasn't saved? $this->messages = '<div class="sensei-message note">' . apply_filters('sensei_quiz_saved_text', __('Quiz Saved Successfully.', 'woothemes-sensei')) . '</div>'; break; case apply_filters('sensei_reset_quiz_text', __('Reset Quiz', 'woothemes-sensei')): // Don't want to remove the lesson status (such as start meta data etc), just remove the answers, the questions asked meta and any grade meta // Delete quiz answers, this auto deletes the corresponding meta data, such as the question/answer grade WooThemes_Sensei_Utils::sensei_delete_quiz_answers($post->ID, $user_id); WooThemes_Sensei_Utils::update_lesson_status($current_user->ID, $quiz_lesson_id, 'in-progress', array('questions_asked' => '', 'grade' => '')); // Run any action on quiz/lesson reset (previously this didn't occur on resetting a quiz, see resetting a lesson in sensei_complete_lesson() do_action('sensei_user_lesson_reset', $current_user->ID, $quiz_lesson_id); $this->messages = '<div class="sensei-message note">' . apply_filters('sensei_quiz_reset_text', __('Quiz Reset Successfully.', 'woothemes-sensei')) . '</div>'; break; default: // Nothing break; } // End Switch Statement // Refresh page to avoid re-posting ?> <script type="text/javascript"> window.location = '<?php echo get_permalink($post->ID); ?> '; </script> <?php } // End If Statement, submission of quiz $this->data = new stdClass(); // Get latest quiz answers and grades $user_quizzes = $this->sensei_get_user_quiz_answers($post->ID); $user_lesson_status = WooThemes_Sensei_Utils::user_lesson_status($quiz_lesson_id, $current_user->ID); $user_quiz_grade = 0; if (isset($user_lesson_status->comment_ID)) { $user_quiz_grade = get_comment_meta($user_lesson_status->comment_ID, 'grade', true); } if (!is_array($user_quizzes)) { $user_quizzes = array(); } // Check again that the lesson is complete $user_lesson_end = WooThemes_Sensei_Utils::user_completed_lesson($user_lesson_status); $user_lesson_complete = false; if ($user_lesson_end) { $user_lesson_complete = true; } // End If Statement $reset_allowed = get_post_meta($post->ID, '_enable_quiz_reset', true); // Build frontend data object $this->data->user_quizzes = $user_quizzes; $this->data->user_quiz_grade = $user_quiz_grade; $this->data->quiz_passmark = $quiz_passmark; $this->data->quiz_lesson = $quiz_lesson_id; $this->data->quiz_grade_type = $quiz_grade_type; $this->data->user_lesson_end = $user_lesson_end; $this->data->user_lesson_complete = $user_lesson_complete; $this->data->lesson_quiz_questions = $lesson_quiz_questions; $this->data->reset_quiz_allowed = $reset_allowed; }
} $html .= '<h2><a href="' . esc_url(get_permalink($lesson_item->ID)) . '" title="' . esc_attr(sprintf(__('Start %s', 'woothemes-sensei'), $lesson_item->post_title)) . '">' . esc_html(sprintf(__('%s', 'woothemes-sensei'), $lesson_item->post_title)) . '</a> <span class="lesson-grade">' . $lesson_grade . '</span></h2>'; $displayed_lessons[] = $lesson_item->ID; } } } $args = array('post_type' => 'lesson', 'posts_per_page' => -1, 'suppress_filters' => 0, 'meta_key' => '_order_' . $course->ID, 'orderby' => 'meta_value_num date', 'order' => 'ASC', 'meta_query' => array(array('key' => '_lesson_course', 'value' => intval($course->ID))), 'post__not_in' => $displayed_lessons); $lessons = get_posts($args); if (0 < count($displayed_lessons)) { $html .= '<h3>' . __('Other Lessons', 'woothemes-sensei') . '</h3>' . "\n"; } foreach ($lessons as $lesson_item) { $lesson_grade = 'n/a'; $has_questions = get_post_meta($lesson_item->ID, '_quiz_has_questions', true); if ($has_questions) { $lesson_status = WooThemes_Sensei_Utils::user_lesson_status($lesson_item->ID, $current_user->ID); // Get user quiz grade $lesson_grade = get_comment_meta($lesson_status->comment_ID, 'grade', true); if ($lesson_grade) { $lesson_grade .= '%'; } } $html .= '<h2><a href="' . esc_url(get_permalink($lesson_item->ID)) . '" title="' . esc_attr(sprintf(__('Start %s', 'woothemes-sensei'), $lesson_item->post_title)) . '">' . esc_html(sprintf(__('%s', 'woothemes-sensei'), $lesson_item->post_title)) . '</a> <span class="lesson-grade">' . $lesson_grade . '</span></h2>'; } // End For Loop $html .= '<h2 class="total-grade">' . apply_filters('sensei_total_grade_text', __('Total Grade', 'woothemes-sensei')) . '<span class="lesson-grade">' . $course_user_grade . '%</span></h2>'; $html .= '</article>'; $html .= '</section>'; do_action('sensei_course_results_before_lessons', $course->ID); // Output the HTML echo $html;
/** * This tests Sensei()->quiz->save_user_answers_feedback */ public function testSaveUserAnswersFeedback() { // setup the data and objects needed for this test global $woothemes_sensei; $test_user_id = wp_create_user('studentFeedbackSave', 'studentFeedbackSave', '*****@*****.**'); $test_lesson_id = $this->factory->get_random_lesson_id(); $test_quiz_id = $woothemes_sensei->lesson->lesson_quizzes($test_lesson_id); // does the save_user_answers function exist? $this->assertTrue(method_exists($woothemes_sensei->quiz, 'save_user_answers_feedback'), 'The quiz class function `save_user_answers_feedback` does not exist '); // does this save_user_answers return false for bogus data $this->assertFalse($woothemes_sensei->quiz->save_user_answers_feedback(array(), array(), -1000, -200), 'save_user_answers_feedback does not return false for no existent users and lesson '); $this->assertFalse($woothemes_sensei->quiz->save_user_answers_feedback('', array(), '', ''), 'save_user_answers_feedback does not return false for empty parameters'); // does the function return the correct information when a user doesn't exist? $this->assertFalse($woothemes_sensei->quiz->save_user_answers_feedback('', array(), '', $test_lesson_id), 'save_user_answers_feedback does not return false for empty user'); $this->assertFalse($woothemes_sensei->quiz->save_user_answers_feedback('', array(), -500, $test_lesson_id), 'save_user_answers_feedback does not return false for a non existant user'); // Test the answers_array parameter $this->assertFalse($woothemes_sensei->quiz->save_user_answers_feedback('Answers Text', array(), $test_lesson_id, $test_user_id), 'save_user_answers_feedback does not return false if answers is not passed in as an array'); $this->assertFalse($woothemes_sensei->quiz->save_user_answers_feedback('', array(), $test_lesson_id, $test_user_id), 'save_user_answers_feedback does not return false for empty answer array'); $this->assertFalse($woothemes_sensei->quiz->save_user_answers_feedback('', array(), '', ''), 'save_user_answers_feedback does not return false incorrectly formatted answers'); // Test a case that is setup correctly which should return a positive result $test_user_answers_feedback = $this->factory->generate_user_answers_feedback($test_quiz_id); WooThemes_Sensei_Utils::sensei_start_lesson($test_lesson_id, $test_user_id); $lesson_data_saved = $woothemes_sensei->quiz->save_user_answers_feedback($test_user_answers_feedback, $test_lesson_id, $test_user_id); // did the correct data return a valid comment id on the lesson as a result? $this->assertTrue(intval($lesson_data_saved) > 0, 'The comment id returned after saving the quiz feedback does not represent a valid comment '); //setup for the next group of assertions $sensei_activity_logged = WooThemes_Sensei_Utils::sensei_check_for_activity(array('post_id' => $test_lesson_id, 'user_id' => $test_user_id)); $status_comment = WooThemes_Sensei_Utils::user_lesson_status($test_lesson_id, $test_user_id); $saved_feedback = get_comment_meta($status_comment->comment_ID, 'quiz_answers_feedback', true); // was the data that was just stored stored correctly ? Check the comment meta on the lesson id $this->assertTrue((bool) $sensei_activity_logged, 'The saved answers feedback was not stored correctly on the Lesson'); $this->assertFalse(empty($saved_feedback), 'The saved feedback was not stored correctly on the Quiz'); $this->assertTrue(is_array(maybe_unserialize($saved_feedback)), 'The saved feedback was not stored correctly on the Lesson'); // can you retrieve data and is it the same as what was stored? //compare every single answer $retrieved_feedback_array = maybe_unserialize($saved_feedback); foreach ($test_user_answers_feedback as $question_id => $feedback) { $saved_single_answer = $retrieved_feedback_array[$question_id]; $assert_message = 'The saved feedback does not correspond to what was passed into the save_user_answers_feedback function '; $this->assertEquals($feedback, base64_decode($saved_single_answer), $assert_message); } // end for each }
/** * Submit the users quiz answers for grading * * This function accepts users answers and stores it but also initiates the grading * if a quiz can be graded automatically it will, if not the answers can be graded by the teacher. * * @since 1.7.4 * @access public * * @param array $quiz_answers * @param array $files from $_FILES * @param int $user_id * @param int $lesson_id * * @return bool $answers_submitted */ public static function submit_answers_for_grading($quiz_answers, $files = array(), $lesson_id, $user_id = 0) { $answers_submitted = false; // get the user_id if none was passed in use the current logged in user if (!intval($user_id) > 0) { $user_id = get_current_user_id(); } // make sure the parameters are valid before continuing if (empty($lesson_id) || empty($user_id) || 'lesson' != get_post_type($lesson_id) || !get_userdata($user_id) || !is_array($quiz_answers)) { return false; } global $post, $woothemes_sensei; // Default grade $grade = 0; // Get Quiz ID $quiz_id = $woothemes_sensei->lesson->lesson_quizzes($lesson_id); // Get quiz grade type $quiz_grade_type = get_post_meta($quiz_id, '_quiz_grade_type', true); // Get quiz pass setting $pass_required = get_post_meta($quiz_id, '_pass_required', true); // Get the minimum percentage need to pass this quiz $quiz_pass_percentage = abs(round(doubleval(get_post_meta($quiz_id, '_quiz_passmark', true)), 2)); // Handle Quiz Completion submit for grading if (isset($_POST['questions_asked']) && is_array($_POST['questions_asked'])) { $questions_asked = array_filter(array_map('absint', $_POST['questions_asked'])); } else { $questions_asked = array_keys($quiz_answers); } $questions_asked_string = implode(',', $questions_asked); // Save Quiz Answers for grading, the save function also calls the sensei_start_lesson self::save_user_answers($quiz_answers, $files, $lesson_id, $user_id); // Save questions that were asked in this quiz $user_lesson_status = WooThemes_Sensei_Utils::user_lesson_status($lesson_id, $user_id); if (isset($user_lesson_status->comment_ID)) { update_comment_meta($user_lesson_status->comment_ID, 'questions_asked', $questions_asked_string); } // Grade quiz $grade = WooThemes_Sensei_Utils::sensei_grade_quiz_auto($quiz_id, $quiz_answers, 0, $quiz_grade_type); // Get Lesson Grading Setting $lesson_metadata = array(); $lesson_status = 'ungraded'; // Default when completing a quiz // At this point the answers have been submitted $answers_submitted = true; // if this condition is false the quiz should manually be graded by admin if ('auto' == $quiz_grade_type && !is_wp_error($grade)) { // Quiz has been automatically Graded if ('on' == $pass_required) { // Student has reached the pass mark and lesson is complete if ($quiz_pass_percentage <= $grade) { $lesson_status = 'passed'; } else { $lesson_status = 'failed'; } // End If Statement } else { // Student only has to partake the quiz $lesson_status = 'graded'; } $lesson_metadata['grade'] = $grade; // Technically already set as part of "WooThemes_Sensei_Utils::sensei_grade_quiz_auto()" above } // end if ! is_wp_error( $grade ... WooThemes_Sensei_Utils::update_lesson_status($user_id, $lesson_id, $lesson_status, $lesson_metadata); if ('passed' == $lesson_status || 'graded' == $lesson_status) { /** * Lesson end action hook * * This hook is fired after a lesson quiz has been graded and the lesson status is 'passed' OR 'graded' * * @param int $user_id * @param int $lesson_id */ do_action('sensei_user_lesson_end', $user_id, $lesson_id); } /** * User quiz has been submitted * * Fires the end of the submit_answers_for_grading function. It will fire irrespective of the submission * results. * * @param int $user_id * @param int $quiz_id * @param string $grade * @param string $quiz_pass_percentage * @param string $quiz_grade_type */ do_action('sensei_user_quiz_submitted', $user_id, $quiz_id, $grade, $quiz_pass_percentage, $quiz_grade_type); return $answers_submitted; }
function savedquest_options() { if (!current_user_can('manage_options')) { wp_die(__('You do not have sufficient permissions to access this page.')); } echo '<div class="wrap" style="background:#fff;">'; if (isset($_GET['tab'])) { $tab = $_GET['tab']; } else { $tab = ""; } saved_admin_tab($tab); if ($tab == "quiztaken" or $tab == "") { ?> <table class="wp-list-table widefat fixed striped pages" width="100%" style="border-spacing: 0; text-align:center;" > <tr> <th>Lesson ID</th> <th>Lesson Title</th> <th>Module</th> <th>Number Of Questions</th> <th>Question Answered</th> <th>Unanswered Question</th> <th>User</th> <th>User Id</th> <th>DATE And Time</th> </tr> <?php $svequiz = get_option('savequiz_list'); ?> <?php foreach ($svequiz as $quizdata) { ?> <tr> <td><?php echo $quizdata['lesson_id']; ?> </td> <td><?php echo $quizdata['lesson_title']; ?> </td> <td> <?php $terms = get_the_terms($quizdata['lesson_id'], 'module'); echo $terms[0]->name; //print_r($terms); ?> </td> <td><?php echo $quizdata['total_questtion']; ?> </td> <td><?php echo $quizdata['question_answered']; ?> (<?php echo get_percentage($quizdata['total_questtion'], $quizdata['question_answered']) . "%"; ?> )</td> <td><?php echo $quizdata['remaining_question']; ?> (<?php echo 100 - get_percentage($quizdata['total_questtion'], $quizdata['question_answered']) . "%"; ?> )</td> <td><?php echo $quizdata['fullname']; ?> </td> <td><?php echo $quizdata['user_id']; ?> </td> <td><?php echo $quizdata['DATETIME']; ?> </td> </tr> <?php } ?> </table> <?php } elseif ($tab == "timesession") { $user_last_login_logout = get_option('user_last_login_logout'); ?> <br /><br/> <table class="wp-list-table widefat fixed striped pages" width="100%" style="border-spacing: 0; text-align:center;" > <tr> <th>User ID</th> <th>Full Name</th> <th>Last Login</th> <th>Last Logout</th> <th>Amout of Time Spent</th> <th>Role</th> </tr> <?php $svequiz = get_option('savequiz_list'); ?> <?php foreach ($user_last_login_logout as $last_login_logout) { ?> <?php if ($last_login_logout['user_id'] != "") { ?> <?php $user_info = get_userdata($last_login_logout['user_id']); ?> <tr> <td><?php echo $last_login_logout['user_id']; ?> </td> <td><?php echo $user_info->display_name; ?> </td> <td><?php echo gettime_st($last_login_logout['logintime']); ?> </td> <td><?php echo gettime_st($last_login_logout['logouttime']); ?> </td> <?php if ($last_login_logout['logouttime'] != "") { $date1 = date_create($last_login_logout['logintime']); $date2 = date_create($last_login_logout['logouttime']); $diff = date_diff($date1, $date2); $diftime = $diff->format("%h Hours %i Minute %s Seconds"); } else { $diftime = ""; } ?> <th><?php echo $diftime; ?> </th> <td><?php echo implode(', ', $user_info->roles); ?> </td> </tr> <?php } ?> <?php } ?> </table><br /><br /> <?php } elseif ($tab == "timequizecompleted") { global $woothemes_sensei, $post, $current_user, $wp_query, $learner_user; echo "<table class='wp-list-table widefat fixed striped pages'>"; $allUsers = get_users(); echo "<tr>\n\n\t\t\t\t<th>User</th>\n\n\t\t\t\t<th>Courses</th>\n\n\t\t\t\t<th>Percentage Incomplete</th>\n\n\t\t\t\t<th>Percentage Complete</th>\n\n\t\t\t\t<th>Percentage Competent</th>\n\n\t\t\t\t<th>Percentage Attempted</th>\n\n\t\t\t\t<th>Length of time Course Completed</th>\n\n\t\t\t </tr>"; foreach ($allUsers as $user) { $args = array('post_type' => 'course'); $courses = get_posts($args); $i = 1; foreach ($courses as $course) { $course_user_grade = WooThemes_Sensei_Utils::sensei_course_user_grade($course->ID, $user->ID); $course_status = WooThemes_Sensei_Utils::user_course_status($course->ID, $user->ID); $course_status_update = get_comment_meta($course_status->comment_ID); if (!empty($course_status)) { $displayed_lessons = array(); $modules = Sensei()->modules->get_course_modules(intval($course->ID)); foreach ($modules as $module) { $args = array('post_type' => 'lesson', 'post_status' => 'publish', 'posts_per_page' => -1, 'meta_query' => array(array('key' => '_lesson_course', 'value' => intval($course->ID), 'compare' => '=')), 'tax_query' => array(array('taxonomy' => Sensei()->modules->taxonomy, 'field' => 'id', 'terms' => intval($module->term_id))), 'meta_key' => '_order_module_' . $module->term_id, 'orderby' => 'meta_value_num date', 'order' => 'ASC', 'suppress_filters' => 0); $lessons = get_posts($args); if (count($lessons) > 0) { $html .= '<h3>' . $module->name . '</h3>' . "\n"; $count = 0; foreach ($lessons as $lesson_item) { $lesson_grade = ' n/a'; $has_questions = get_post_meta($lesson_item->ID, '_quiz_has_questions', true); if ($has_questions) { $lesson_status = WooThemes_Sensei_Utils::user_lesson_status($lesson_item->ID, $user->ID); // Get user quiz grade $lesson_grade = get_comment_meta($lesson_status->comment_ID, 'grade', true); if ($lesson_grade) { $lesson_grade .= '%'; } $modulequizdata = get_comment_meta($lesson_status->comment_ID); //echo "<a href='".get_post_permalink($lesson_item->ID)."'>".$lesson_item->post_title."</a><br />"; $modulequestion_asked = count(explode(",", $modulequizdata['questions_asked'][0])); $moduleanswered_quiz = count(unserialize($modulequizdata['quiz_answers'][0])); //echo "number of questions:".$modulequestion_asked."<br />"; //echo "number of Answered:".$moduleanswered_quiz."<br />"; //echo "<pre>"; //echo "<h1>".$user->user_email.$lesson_item->post_title."</h1>"; //print_r($course_status ); //echo $course_status->comment_approved; //echo $modulequestion_asked."------".$moduleanswered_quiz; //echo "</pre>"; if ($course_status->comment_approved == "complete") { $attempted = '<span style="color:green;">(100%)</span>'; } else { if ($lesson_status->comment_approved == "passed" || $lesson_status->comment_approved == "graded") { $attempted = '<span style="color:green;">(100%)</span>'; } else { $attempted = ""; } } //echo "<pre>"; //echo "Attempted:".$attempted."<br />"; //echo $user->user_email."<br />"; //echo $modulequizdata['grade'][0]."<br />"; //echo $modulequizdata['quiz_answers'][0]."<br />"; //print_r($lesson_status); //echo "</pre>"; } $html .= '<a href="' . esc_url(get_permalink($lesson_item->ID)) . '" title="' . esc_attr(sprintf(__('Start %s', 'woothemes-sensei'), $lesson_item->post_title)) . '">' . esc_html(sprintf(__('%s', 'woothemes-sensei'), $lesson_item->post_title)) . '</a> ' . $attempted . '<br />'; $displayed_lessons[] = $lesson_item->ID; } } } $args = array('post_type' => 'lesson', 'posts_per_page' => -1, 'suppress_filters' => 0, 'meta_key' => '_order_' . $course->ID, 'orderby' => 'meta_value_num date', 'order' => 'ASC', 'meta_query' => array(array('key' => '_lesson_course', 'value' => intval($course->ID))), 'post__not_in' => $displayed_lessons); $lessons = get_posts($args); //echo "Number of lesson in a course: ".count($lessons); if (0 < count($lessons)) { $html .= '<h3>' . __('Other Lessons', 'woothemes-sensei') . '</h3>' . "\n"; } if ($course_status_update['percent'][0] == 100) { $date1 = date_create($course_status_update['start'][0]); $date2 = date_create($course_status->comment_date); $diff = date_diff($date1, $date2); $diftime = $diff->format("%h Hours %i Minute %s Seconds"); } else { $diftime = "course not completed yet."; } $allcourseid[] = $course->ID; $incomplete = 100 - $course_status_update['percent'][0]; echo "<tr><td>"; echo $user->user_email; echo "</td>"; echo "<td>"; echo "<a href='" . get_post_permalink($course->ID) . "'>" . $course->post_title . "</a>"; echo "</td>"; echo "<td>"; echo $incomplete . "%"; echo "</td>"; echo "<td>"; echo $course_status_update['percent'][0] . "%"; echo "</td>"; echo "<td>"; echo $course_user_grade . "%"; echo "</td>"; echo "<td>"; echo $html; $html = ""; foreach ($lessons as $lesson_item) { $lesson_grade = 'n/a'; $has_questions = get_post_meta($lesson_item->ID, '_quiz_has_questions', true); if ($has_questions) { $lesson_status = WooThemes_Sensei_Utils::user_lesson_status($lesson_item->ID, $user->ID); // Get user quiz grade $lesson_grade = get_comment_meta($lesson_status->comment_ID, 'grade', true); if ($lesson_grade) { $lesson_grade .= '%'; } } $quizdata = get_comment_meta($lesson_status->comment_ID); //echo "<h1>Comment</h1>"; //print_r(get_comment_meta( $lesson_status->comment_ID )); //echo "<h1>LESSON STATUS</h1>"; //print_r($lesson_status); echo "<a href='" . get_post_permalink($lesson_item->ID) . "'>" . $lesson_item->post_title . "</a> "; //print_r($quizdata); $question_asked = count(explode(",", $quizdata['questions_asked'][0])); $answered_quiz = count(unserialize($quizdata['quiz_answers'][0])); $lessonquestion_asked = count(explode(",", $quizdata['questions_asked'][0])); $lessonanswered_quiz = count(unserialize($quizdata['quiz_answers'][0])); if ($course_status->comment_approved == "complete") { echo $attempted = '<span style="color:green;">(100%)</span>'; } else { if ($lesson_status->comment_approved == "passed" || $lesson_status->comment_approved == "graded") { echo $attempted = '<span style="color:green;">(100%)</span>'; } else { echo $attempted = ""; } } /*if($quizdata ['grade'][0]==""){ if($lesson_status->comment_approved=="passed"){ echo $attempted = 'P/Q'; }else{ if($lessonquestion_asked>=$lessonanswered_quiz){ if($modulequizdata['quiz_answers'][0]==""){ $attempted = ""; }else{ echo $attempted = "( ". get_percentage($lessonquestion_asked, $lessonanswered_quiz)."% ) <span style='color:red;'>Saved</span>"; } } } }else{ if($lesson_status->comment_approved=="passed"){ echo $attempted = '100% <span style="color:red;">complete button</span>'; }else{ $percentage = get_percentage($lessonquestion_asked, $lessonanswered_quiz); if((int)$lessonquestion_asked>1){ } } }*/ echo '<br />'; } // End For Loop echo "</td>"; echo "<td>"; echo $diftime; echo "</td>"; echo "</tr>"; //echo $course->post_title." (".$course_status_update['percent'][0]."% Complete) (". $incomplete . "% incomplete) (". $course_user_grade . "% Competent)<br />"; $i++; } } } echo "</table>"; } elseif ($tab == "threshold") { //declare the wpdb for custom query global $wpdb; //check for submitted data if (isset($_POST['submittreshold']) && ($_POST['submittreshold'] = "submit")) { // declare users and variables $completionpermonth = $_POST['completionpermonth']; $courseid = $_POST['course']; $group_id = $_POST['group']; $course_name = get_the_title($courseid); $array_to_csv = array(array('Student Name', 'Course Name', 'Module(s)')); $userincourse = BuddyPress_Sensei_Groups::bp_sensei_get_course_members($courseid); //groups_get_groupmeta //echo $group_attached = groups_get_groupmeta( $group_id, 'bp_course_attached', true)."<br />---"; if ($completionpermonth == "") { $completionpermonth = groups_get_groupmeta($group_id, 'sensei_threshold', true); } /* echo "<pre>"; print_r($userincourse); echo "</pre>"; echo "<pre>"; print_r($user_in_groups); echo "</pre>"; */ $user_in_groups = $wpdb->get_results($wpdb->prepare("SELECT user_id FROM wp_bp_groups_members WHERE group_id = %d", $group_id)); //user loop ----- loop user get the groups and course the course they take foreach ($user_in_groups as $user) { //echo "user_id ".$user->user_id."<br />"; $course_user_grade = WooThemes_Sensei_Utils::sensei_course_user_grade($courseid, $user->user_id); $user_course_status = WooThemes_Sensei_Utils::user_course_status($courseid, $user->user_id); $course_status_info = get_comment_meta($user_course_status->comment_ID); $started_course = WooThemes_Sensei_Utils::user_started_course($courseid, $user->user_id); $course_status = WooThemes_Sensei_Utils::sensei_user_course_status_message($courseid, $user->user_id); $completed_course = WooThemes_Sensei_Utils::user_completed_course($user_course_status); $modules = Sensei()->modules->get_course_modules($courseid); //$modules_content = Sensei()->modules->course_module_content( $courseid ); foreach ($modules as $module) { $module_id = $module->term_id; $args = array('post_type' => 'lesson', 'post_status' => 'publish', 'posts_per_page' => -1, 'tax_query' => array(array('taxonomy' => 'module', 'field' => 'id', 'terms' => $module_id)), 'meta_query' => array(array('key' => '_lesson_course', 'value' => $courseid)), 'fields' => 'ids'); $lessons = get_posts($args); $completed = false; $lesson_count = 0; $completed_count = 0; foreach ($lessons as $lesson_id) { $completed = WooThemes_Sensei_Utils::user_completed_lesson($lesson_id, $user->user_id); ++$lesson_count; if ($completed) { ++$completed_count; } } $module_progress = $completed_count / $lesson_count * 100; if ($module_progress == 100) { $module_passed[] = 1; $module_name[] = $module->name; } /* echo "<pre>"; echo $module_progress; echo "---<br />"; //print_r($modules_content); echo "</pre>"; */ } $course_status_info['start'][0]; $datenow = date('Y-m-d h:i:s'); $date1 = date_create($course_status_info['start'][0]); $date2 = date_create($datenow); $diff = date_diff($date1, $date2); $diftime = $diff->format("%m"); if ($diftime < 1) { $diftime = 1; } $num_of_module_x_difftime = $completionpermonth * $diftime; //echo "<br />num_of_module_x_difftime:".$num_of_module_x_difftime; //echo count($module_passed)." module passed<br />"; if (count($module_passed) >= $num_of_module_x_difftime) { $user_info = get_userdata($user->user_id); $array_to_csv[] = array($user_info->display_name, $course_name, join("|", $module_name)); //$userid_within_group[$user->user_email] = $user->ID; } unset($module_name); unset($module_passed); } /* echo "<pre>"; print_r($array_to_csv); echo "</pre>"; */ convert_to_csv($array_to_csv, 'report-' . md5(date('Y-m-d h:i:s')) . '.csv', ','); } ?> <div class="form-wrap" style="padding:20px;"> <form action="" method="post"> <div> <label> Group: </label> <?php $groups = $wpdb->get_results('SELECT * FROM `wp_bp_groups`'); ?> <select name="group"> <?php foreach ($groups as $group) { echo "<option value='" . $group->id . "'>"; echo $group->name; echo "</option>"; } ?> </select> </div> <div> <label> Course: </label> <?php $course = new WP_Query(array('post_type' => 'course')); ?> <select name="course"> <?php // The Loop if ($course->have_posts()) { while ($course->have_posts()) { $course->the_post(); echo '<option value="' . $course->post->ID . '">' . get_the_title() . '</option>'; } } /* Restore original Post Data */ ?> </select> <?php wp_reset_postdata(); ?> </div> <div> <label> How many modules should be completed by now? </label> <input type="text" name="completionpermonth" /> </div><br /><br /> <input type="submit" class="button button-primary" name="submittreshold" value="submit" /> </form> </div> <?php } elseif ($tab == "incremental-progress") { wp_enqueue_script('jquery-ui-datepicker'); wp_enqueue_style('jquery-style', 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.2/themes/smoothness/jquery-ui.css'); //declare the wpdb for custom query global $wpdb; //check for submitted data if (isset($_POST['submitincrenmental']) && ($_POST['submitincrenmental'] = "submit")) { // declare users and variables $courseid = $_POST['course']; $group_id = $_POST['group']; $course_name = get_the_title($courseid); $array_to_csv = array(array('Student Name', 'Course Name', 'Percentage Completed', 'Percentage Competent', 'Email')); $userincourse = BuddyPress_Sensei_Groups::bp_sensei_get_course_members($courseid); $user_in_groups = $wpdb->get_results($wpdb->prepare("SELECT user_id FROM wp_bp_groups_members WHERE group_id = %d", $group_id)); //user loop ----- loop user get the groups and course the course they take foreach ($user_in_groups as $user) { //echo "user_id ".$user->user_id."<br />"; $course_user_grade = WooThemes_Sensei_Utils::sensei_course_user_grade($courseid, $user->user_id); $user_course_status = WooThemes_Sensei_Utils::user_course_status($courseid, $user->user_id); $course_status_info = get_comment_meta($user_course_status->comment_ID); $started_course = WooThemes_Sensei_Utils::user_started_course($courseid, $user->user_id); $course_status = WooThemes_Sensei_Utils::sensei_user_course_status_message($courseid, $user->user_id); $completed_course = WooThemes_Sensei_Utils::user_completed_course($user_course_status); $modules = Sensei()->modules->get_course_modules($courseid); //$modules_content = Sensei()->modules->course_module_content( $courseid ); foreach ($modules as $module) { $module_id = $module->term_id; $args = array('post_type' => 'lesson', 'post_status' => 'publish', 'posts_per_page' => -1, 'tax_query' => array(array('taxonomy' => 'module', 'field' => 'id', 'terms' => $module_id)), 'meta_query' => array(array('key' => '_lesson_course', 'value' => $courseid)), 'fields' => 'ids'); $lessons = get_posts($args); $completed = false; $lesson_count = 0; $completed_count = 0; foreach ($lessons as $lesson_id) { $completed = WooThemes_Sensei_Utils::user_completed_lesson($lesson_id, $user->user_id); ++$lesson_count; if ($completed) { ++$completed_count; } } $module_progress = $completed_count / $lesson_count * 100; if ($module_progress == 100) { $module_passed[] = 1; } /* echo "<pre>"; echo $module_progress; echo "---<br />"; //print_r($modules_content); echo "</pre>"; */ } if ($course_status_info['percent'][0] != 0) { /* echo $user_course_status->comment_date."dsaddas"."<br />"; */ $date1 = strtotime($_POST['date1']); $date2 = strtotime($_POST['date2']); $lesson_completion_date_str = strtotime($user_course_status->comment_date); if ($lesson_completion_date_str > $date1 && $lesson_completion_date_str < $date2) { //echo "lesson is completed:".$is_lesson_completed."<br />"; //echo "user ".$user->display_name." pass this". $lesson_completion_date; $user_info = get_userdata($user->user_id); $array_to_csv[] = array($user_info->display_name, $course_name, $course_status_info['percent'][0] . '%', $course_user_grade . '%', $user_info->user_email); //$user_id_onrange[$user->ID] = $lesson_item->post_title; } } unset($module_passed); } /* echo "<pre>"; print_r($array_to_csv); echo "</pre>"; */ $daterange1 = $_POST['date1']; $daterange2 = $_POST['date2']; convert_to_csv($array_to_csv, 'report-inc-progress_' . $daterange1 . '_' . $daterange2 . '_group_' . $groupname . '_courseID_' . $courseid . '.csv', $headers); } ?> <div class="form-wrap" style="padding:20px;"> <form action="" method="post" id="incrementalval"> <div> <label> Group: </label> <?php $groups = $wpdb->get_results('SELECT * FROM `wp_bp_groups`'); ?> <select name="group"> <?php foreach ($groups as $group) { echo "<option value='" . $group->id . "'>"; echo $group->name; echo "</option>"; } ?> </select> </div><br /> <div> <label> Course: </label> <?php $course = new WP_Query(array('post_type' => 'course')); ?> <select name="course"> <?php // The Loop if ($course->have_posts()) { while ($course->have_posts()) { $course->the_post(); echo '<option value="' . $course->post->ID . '">' . get_the_title() . '</option>'; } } /* Restore original Post Data */ ?> </select> <?php wp_reset_postdata(); ?> </div><br /> <div> <label> Date: </label> From<input type="text" id="date1" name="date1" required /> to <input type="text" id="date2" name="date2" required /> </div><br /><br /> <input type="submit" class="button button-primary" name="submitincrenmental" value="submit" /> </form> </div> <script> jQuery(document).ready(function() { jQuery('#date1').datepicker({ dateFormat : 'yy-mm-dd' }); jQuery('#date2').datepicker({ dateFormat : 'yy-mm-dd' }); }); </script> <?php } elseif ($tab == "total-progress") { //declare the wpdb for custom query global $wpdb; //check for submitted data if (isset($_POST['submittotalprogress']) && ($_POST['submittotalprogress'] = "submit")) { // declare users and variables $courseid = $_POST['course']; $group_id = $_POST['group']; $course_name = get_the_title($courseid); $array_to_csv = array(array('Student Name', 'Course Name', 'Percentage Completed', 'Percentage Competent', 'Email')); $userincourse = BuddyPress_Sensei_Groups::bp_sensei_get_course_members($courseid); $user_in_groups = $wpdb->get_results($wpdb->prepare("SELECT user_id FROM wp_bp_groups_members WHERE group_id = %d", $group_id)); //user loop ----- loop user get the groups and course the course they take foreach ($user_in_groups as $user) { //echo "user_id ".$user->user_id."<br />"; $course_user_grade = WooThemes_Sensei_Utils::sensei_course_user_grade($courseid, $user->user_id); $user_course_status = WooThemes_Sensei_Utils::user_course_status($courseid, $user->user_id); $course_status_info = get_comment_meta($user_course_status->comment_ID); $started_course = WooThemes_Sensei_Utils::user_started_course($courseid, $user->user_id); $course_status = WooThemes_Sensei_Utils::sensei_user_course_status_message($courseid, $user->user_id); $completed_course = WooThemes_Sensei_Utils::user_completed_course($user_course_status); $modules = Sensei()->modules->get_course_modules($courseid); //$modules_content = Sensei()->modules->course_module_content( $courseid ); foreach ($modules as $module) { $module_id = $module->term_id; $args = array('post_type' => 'lesson', 'post_status' => 'publish', 'posts_per_page' => -1, 'tax_query' => array(array('taxonomy' => 'module', 'field' => 'id', 'terms' => $module_id)), 'meta_query' => array(array('key' => '_lesson_course', 'value' => $courseid)), 'fields' => 'ids'); $lessons = get_posts($args); $completed = false; $lesson_count = 0; $completed_count = 0; foreach ($lessons as $lesson_id) { $completed = WooThemes_Sensei_Utils::user_completed_lesson($lesson_id, $user->user_id); ++$lesson_count; if ($completed) { ++$completed_count; } } $module_progress = $completed_count / $lesson_count * 100; if ($module_progress == 100) { $module_passed[] = 1; } } $user_info = get_userdata($user->user_id); if ($user->user_id != 1) { $percentcomplete = $course_status_info['percent'][0]; if ($percentcomplete == "") { $percentcomplete = '0'; } $array_to_csv[] = array($user_info->display_name, $course_name, $percentcomplete . '%', $course_user_grade . '%', $user_info->user_email); } } convert_to_csv($array_to_csv, 'report-total-progress_' . date('Y-m-d') . '_group_' . $groupname . '_courseID_' . $courseid . '.csv', ','); } ?> <div class="form-wrap" style="padding:20px;"> <form action="" method="post"> <div> <label> Group: </label> <?php $groups = $wpdb->get_results('SELECT * FROM `wp_bp_groups`'); ?> <select name="group"> <?php foreach ($groups as $group) { echo "<option value='" . $group->id . "'>"; echo $group->name; echo "</option>"; } ?> </select> </div> <div> <label> Course: </label> <?php $course = new WP_Query(array('post_type' => 'course')); ?> <select name="course"> <?php // The Loop if ($course->have_posts()) { while ($course->have_posts()) { $course->the_post(); echo '<option value="' . $course->post->ID . '">' . get_the_title() . '</option>'; } } /* Restore original Post Data */ ?> </select> <?php wp_reset_postdata(); ?> </div> <br /><br /> <input type="submit" class="button button-primary" name="submittotalprogress" value="submit" /> </form> </div> <?php } elseif ($tab == "master-report") { //declare the wpdb for custom query global $wpdb; global $woothemes_sensei, $post, $current_user, $wp_query, $learner_user; //check for submitted data if (isset($_POST['master-report']) && ($_POST['master-report'] = "submit")) { // declare users and variables $courseid = $_POST['course']; $group_id = $_POST['group']; $course_name = get_the_title($courseid); $array_to_csv = array(array('Student Name', 'Course Name', 'Percentage Completed', 'Percentage Competent', 'Email')); $userincourse = BuddyPress_Sensei_Groups::bp_sensei_get_course_members($courseid); $user_in_groups = $wpdb->get_results($wpdb->prepare("SELECT user_id FROM wp_bp_groups_members WHERE group_id = %d", $group_id)); //user loop ----- loop user get the groups and course the course they take $maincontent = ""; $countloop_user = 0; $lesson_title = "<th align='center'>User</th>"; foreach ($user_in_groups as $user) { $maincontent .= "<tr>"; $user_info = get_userdata($user->user_id); $maincontent .= "<td>" . $user_info->display_name . "</td>"; $course_user_grade = WooThemes_Sensei_Utils::sensei_course_user_grade($courseid, $user->user_id); $user_course_status = WooThemes_Sensei_Utils::user_course_status($courseid, $user->user_id); $course_status_info = get_comment_meta($user_course_status->comment_ID); $started_course = WooThemes_Sensei_Utils::user_started_course($courseid, $user->user_id); $course_status = WooThemes_Sensei_Utils::sensei_user_course_status_message($courseid, $user->user_id); $completed_course = WooThemes_Sensei_Utils::user_completed_course($user_course_status); $modules = Sensei()->modules->get_course_modules($courseid); //$modules_content = Sensei()->modules->course_module_content( $courseid ); foreach ($modules as $module) { $module_id = $module->term_id; $args = array('post_type' => 'lesson', 'post_status' => 'publish', 'posts_per_page' => -1, 'tax_query' => array(array('taxonomy' => 'module', 'field' => 'id', 'terms' => $module_id)), 'meta_query' => array(array('key' => '_lesson_course', 'value' => $courseid)), 'fields' => 'ids', 'order' => 'ASC'); $lessons = get_posts($args); $completed = false; $lesson_count = 0; $completed_count = 0; foreach ($lessons as $lesson_id) { if ($countloop_user != 1) { $lesson_title .= "<th style=\"font-size:10px;\">"; $lesson_title .= get_the_title($lesson_id); $lesson_title .= "</th>"; } // Get quiz pass setting $pass_required = get_post_meta($lesson_id, '_pass_required', true); // Get quiz pass mark $quiz_passmark = abs(round(doubleval(get_post_meta($lesson_id, '_quiz_passmark', true)), 2)); // Get latest quiz answers and grades //$lesson_id = $woothemes_sensei->quiz->get_lesson_id( $lesson_id ); $user_quizzes = $woothemes_sensei->quiz->get_user_answers($lesson_id, $user->user_id); $user_lesson_status = WooThemes_Sensei_Utils::user_lesson_status($lesson_id, $user->user_id); $user_quiz_grade = 0; if (isset($user_lesson_status->comment_ID)) { $user_quiz_grade = get_comment_meta($user_lesson_status->comment_ID, 'grade', true); } // Check again that the lesson is complete $user_lesson_end = WooThemes_Sensei_Utils::user_completed_lesson($user_lesson_status); $completed = WooThemes_Sensei_Utils::user_completed_lesson($lesson_id, $user->user_id); /* echo "<pre>"; echo get_the_title($lesson_id); echo 'pass_required:'."<br />"; print_r($pass_required); echo 'quiz_passmark:<br />'; print_r($quiz_passmark); echo 'user_quizzes:<br />'; print_r($user_quizzes); echo 'user_lesson_status:<br />'; print_r($user_lesson_status); echo 'Percent Competent:<br />'; print_r($user_quiz_grade); echo 'completed--:'.$completed."<br />"; echo 'user_lesson_end--:'.$user_lesson_end."<br />"; echo "_quiz_has_questions:".get_post_meta( $lesson_id, '_quiz_has_questions', true )."<br /><br />"; echo "this is the lersson info-----------------:"; print_r(get_comment_meta( $user_lesson_status->comment_ID )); $lessonquizdata = get_comment_meta( $user_lesson_status->comment_ID ); echo "lessonquizdata---:"; print_r(unserialize($lessonquizdata['quiz_answers'][0])); echo "</pre>"; */ $maincontent .= "<td>"; if ($completed == 1) { $percentcompleted = '100%'; } else { $lessonquizdata = get_comment_meta($user_lesson_status->comment_ID); $lessonquizdata_asked = count(explode(",", $lessonquizdata['questions_asked'][0])); $lessonquizdataanswered_quiz = count(unserialize($lessonquizdata['quiz_answers'][0])); $lquizcounter = 0; foreach ($lessonquizdataanswered_quiz as $lquiz) { if ($lquiz != "") { $lquizcounter++; } } /* echo "<pre>"; echo $lessonquizdata_asked."<br />"; print_r($lessonquizdata); print_r(unserialize($lessonquizdata['quiz_answers'][0])); echo "</pre>"; */ if ($user_lesson_status->comment_approved == "passed" || $user_lesson_status->comment_approved == "graded") { $percentcompleted = '100%'; } else { $percentcompleted = get_percentage($lessonquizdata_asked, $lquizcounter) . '%'; } } $maincontent .= '%S: ' . $percentcompleted . "<br />"; $maincontent .= '%C: ' . $user_quiz_grade . "%"; $maincontent .= "</td>"; ++$lesson_count; if ($completed) { ++$completed_count; } } $module_progress = $completed_count / $lesson_count * 100; if ($module_progress == 100) { $module_passed[] = 1; } } $countloop_user = 1; $user_info = get_userdata($user->user_id); $completionpermonth = groups_get_groupmeta($group_id, 'sensei_threshold', true); if (count($module_passed) >= $completionpermonth) { $ontract = "yes"; } else { $ontract = "no"; } $maincontent .= "<td>" . $ontract . "</td>"; if ($completed_course == 1) { $completed_course = $user_course_status->comment_date; } else { $completed_course = "No"; } $maincontent .= "<td>" . $completed_course . "</td>"; $maincontent .= "</tr>"; unset($module_passed); } echo '<table class="wp-list-table widefat fixed striped pages" style="width:500%; border-spacing: 0; text-align:center;" >'; echo "<tr>"; echo $lesson_title; echo "<td>On Track Or Not</td>"; echo "<td>Course Completed</td>"; echo "</tr>"; echo $maincontent; echo "</table>"; /* echo "<pre>"; print_r($array_to_csv); echo "</pre>"; */ //convert_to_csv($array_to_csv, 'report-total-progress_'.date('Y-m-d').'_group_'.$groupname.'_courseID_'.$courseid.'.csv', ','); } ?> <div class="form-wrap" style="padding:20px;"> <form action="" method="post"> <div> <label> Group: </label> <?php $groups = $wpdb->get_results('SELECT * FROM `wp_bp_groups`'); ?> <select name="group" required> <option value="">- Select One -</option> <?php foreach ($groups as $group) { echo "<option value='" . $group->id . "'>"; echo $group->name; echo "</option>"; } ?> </select> </div> <div> <label> Course: </label> <?php $course = new WP_Query(array('post_type' => 'course')); ?> <select name="course" required> <option value="">- Select One -</option> <?php // The Loop if ($course->have_posts()) { while ($course->have_posts()) { $course->the_post(); echo '<option value="' . $course->post->ID . '">' . get_the_title() . '</option>'; } } /* Restore original Post Data */ ?> </select> <?php wp_reset_postdata(); ?> </div> <br /><br /> <input type="submit" class="button button-primary" name="master-report" value="submit" /> </form> </div> <?php } //end master-report echo '</div>'; }
do_action('sensei_lesson_archive_header'); ?> <?php while (have_posts()) { the_post(); // Meta data $post_id = get_the_ID(); ?> <?php $single_lesson_complete = false; $user_lesson_status = false; if (is_user_logged_in()) { // Check if Lesson is complete $user_lesson_status = WooThemes_Sensei_Utils::user_lesson_status($post_id, $current_user->ID); if (WooThemes_Sensei_Utils::user_completed_lesson($user_lesson_status)) { $single_lesson_complete = true; } } // End If Statement $complexity_array = $woothemes_sensei->post_types->lesson->lesson_complexities(); $lesson_length = get_post_meta($post_id, '_lesson_length', true); $lesson_complexity = get_post_meta($post_id, '_lesson_complexity', true); if ('' != $lesson_complexity) { $lesson_complexity = $complexity_array[$lesson_complexity]; } $user_info = get_userdata(absint(get_the_author_meta('ID'))); $html = '<article class="' . esc_attr(join(' ', get_post_class(array('lesson', 'course', 'post'), $post_id))) . '">'; $html .= '<header>'; $html .= '<h2><a href="' . esc_url(get_permalink($post_id)) . '" title="' . esc_attr(sprintf(__('Start %s', 'woothemes-sensei'), get_the_title())) . '">';