|
|
|
@ -25,6 +25,7 @@ class MySpace |
|
|
|
array('url' => api_get_path(WEB_CODE_PATH).'mySpace/admin_view.php?display=course', 'content' => get_lang('DisplayCourseOverview')), |
|
|
|
array('url' => api_get_path(WEB_CODE_PATH).'mySpace/admin_view.php?display=course', 'content' => get_lang('DisplayCourseOverview')), |
|
|
|
array('url' => api_get_path(WEB_CODE_PATH).'tracking/question_course_report.php?view=admin', 'content' => get_lang('LPQuestionListResults')), |
|
|
|
array('url' => api_get_path(WEB_CODE_PATH).'tracking/question_course_report.php?view=admin', 'content' => get_lang('LPQuestionListResults')), |
|
|
|
array('url' => api_get_path(WEB_CODE_PATH).'tracking/course_session_report.php?view=admin', 'content' => get_lang('LPExerciseResultsBySession')), |
|
|
|
array('url' => api_get_path(WEB_CODE_PATH).'tracking/course_session_report.php?view=admin', 'content' => get_lang('LPExerciseResultsBySession')), |
|
|
|
|
|
|
|
['url' => api_get_path(WEB_CODE_PATH) . 'mySpace/admin_view.php?display=accessoverview', 'content' => get_lang('DisplayAccessOverview') . ' (' . get_lang('Beta') . ')'] |
|
|
|
); |
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
return Display :: actions($actions, null); |
|
|
|
return Display :: actions($actions, null); |
|
|
|
@ -2726,6 +2727,243 @@ class MySpace |
|
|
|
xml_parser_free($parser); |
|
|
|
xml_parser_free($parser); |
|
|
|
return $users; |
|
|
|
return $users; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static function displayTrackingAccessOverView($courseId, $sessionId, $studentId) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
$courseId = intval($courseId); |
|
|
|
|
|
|
|
$sessionId = intval($sessionId); |
|
|
|
|
|
|
|
$studentId = intval($studentId); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$em = Database::getManager(); |
|
|
|
|
|
|
|
$sessionRepo = $em->getRepository('ChamiloCoreBundle:Session'); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$courseList = []; |
|
|
|
|
|
|
|
$sessionList = []; |
|
|
|
|
|
|
|
$studentList = []; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!empty($courseId)) { |
|
|
|
|
|
|
|
$course = $em->find('ChamiloCoreBundle:Course', $courseId); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$courseList[$course->getId()] = $course->getTitle(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!empty($sessionId)) { |
|
|
|
|
|
|
|
$session = $em->find('ChamiloCoreBundle:Session', $sessionId); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$sessionList[$session->getId()] = $session->getName(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!empty($studentId)) { |
|
|
|
|
|
|
|
$student = $em->find('ChamiloUserBundle:User', $studentId); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$studentList[$student->getId()] = $student->getCompleteName(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$form = new FormValidator('access_overview', 'GET'); |
|
|
|
|
|
|
|
$form->addElement( |
|
|
|
|
|
|
|
'select_ajax', |
|
|
|
|
|
|
|
'course_id', |
|
|
|
|
|
|
|
get_lang('SearchCourse'), |
|
|
|
|
|
|
|
$courseList, |
|
|
|
|
|
|
|
[ |
|
|
|
|
|
|
|
'url' => api_get_path(WEB_AJAX_PATH) . 'course.ajax.php?' . http_build_query([ |
|
|
|
|
|
|
|
'a' => 'search_course_by_session_all', |
|
|
|
|
|
|
|
'session_id' => $sessionId |
|
|
|
|
|
|
|
]) |
|
|
|
|
|
|
|
] |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
$form->addElement( |
|
|
|
|
|
|
|
'select_ajax', |
|
|
|
|
|
|
|
'session_id', |
|
|
|
|
|
|
|
get_lang('SearchSession'), |
|
|
|
|
|
|
|
$sessionList, |
|
|
|
|
|
|
|
[ |
|
|
|
|
|
|
|
'url_function' => " |
|
|
|
|
|
|
|
function () { |
|
|
|
|
|
|
|
var params = $.param({ |
|
|
|
|
|
|
|
a: 'search_session_by_course', |
|
|
|
|
|
|
|
course_id: $('#course_id').val() || 0 |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return '" . api_get_path(WEB_AJAX_PATH) . "session.ajax.php?' + params; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
" |
|
|
|
|
|
|
|
] |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
$form->addSelect( |
|
|
|
|
|
|
|
'profile', |
|
|
|
|
|
|
|
get_lang('Profile'), |
|
|
|
|
|
|
|
[ |
|
|
|
|
|
|
|
'' => get_lang('Select'), |
|
|
|
|
|
|
|
STUDENT => get_lang('Student'), |
|
|
|
|
|
|
|
COURSEMANAGER => get_lang('CourseManager'), |
|
|
|
|
|
|
|
DRH => get_lang('Drh') |
|
|
|
|
|
|
|
], |
|
|
|
|
|
|
|
['id' => 'profile'] |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
$form->addElement( |
|
|
|
|
|
|
|
'select_ajax', |
|
|
|
|
|
|
|
'student_id', |
|
|
|
|
|
|
|
get_lang('SearchUsers'), |
|
|
|
|
|
|
|
$studentList, |
|
|
|
|
|
|
|
[ |
|
|
|
|
|
|
|
'placeholder' => get_lang('All'), |
|
|
|
|
|
|
|
'url_function' => " |
|
|
|
|
|
|
|
function () { |
|
|
|
|
|
|
|
var params = $.param({ |
|
|
|
|
|
|
|
a: 'search_user_by_course', |
|
|
|
|
|
|
|
session_id: $('#session_id').val(), |
|
|
|
|
|
|
|
course_id: $('#course_id').val() |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return '" . api_get_path(WEB_AJAX_PATH) . "course.ajax.php?' + params; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
" |
|
|
|
|
|
|
|
] |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
$form->addDateRangePicker( |
|
|
|
|
|
|
|
'date', |
|
|
|
|
|
|
|
get_lang('DateRange'), |
|
|
|
|
|
|
|
true, |
|
|
|
|
|
|
|
[ |
|
|
|
|
|
|
|
'id' => 'date_range', |
|
|
|
|
|
|
|
'format' => 'YYYY-MM-DD', |
|
|
|
|
|
|
|
'timePicker' => 'false', |
|
|
|
|
|
|
|
'validate_format' => 'Y-m-d' |
|
|
|
|
|
|
|
] |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
$form->addHidden('display', 'accessoverview'); |
|
|
|
|
|
|
|
$form->addRule('course_id', get_lang('Required'), 'required'); |
|
|
|
|
|
|
|
$form->addRule('profile', get_lang('Required'), 'required'); |
|
|
|
|
|
|
|
$form->addButton('submit', get_lang('Generate'), 'gear', 'primary'); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$table = null; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ($form->validate()) { |
|
|
|
|
|
|
|
$table = new SortableTable( |
|
|
|
|
|
|
|
'tracking_access_overview', |
|
|
|
|
|
|
|
['MySpace','getNumberOfRrackingAccessOverview'], |
|
|
|
|
|
|
|
['MySpace','getUserDataAccessTrackingOverview'], |
|
|
|
|
|
|
|
0 |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
$table->additional_parameters = $form->exportValues(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$table->set_header(0, get_lang('LoginDate'), true); |
|
|
|
|
|
|
|
$table->set_header(1, get_lang('Username'), true); |
|
|
|
|
|
|
|
if (api_is_western_name_order()) { |
|
|
|
|
|
|
|
$table->set_header(2, get_lang('FirstName'), true); |
|
|
|
|
|
|
|
$table->set_header(3, get_lang('LastName'), true); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
$table->set_header(2, get_lang('LastName'), true); |
|
|
|
|
|
|
|
$table->set_header(3, get_lang('FirstName'), true); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
$table->set_header(4, get_lang('Clicks'), false); |
|
|
|
|
|
|
|
$table->set_header(5, get_lang('IP'), false); |
|
|
|
|
|
|
|
$table->set_header(6, get_lang('TimeLoggedIn'), false); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$template = new Template(null, false, false, false, false, false, false); |
|
|
|
|
|
|
|
$template->assign('form', $form->returnForm()); |
|
|
|
|
|
|
|
$template->assign('table', $table ? $table->return_table() : null); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
echo $template->fetch( |
|
|
|
|
|
|
|
$template->get_template('my_space/accessoverview.tpl') |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static function getNumberOfRrackingAccessOverview() |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
$track_e_course_access = Database::get_main_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return Database::count_rows($track_e_course_access); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static function getUserDataAccessTrackingOverview($from, $numberItems, $column, $orderDirection) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
$user = Database::get_main_table(TABLE_MAIN_USER); |
|
|
|
|
|
|
|
$course = Database::get_main_table(TABLE_MAIN_COURSE); |
|
|
|
|
|
|
|
$track_e_login = Database::get_main_table(TABLE_STATISTIC_TRACK_E_LOGIN); |
|
|
|
|
|
|
|
$track_e_course_access = Database::get_main_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
global $export_csv; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ($export_csv) { |
|
|
|
|
|
|
|
$is_western_name_order = api_is_western_name_order(PERSON_NAME_DATA_EXPORT); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
$is_western_name_order = api_is_western_name_order(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//TODO add course name |
|
|
|
|
|
|
|
$sql = "SELECT |
|
|
|
|
|
|
|
a.login_course_date as col0, |
|
|
|
|
|
|
|
u.username as col1, |
|
|
|
|
|
|
|
" . ( |
|
|
|
|
|
|
|
$is_western_name_order ? " |
|
|
|
|
|
|
|
u.firstname AS col2, |
|
|
|
|
|
|
|
u.lastname AS col3, |
|
|
|
|
|
|
|
" : " |
|
|
|
|
|
|
|
u.lastname AS col2, |
|
|
|
|
|
|
|
u.firstname AS col3, |
|
|
|
|
|
|
|
" ) . " |
|
|
|
|
|
|
|
a.logout_course_date, |
|
|
|
|
|
|
|
c.title, |
|
|
|
|
|
|
|
c.code, |
|
|
|
|
|
|
|
u.user_id |
|
|
|
|
|
|
|
FROM $track_e_course_access a |
|
|
|
|
|
|
|
INNER JOIN $user u ON a.user_id = u.user_id |
|
|
|
|
|
|
|
INNER JOIN $course c ON a.c_id = c.id"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (isset($_GET['session_id']) && !empty($_GET['session_id'])) { |
|
|
|
|
|
|
|
$sessionId = intval($_GET['session_id']); |
|
|
|
|
|
|
|
$sql .= " WHERE a.session_id = " . $sessionId; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$sql .= " ORDER BY col$column $orderDirection "; |
|
|
|
|
|
|
|
$sql .= " LIMIT $from,$numberItems"; |
|
|
|
|
|
|
|
$result = Database::query($sql); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//$clicks = Tracking::get_total_clicks_by_session(); |
|
|
|
|
|
|
|
$data = array(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while ($user = Database::fetch_assoc($result)) { |
|
|
|
|
|
|
|
$data[] = $user; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$return = []; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//TODO: Dont use numeric index |
|
|
|
|
|
|
|
foreach ($data as $key => $info) { |
|
|
|
|
|
|
|
$start_date = $info['col0']; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$end_date = $info['logout_course_date']; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$return[$info['user_id']] = array( |
|
|
|
|
|
|
|
$start_date, |
|
|
|
|
|
|
|
$info['col1'], |
|
|
|
|
|
|
|
$info['col2'], |
|
|
|
|
|
|
|
$info['col3'], |
|
|
|
|
|
|
|
$info['user_id'], |
|
|
|
|
|
|
|
'ip', |
|
|
|
|
|
|
|
//TODO is not correct/precise, it counts the time not logged between two loggins |
|
|
|
|
|
|
|
gmdate("H:i:s", strtotime($end_date) - strtotime($start_date)) |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
foreach ($return as $key => $info) { |
|
|
|
|
|
|
|
$ipResult = Database::select( |
|
|
|
|
|
|
|
'user_ip', |
|
|
|
|
|
|
|
$track_e_login, |
|
|
|
|
|
|
|
['where' => [ |
|
|
|
|
|
|
|
'? BETWEEN login_date AND logout_date' => $info[0] |
|
|
|
|
|
|
|
]], |
|
|
|
|
|
|
|
'first' |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$return[$key][5] = $ipResult['user_ip']; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return $return; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
|