/**
  * Reset the user's progress in the specified course
  *
  * @param mixed $course The course to reset
  * @param boolean $resetLessons whether to reset lesson progress as well
  * @since 3.6.3
  * @access public
  */
 public function resetProgressInCourse($course, $resetLessons = false, $keep_certificate = false)
 {
     if (!$course instanceof EfrontCourse) {
         $course = new EfrontCourse($course);
     }
     $tracking_info = array("issued_certificate" => "", "comments" => "", "from_timestamp" => time(), "to_timestamp" => 0, "completed" => 0, "score" => 0);
     if ($keep_certificate) {
         unset($tracking_info["issued_certificate"]);
     }
     eF_updateTableData("users_to_courses", $tracking_info, "users_LOGIN='******'login'] . "' and courses_ID = " . $course->course['id']);
     if ($resetLessons) {
         foreach ($course->getCourseLessons() as $lesson) {
             $this->resetProgressInLesson($lesson);
         }
     }
     $event = array("type" => EfrontEvent::COURSE_PROGRESS_RESET, "users_LOGIN" => $this->user['login'], "lessons_ID" => $course->course['id'], "lessons_name" => $course->course['name']);
     EfrontEvent::triggerEvent($event);
     foreach (eF_loadAllModules(true, true) as $key => $module) {
         $module->onResetProgressInCourse($course->course['id'], $this->user['login']);
     }
 }
Exemplo n.º 2
0
             echo "<status>error</status>";
             echo "<message>Incomplete arguments</message>";
             echo "</xml>";
         }
     } else {
         echo "<xml>";
         echo "<status>error</status>";
         echo "<message>Invalid token</message>";
         echo "</xml>";
     }
     break;
 case 'course_lessons':
     if (isset($_GET['token']) && checkToken($_GET['token'])) {
         if (isset($_GET['course'])) {
             $course = new EfrontCourse($_GET['course']);
             $lessons = EfrontCourse::convertLessonObjectsToArrays($course->getCourseLessons());
             echo "<xml>";
             echo "\n\t";
             echo "<lessons>";
             echo "\n\t\t";
             foreach ($lessons as $key => $values) {
                 echo "<lesson>";
                 echo "\n\t\t\t";
                 echo "<id>" . $lessons[$key]['id'] . "</id>";
                 echo "\n\t\t\t";
                 echo "<name>" . $lessons[$key]['name'] . "</name>";
                 echo "\n\t\t\t";
                 echo "<previous_lessons_ID>" . $lessons[$key]['previous_lessons_ID'] . "</previous_lessons_ID>";
                 echo "\n\t\t";
                 echo "</lesson>";
             }
Exemplo n.º 3
0
 /**
  * Get the next lesson in row, or in the course, if specified
  *
  * @param EfrontLesson $lesson The lesson to account
  * @param mixed $course The course to regard, or false
  * @param boolean $assumeCurrentLessonCompleted When calculating the next lesson, we may want to find which one will be the next after we finish the current lesson. Setting this to true will bring that one 
  * @return int The id of the next lesson in row
  * @since 3.6.3
  * @access public
  */
 public function getNextLesson($lesson, $course = false, $assumeCurrentLessonCompleted = false)
 {
     $nextLesson = false;
     if ($course) {
         $course instanceof EfrontCourse or $course = new EfrontCourse($course);
         //$courseLessons = $this -> getUserStatusInCourseLessons($course);
         $result = eF_getTableData("users_to_lessons ul join lessons_to_courses lc on ul.lessons_ID=lc.lessons_ID", "ul.lessons_ID as id,completed", "users_LOGIN='******'login']}' AND courses_ID={$course->course['id']}");
         //Set ids for keys
         $temp = array();
         foreach ($result as $value) {
             $temp[$value['id']] = $value;
         }
         $result = $temp;
         //Put the result in correct order
         $lessons_order = array_keys($course->getCourseLessons());
         $temp = array();
         foreach ($lessons_order as $value) {
             $temp[$value] = $result[$value];
         }
         $result = $temp;
         $courseLessons = array();
         if ($assumeCurrentLessonCompleted) {
             foreach ($result as $value) {
                 $courseLessons[$value['id']] = $value;
                 if ($value['id'] == $lesson->lesson['id']) {
                     $courseLessons[$value['id']]['completed'] = true;
                 }
             }
         }
         $eligibility = new ArrayIterator($course->checkRules($_SESSION['s_login'], $courseLessons));
         while ($eligibility->valid() && ($key = $eligibility->key()) != $lesson->lesson['id']) {
             $eligibility->next();
         }
         $eligibility->next();
         if ($eligibility->valid() && $eligibility->key() && $eligibility->current()) {
             $nextLesson = $eligibility->key();
         }
     } else {
         $directionsTree = new EfrontDirectionsTree();
         $userLessons = new ArrayIterator($directionsTree->getLessonsList($this->getUserLessons()));
         while ($userLessons->valid() && ($key = $userLessons->current()) != $lesson->lesson['id']) {
             $userLessons->next();
         }
         $userLessons->next();
         if ($userLessons->valid() && $userLessons->current()) {
             $nextLesson = $userLessons->current();
         }
     }
     return $nextLesson;
 }
Exemplo n.º 4
0
 public function getUserCourseStatus($course, $user, $options, $courseLessons = false)
 {
     if (!$user instanceof EfrontUser) {
         $user = EfrontUserFactory::factory($user);
         $user = $user->user;
     }
     if (!$course instanceof EfrontCourse) {
         $course = new EfrontCourse($course);
     }
     $roles = EfrontLessonUser::getLessonsRoles();
     foreach ($roles as $key => $value) {
         $value == 'student' ? $studentLessonRoles[] = $key : null;
     }
     if ($courseLessons == false) {
         $courseLessons = $course->getCourseLessons();
     }
     $lessonsStatus = self::getUsersLessonStatus($courseLessons, $user['login'], $options);
     $result = eF_getTableData("users_to_courses", "*", "courses_ID = " . $course->course['id'] . " and users_LOGIN='******'login'] . "'");
     if (sizeof($result) > 0) {
         if ($course->course['duration'] && $result[0]['from_timestamp']) {
             $result[0]['remaining'] = $result[0]['from_timestamp'] + $course->course['duration'] * 3600 * 24 - time();
         } else {
             $result[0]['remaining'] = null;
         }
         //Check whether the course registration is expired. If so, set $result[0]['from_timestamp'] to false, so that the effect is to appear disabled
         if ($course->course['duration'] && $result[0]['from_timestamp'] && $course->course['duration'] * 3600 * 24 + $result[0]['from_timestamp'] < time()) {
             $course->removeUsers($result[0]['users_LOGIN']);
         } else {
             $usersCourses[$result[0]['courses_ID']][$result[0]['users_LOGIN']] = $result[0];
             $usersCoursesTypes[$result[0]['courses_ID']][$result[0]['users_LOGIN']] = $roles[$result[0]['user_type']];
             //Handy since we need to know whether a course has any students
         }
     }
     $courseStatus = array();
     //transpose and filter s statistics array, for convenience, from  lesson id => login to login => lesson id
     foreach ($lessonsStatus as $lessonId => $info) {
         if (in_array($lessonId, array_keys($courseLessons))) {
             foreach ($info as $login => $stats) {
                 $userLessonStatus[$lessonId] = $stats;
             }
         }
     }
     if (sizeof($usersCourses[$course->course['id']]) > 0) {
         foreach ($usersCourses[$course->course['id']] as $login => $value) {
             $courseStatus = array('login' => $login, 'name' => $user['name'], 'surname' => $user['surname'], 'basic_user_type' => $user['user_type'], 'user_type' => $value['user_type'], 'user_types_ID' => $user['user_types_ID'], 'different_role' => !$users[$login]['user_types_ID'] && $value['user_type'] != $users[$login]['user_type'] || $users[$login]['user_types_ID'] && $value['user_type'] != $users[$login]['user_types_ID'], 'active' => $user['active'], 'course_name' => $course->course['name'], 'from_timestamp' => $value['from_timestamp'], 'remaining' => $value['remaining']);
             //Student - specific information
             if ($roles[$value['user_type']] == 'student') {
                 $courseStatus['completed'] = $value['completed'];
                 $courseStatus['score'] = $value['score'];
                 $courseStatus['completion_date'] = $value['to_timestamp'];
                 $courseStatus['comments'] = $value['comments'];
                 $courseStatus['issued_certificate'] = $value['issued_certificate'];
                 $courseStatus['total_lessons'] = sizeof($courseLessons);
                 //Count completed lessons
                 $completedLessons = 0;
                 if (isset($userLessonStatus)) {
                     foreach ($userLessonStatus as $lesson) {
                         if ($lesson['completed']) {
                             $completedLessons++;
                         }
                     }
                 }
                 $courseStatus['completed_lessons'] = $completedLessons;
             }
             //Append the course's lessons information
             $courseStatus['lesson_status'] = $userLessonStatus;
         }
     }
     return $courseStatus;
 }
         }
         $current_course->course['remaining'] = $check_completed_course[0]['active_in_course'] + $current_course->options['duration'] * 3600 * 24 - time();
         if ($current_course->course['end_date'] && $current_course->course['end_date'] < $check_completed_course[0]['active_in_course'] + $current_course->options['duration'] * 3600 * 24) {
             $current_course->course['remaining'] = $current_course->course['end_date'] - time();
         }
     } else {
         $current_course->course['remaining'] = null;
     }
 }
 if (!empty($current_course->course['remaining'])) {
     $smarty->assign("T_COURSE_USER_REMAINING_STRING", '<span style = "font-style:italic">&nbsp;(' . eF_convertIntervalToTime($current_course->course['remaining'], true) . ' ' . mb_strtolower(_REMAINING) . ')</span>');
 }
 //Added code to check course completion in case course must have been completed but it is not (remove lesson from course after all other lessons were completed)
 if ($userProgress['completed'] && $current_course->options['auto_complete'] && !$check_completed_course[0]['completed']) {
     $constraints = array('archive' => false, 'active' => true, 'return_objects' => false);
     $courseLessons = $current_course->getCourseLessons($constraints);
     if (!empty($courseLessons)) {
         $userLessons = array();
         $result = eF_getTableData("users_to_lessons", "lessons_ID,completed,score", "users_LOGIN='******'s_login'] . "' and lessons_ID IN (" . implode(',', array_keys($courseLessons)) . ")");
         foreach ($result as $value) {
             if ($userLessons[$value['lessons_ID']] = $value) {
             }
         }
         $completed = $score = array();
         foreach ($courseLessons as $lessonId => $value) {
             $userLessons[$lessonId]['completed'] ? $completed[] = 1 : ($completed[] = 0);
             $score[] = $userLessons[$lessonId]['score'];
         }
         if (array_sum($completed) == sizeof($completed)) {
             //If all the course's lessons are completed, then auto complete the course, using the mean lessons score
             $currentUser->completeCourse($current_course->course['id'], round(array_sum($score) / sizeof($score)), _AUTOCOMPLETEDCOURSE);
Exemplo n.º 6
0
     }
     echo json_encode($response);
     exit;
 } else {
     if (isset($_GET['ajax']) && in_array($_GET['ajax'], array('courseLessonsTable', 'instancesTable', 'coursesTable'))) {
         $roles = EfrontLessonUser::getLessonsRoles(true);
         $smarty->assign("T_ROLES_ARRAY", $roles);
         $directionsTree = new EfrontDirectionsTree();
         $smarty->assign("T_DIRECTION_PATHS", $directionsTree->toPathString());
         $rolesBasic = EfrontLessonUser::getLessonsRoles();
         $smarty->assign("T_BASIC_ROLES_ARRAY", $rolesBasic);
         $smarty->assign("T_EDITED_USER_TYPE", $editedUser->user['user_types_ID'] ? $editedUser->user['user_types_ID'] : $editedUser->user['user_type']);
         if (isset($_GET['ajax']) && $_GET['ajax'] == 'courseLessonsTable' && eF_checkParameter($_GET['courseLessonsTable_source'], 'id')) {
             $smarty->assign("T_DATASOURCE_COLUMNS", array('name', 'completed', 'score'));
             $course = new EfrontCourse($_GET['courseLessonsTable_source']);
             $courseLessons = $course->getCourseLessons();
             $userLessons = $editedUser->getUserStatusInCourseLessons($course);
             foreach ($userLessons as $key => $value) {
                 $courseLessons[$key] = $value;
             }
             $lessons = EfrontLesson::convertLessonObjectsToArrays($courseLessons);
             $alreadySorted = true;
             $dataSource = $lessons;
         }
         if ($_GET['ajax'] == 'coursesTable' || $_GET['ajax'] == 'instancesTable') {
             if (isset($_GET['ajax']) && $_GET['ajax'] == 'coursesTable') {
                 $_GET['sort'] != 'null' or $_GET['sort'] = 'has_course';
                 $constraints = array('archive' => false, 'instance' => false) + createConstraintsFromSortedTable();
                 $constraints['required_fields'] = array('has_instances', 'location', 'active_in_course', 'user_type', 'completed', 'score', 'has_course', 'num_lessons');
                 $constraints['return_objects'] = false;
                 if ($_change_courses_) {