$lessonUser = EfrontUserFactory::factory($editedUser->user['login'], false, 'student'); $lessonUser->completeLesson($currentLesson->lesson['id'], $form->exportValue('score'), $form->exportValue('comments')); } else { eF_updateTableData("users_to_lessons", array('completed' => 0, 'score' => 0, 'to_timestamp' => null), "users_LOGIN = '******'login'] . "' and lessons_ID=" . $currentLesson->lesson['id']); // $cacheKey = "user_lesson_status:lesson:".$currentLesson -> lesson['id']."user:"******"tests t, content c", "t.id, c.name", "c.id=t.content_ID and t.active=1 and t.publish=1 and c.ctg_type='tests' and c.lessons_ID=" . $currentLesson->lesson['id']); $testNames = array_combine($testNames['id'], $testNames['name']); foreach ($doneTests[$_GET['edit_user']] as $key => $value) { if (in_array($key, array_keys($testNames))) { $userStats['done_tests'][$key] = array('name' => $testNames[$key], 'score' => $value['average_score'], 'last_test_id' => $value['last_test_id'], 'active_test_id' => $value['active_test_id'], 'last_score' => $value['scores'][$value['last_test_id']], 'active_score' => $value['active_score'], 'times_done' => $value['times_done'], 'content_ID' => $value[$value['last_test_id']]['content_ID']); } } foreach ($scormDoneTests as $key => $value) { $userStats['scorm_done_tests'][$key] = array('name' => $value['name'], 'score' => $value['score'], 'content_ID' => $key);
/** * Get user done tests in lesson * * This function finds the done tests of the specified users. * If $users is not specified, then information on all users and/or lessons * is calculated. * <br/>Example: * <code> * EfrontStats :: getStudentsDoneTests(3, 'jdoe'); //Get statistics for user jdoe in lesson 3 * EfrontStats :: getStudentsDoneTests(3, array('jdoe', 'george')); //Get statistics for users george and jdoe in lesson 3 * EfrontStats :: getStudentsDoneTests(3); //Get statistics for all users in lesson 3 * </code> * The resulting array is of the form array(login => array(content id => array(results))): * <code> * Array * ( * [jdoe] => Array * ( * [30] => Array * ( * [lessons_ID] => 78 * [name] => Maya History Test * [content_ID] => 30 * [done_tests_ID] => 1 * [tests_ID] => 2 * [score] => 1 * [comments] => * [users_LOGIN] => jdoe * ) * [2] => Array * ( * [lessons_ID] => 77 * [name] => General concepts test * [content_ID] => 2 * [done_tests_ID] => 2 * [tests_ID] => 1 * [score] => 0.333333 * [comments] => * [users_LOGIN] => jdoe * ) * ) * [george] => Array * ( * [2] => Array * ( * [lessons_ID] => 77 * [name] => General concepts test * [content_ID] => 2 * [done_tests_ID] => 3 * [tests_ID] => 1 * [score] => 1 * [comments] => * [users_LOGIN] => george * ) * ) * ) * </code> * * @param mixed $lessons Either the lesson id or an EfrontLesson object, or an array of such * @param mixed $users A single user login, an array of user logins or nothing for all users * @return array The done tests per user * @since 3.5.0 * @access public * @static */ public static function getStudentsDoneTests($lessons = false, $users = false) { if (!$users) { $users = eF_getTableDataFlat("users", "login"); $users = $users['login']; } elseif (!is_array($users)) { $users = array($users); } if ($lessons !== false) { if (!is_array($lessons)) { $lessons = array($lessons); } foreach ($lessons as $key => $lesson) { $lesson instanceof EfrontLesson ? $lessons[$key] = $lesson->lesson['id'] : null; } $lessonId = implode(",", $lessons); } /* $usersDoneTests = eF_getTableData("tests t, content c, done_tests dt", "c.lessons_ID, c.name, c.active, t.content_ID, dt.id as done_tests_ID, dt.tests_ID, dt.score, dt.comments, dt.users_LOGIN, dt.timestamp", "dt.tests_ID = t.id and t.content_ID = c.id".($lessonId ? " and c.lessons_ID in ($lessonId)" : "")); $doneTests = array(); foreach ($usersDoneTests as $doneTest) { if (!$users || in_array($doneTest['users_LOGIN'], $users)) { $doneTests[$doneTest['users_LOGIN']][$doneTest['content_ID']] = $doneTest; } } */ $doneTests = array(); //We create a 10-fold loop for memory efficiency for ($i = 0; $i < sizeof($users); $i += 20) { $temp = EfrontStats::getDoneTestsPerUser(array_slice($users, $i, 10, true)); } //@todo: This is for compatibility with previous version and should be removed in the future foreach ($temp as $user => $value) { foreach ($value as $testId => $testData) { if (is_array($testData)) { foreach ($testData as $done_tests_ID => $test) { if (is_numeric($done_tests_ID) && $done_tests_ID == $testData['active_test_id']) { //$unit = $test -> getUnit(); $stats = array('lessons_ID' => $test['lessons_ID'], 'name' => $test['name'], 'active' => $test['active'], 'content_ID' => $test['content_ID'], 'done_tests_ID' => $done_tests_ID, 'tests_ID' => $test['tests_ID'], 'score' => $test['score'], 'active_score' => $testData['active_score'], 'active_test_id' => $testData['active_test_id'], 'status' => $test['status'], 'users_LOGIN' => $user, 'timestamp' => $test['time_end']); if ($dt['archive'] == 0 && $test['status'] != 'incomplete' && $test['status'] != '' && ($lessons === false || in_array($stats['lessons_ID'], $lessons)) && in_array($stats['users_LOGIN'], $users)) { $doneTests[$user][$test['content_ID']] = $stats; } } } } } } $usersDoneScormTests = eF_getTableData("content c, scorm_data sd", "c.lessons_ID, c.name, c.active, sd.masteryscore, sd.lesson_status, sd.content_ID, sd.score, sd.minscore, sd.maxscore, sd.users_LOGIN, sd.timestamp", "sd.lesson_status != 'incomplete' and sd.content_ID = c.id and c.ctg_type = 'scorm_test' and sd.users_LOGIN != ''" . ($lessonId ? " and c.lessons_ID in ({$lessonId})" : "")); foreach ($usersDoneScormTests as $doneScormTest) { if (!$users || in_array($doneScormTest['users_LOGIN'], $users)) { if (is_numeric($doneScormTest['minscore']) && is_numeric($doneScormTest['maxscore'])) { $doneScormTest['score'] = 100 * $doneScormTest['score'] / ($doneScormTest['minscore'] + $doneScormTest['maxscore']); } else { $doneScormTest['score'] = $doneScormTest['score']; } $doneScormTest['active_score'] = $doneScormTest['score']; $doneScormTest['status'] = $doneScormTest['lesson_status']; $doneScormTest['scorm'] = true; $doneTests[$doneScormTest['users_LOGIN']][$doneScormTest['content_ID']] = $doneScormTest; } } return $doneTests; }