Merge branch '1.11.x' of https://github.com/chamilo/chamilo-lms into 1.11.x

pull/3888/head
Christian 5 years ago
commit b2ac9da2ad
  1. 6
      main/auth/my_progress.php
  2. 315
      main/exercise/exercise.class.php
  3. 115
      main/exercise/exercise.php
  4. 25
      main/inc/lib/StudentFollowPage.php
  5. 5
      main/inc/lib/sessionmanager.lib.php
  6. 35
      main/inc/lib/tracking.lib.php
  7. 30
      main/inc/lib/usermanager.lib.php
  8. 7
      main/install/ajax.php
  9. 2
      main/install/configuration.dist.php
  10. 7
      main/lang/english/trad4all.inc.php
  11. 27
      main/lang/french/trad4all.inc.php
  12. 7
      main/lang/spanish/trad4all.inc.php
  13. 6
      main/lp/learnpath.class.php
  14. 7
      main/lp/learnpathList.class.php
  15. 13
      main/mySpace/index.php
  16. 3
      main/mySpace/student.php
  17. 14
      main/mySpace/student_follow_export.php
  18. 10
      main/mySpace/users.php

@ -43,6 +43,8 @@ $allowCareerUser = api_get_configuration_value('allow_career_users');
$showGraph = false === api_get_configuration_value('hide_session_graph_in_my_progress');
$isAllowedToEdit = api_is_allowed_to_edit();
if (!empty($courseUserList)) {
$items = MySpace::get_connections_from_course_list(
$user_id,
@ -101,11 +103,11 @@ if ($showAllSessionCourses && !empty($sessionId) && empty($courseCode)) {
$user_id,
$userSessionCourse['course_code'],
$sessionId,
$allowCareerUser
$isAllowedToEdit
);
}
} else {
$content .= Tracking::show_course_detail($user_id, $courseCode, $sessionId);
$content .= Tracking::show_course_detail($user_id, $courseCode, $sessionId, $isAllowedToEdit);
}
if (!empty($dates)) {

@ -9648,6 +9648,24 @@ class Exercise
}
$actions .= $delete;
$usersToRemind = self::getUsersInExercise(
$row['iid'],
$row['c_id'],
$row['session_id'],
true
);
if ($usersToRemind > 0) {
$actions .= Display::url(
Display::return_icon('announce.png', get_lang('EmailNotifySubscription')),
'',
[
'href' => '#!',
'onclick' => 'showUserToSendNotificacion(this)',
'data-link' => 'exercise.php?'.api_get_cidreq()
.'&choice=send_reminder&sec_token='.$token.'&exerciseId='.$row['id'],
]
);
}
// Number of questions
$random_label = null;
@ -10933,6 +10951,303 @@ class Exercise
";
}
/**
* Returns a list of users based on the id of an exercise, the course and the session.
* If the count is true, it returns only the number of users.
*
* @param int $exerciseId
* @param int $courseId
* @param int $sessionId
* @param false $count
*/
public static function getUsersInExercise(
$exerciseId = 0,
$courseId = 0,
$sessionId = 0,
$count = false,
$toUsers = [],
$withSelectAll = true
) {
$sessionId = empty($sessionId) ? api_get_session_id() : (int) $sessionId;
$courseId = empty($courseId) ? api_get_course_id() : (int) $courseId;
$exerciseId = (int) $exerciseId;
if ((0 == $sessionId && 0 == $courseId) || 0 == $exerciseId) {
return [];
}
$tblCourse = Database::get_main_table(TABLE_MAIN_COURSE);
$tblCourseRelUser = Database::get_main_table(TABLE_MAIN_COURSE_USER);
$tblSessionRelUser = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
$data = [];
$tblQuiz = Database::get_course_table(TABLE_QUIZ_TEST);
$countSelect = " COUNT(*) AS total ";
$sqlToUsers = '';
if (0 == $sessionId) {
// Courses
if (false === $count) {
$countSelect = " cq.title AS quiz_title,
cq.iid AS quiz_id,
cru.c_id AS course_id,
cru.user_id AS user_id,
c.title AS title,
c.code AS 'code',
cq.active AS active,
cq.session_id AS session_id ";
}
$sql = "SELECT $countSelect
FROM $tblCourseRelUser AS cru
INNER JOIN $tblCourse AS c ON ( cru.c_id = c.id )
INNER JOIN $tblQuiz AS cq ON ( cq.c_id = c.id )
WHERE cru.is_tutor IS NULL
AND ( cq.session_id = 0 OR cq.session_id IS NULL)
AND cq.active > 0
AND cq.c_id = $courseId
AND cq.iid = $exerciseId ";
if (!empty($toUsers)) {
$sqlToUsers = ' AND cru.user_id IN ('.implode(',', $toUsers).') ';
}
} else {
//Sessions
if (false === $count) {
$countSelect = " cq.title AS quiz_title,
cq.iid AS quiz_id,
sru.user_id AS user_id,
cq.c_id AS course_id,
sru.session_id AS session_id,
c.title AS title,
c.code AS 'code',
cq.active AS active ";
}
if (!empty($toUsers)) {
$sqlToUsers = ' AND sru.user_id IN ('.implode(',', $toUsers).') ';
}
$sql = " SELECT $countSelect
FROM $tblSessionRelUser AS sru
INNER JOIN $tblQuiz AS cq ON ( sru.session_id = sru.session_id )
INNER JOIN $tblCourse AS c ON ( c.id = cq.c_id )
WHERE cq.active > 0
AND cq.c_id = $courseId
AND sru.session_id = $sessionId
AND cq.iid = $exerciseId ";
}
$sql .= " $sqlToUsers ORDER BY cq.c_id ";
$result = Database::query($sql);
$data = Database::store_result($result);
Database::free_result($result);
if (true === $count) {
return (isset($data[0]) && isset($data[0]['total'])) ? $data[0]['total'] : 0;
}
$usersArray = [];
$return = [];
if ($withSelectAll) {
$return[] = [
'user_id' => 'X',
'value' => 'X',
'user_name' => get_lang('AllStudents'),
];
}
foreach ($data as $index => $item) {
if (isset($item['user_id'])) {
$userId = (int) $item['user_id'];
if (!isset($usersArray[$userId])) {
$usersArray[$userId] = api_get_user_info($userId);
}
$usersArray['user_id'] = $userId;
$userData = $usersArray[$userId];
$data[$index]['user_name'] = $userData['complete_name'];
$return[] = $data[$index];
}
}
return $return;
}
/**
* Search the users who are in an exercise to send them an exercise reminder email and to the human resources
* managers, it is necessary the exercise id, the course and the session if it exists.
*
* @param int $exerciseId
* @param int $courseId
* @param int $sessionId
*/
public static function notifyUsersOfTheExercise(
$exerciseId = 0,
$courseId = 0,
$sessionId = 0,
$toUsers = []
) {
$users = self::getUsersInExercise(
$exerciseId,
$courseId,
$sessionId,
false,
$toUsers
);
$totalUsers = count($users);
$usersArray = [];
$courseTitle = '';
$quizTitle = '';
for ($i = 0; $i < $totalUsers; $i++) {
$user = $users[$i];
$userId = (int) $user['user_id'];
if (0 != $userId) {
$quizTitle = $user['quiz_title'];
$courseTitle = $user['title'];
if (!isset($usersArray[$userId])) {
$usersArray[$userId] = api_get_user_info($userId);
}
}
}
$url = api_get_path(WEB_CODE_PATH).'exercise/overview.php?'
.api_get_cidreq()."&exerciseId=$exerciseId";
$link = "<a href=\"$url\">$url</a>";
$objExerciseTmp = new Exercise();
$objExerciseTmp->read($exerciseId);
$end = $objExerciseTmp->end_time;
$start = $objExerciseTmp->start_time;
$minutes = $objExerciseTmp->expired_time;
$formatDate = DATE_TIME_FORMAT_LONG;
$tblCourseUser = Database::get_main_table(TABLE_MAIN_COURSE_USER);
$tblSession = Database::get_main_table(TABLE_MAIN_SESSION);
$tblSessionUser = Database::get_main_table(TABLE_MAIN_SESSION_USER);
$tblSessionUserRelCourse = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
$teachersName = [];
$teachersPrint = [];
if (0 == $sessionId) {
$sql = "SELECT course_user.user_id AS user_id
FROM $tblCourseUser AS course_user
WHERE course_user.status = 1 AND course_user.c_id ='".$courseId."'";
$result = Database::query($sql);
$data = Database::store_result($result);
Database::free_result($result);
foreach ($data as $teacher) {
$teacherId = (int) $teacher['user_id'];
if (!isset($teachersName[$teacherId])) {
$teachersName[$teacherId] = api_get_user_info($teacherId);
}
$teacherData = $teachersName[$teacherId];
$teachersPrint[] = $teacherData['complete_name'];
}
} else {
// general tutor
$sql = "SELECT sesion.id_coach AS user_id
FROM $tblSession AS sesion
WHERE sesion.id = $sessionId";
$result = Database::query($sql);
$data = Database::store_result($result);
Database::free_result($result);
foreach ($data as $teacher) {
$teacherId = (int) $teacher['user_id'];
if (!isset($teachersName[$teacherId])) {
$teachersName[$teacherId] = api_get_user_info($teacherId);
}
$teacherData = $teachersName[$teacherId];
$teachersPrint[] = $teacherData['complete_name'];
}
// Teacher into sessions course
$sql = "SELECT session_rel_course_rel_user.user_id
FROM $tblSessionUserRelCourse AS session_rel_course_rel_user
WHERE session_rel_course_rel_user.session_id = $sessionId AND
session_rel_course_rel_user.c_id = $courseId AND
session_rel_course_rel_user.status = 2";
$result = Database::query($sql);
$data = Database::store_result($result);
Database::free_result($result);
foreach ($data as $teacher) {
$teacherId = (int) $teacher['user_id'];
if (!isset($teachersName[$teacherId])) {
$teachersName[$teacherId] = api_get_user_info($teacherId);
}
$teacherData = $teachersName[$teacherId];
$teachersPrint[] = $teacherData['complete_name'];
}
}
$teacherName = implode('<br>', $teachersPrint);
foreach ($usersArray as $userId => $userData) {
$studentName = $userData['complete_name'];
$title = sprintf(get_lang('QuizRemindSubject'), $teacherName);
$content = sprintf(
get_lang('QuizFirstRemindBody'),
$studentName,
$quizTitle,
$courseTitle,
$courseTitle,
$quizTitle
);
if (!empty($minutes)) {
$content .= sprintf(get_lang('QuizRemindDuration'), $minutes);
}
if (!empty($start)) {
// api_get_utc_datetime
$start = api_format_date(($start), $formatDate);
$content .= sprintf(get_lang('QuizRemindStartDate'), $start);
}
if (!empty($end)) {
$end = api_format_date(($end), $formatDate);
$content .= sprintf(get_lang('QuizRemindEndDate'), $end);
}
$content .= sprintf(
get_lang('QuizLastRemindBody'),
$link,
$link,
$teacherName
);
$drhList = UserManager::getDrhListFromUser($userId);
if (!empty($drhList)) {
foreach ($drhList as $drhUser) {
$drhUserData = api_get_user_info($drhUser['id']);
$drhName = $drhUserData['complete_name'];
$contentDHR = sprintf(
get_lang('QuizDhrRemindBody'),
$drhName,
$studentName,
$quizTitle,
$courseTitle,
$studentName,
$courseTitle,
$quizTitle
);
if (!empty($minutes)) {
$contentDHR .= sprintf(get_lang('QuizRemindDuration'), $minutes);
}
if (!empty($start)) {
// api_get_utc_datetime
$start = api_format_date(($start), $formatDate);
$contentDHR .= sprintf(get_lang('QuizRemindStartDate'), $start);
}
if (!empty($end)) {
$end = api_format_date(($end), $formatDate);
$contentDHR .= sprintf(get_lang('QuizRemindEndDate'), $end);
}
MessageManager::send_message(
$drhUser['id'],
$title,
$contentDHR
);
}
}
MessageManager::send_message(
$userData['id'],
$title,
$content
);
}
return $usersArray;
}
/**
* Returns true if the exercise is locked by percentage. an exercise attempt must be passed.
*/

@ -19,6 +19,74 @@ $this_section = SECTION_COURSES;
$htmlHeadXtra[] = api_get_asset('qtip2/jquery.qtip.min.js');
$htmlHeadXtra[] = api_get_css_asset('qtip2/jquery.qtip.min.css');
$htmlHeadXtra[] = '
<div class="modal fade" id="NotificarUsuarios" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="'.get_lang('Close').'">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<form action="#" class="form-horizontal">
<div class="row">
<div class="col-md-6" id="myModalLabel">'.get_lang('EmailNotifySubscription').'</div>
<div class="col-md-6">
<select class="selectpicker form-control" multiple="multiple" id="toUsers" name="toUsers">
<option value="">-</option>
</select>
</div>
</div>
<input class="hidden" id="urlTo" type="hidden">
</form>
<div class="clearfix clear-fix"></div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" onclick="sendNotificationToUsers()" data-dismiss="modal">'
.get_lang('SendMailToUsers').'
</button>
<button type="button" class="btn btn-default" data-dismiss="modal">'.get_lang('Close').'</button>
</div>
</div>
</div>
</div>';
$htmlHeadXtra[] = '<script>
function sendNotificationToUsers() {
var sendTo = $("#toUsers").val().join(",");
var url = $("#urlTo").val() + sendTo;
$("#toUsers").find("option").remove().end().selectpicker("refresh");
$.ajax({
url: url,
dataType: "json"
}).done(function(response) {
$("#cm-tools").html(response.message);
}).always(function() {
$("#toUsers").find("option").remove().end().selectpicker("refresh");
$("#urlTo").val("");
});
}
function showUserToSendNotificacion(element) {
var url = $(element).data("link");
$("#toUsers").find("option").remove().end().selectpicker("refresh");
$("#urlTo").val("");
$.ajax({
url: url,
dataType: "json",
}).done(function(response) {
$("#toUsers").find("option").remove().end().selectpicker("refresh");
$.each(response,function(a,b){
$("#toUsers").append($("<option>", {
value: b.user_id,
text: b.user_name
}));
});
$("#urlTo").val($(element).data("link").replace("send_reminder","send_reminder_to") + "&users=")
$("#toUsers").selectpicker("refresh");
$("#NotificarUsuarios").modal()
});
}
</script>';
api_protect_course_script(true);
@ -411,6 +479,53 @@ if ($is_allowedToEdit) {
'confirmation'
));
break;
case 'send_reminder_to':
$toUsers = $_GET['users'] ?? null;
if (!empty($toUsers) && !empty($exerciseId)) {
$sessionId = isset($_GET['id_session']) ? (int) $_GET['id_session'] : 0;
$courseCode = $_GET['cidReq'] ?? null;
$courseId = api_get_course_int_id($courseCode);
$temo = [];
if (is_int(strpos($toUsers, 'X'))) {
// to all users
$temo = Exercise::getUsersInExercise(
$exerciseId,
$courseId,
$sessionId,
false,
[],
false
);
$toUsers = [];
foreach ($temo as $item) {
$toUsers[] = $item['user_id'];
}
}
$toUsers = explode(',', $toUsers);
api_set_more_memory_and_time_limits();
Exercise::notifyUsersOfTheExercise(
$exerciseId,
$courseId,
$sessionId,
$toUsers
);
echo json_encode(
[
'message' => Display::return_message(
get_lang('AnnounceSentByEmail'), 'confirmation'
),
]
);
}
exit();
case 'send_reminder':
$users = Exercise::getUsersInExercise(
$objExerciseTmp->id,
$courseId,
$sessionId
);
echo json_encode($users);
exit();
}
header('Location: '.$currentUrl);
exit;

@ -16,7 +16,8 @@ class StudentFollowPage
array $lpInfo,
int $studentId,
int $courseId,
int $sessionId = 0
int $sessionId = 0,
bool $showTeacherName = true
): string {
$em = Database::getManager();
@ -52,7 +53,17 @@ class StudentFollowPage
return '-';
}
return api_convert_and_format_date($itemProperty->getInsertDate(), DATE_TIME_FORMAT_LONG);
$formattedDate = api_convert_and_format_date($itemProperty->getInsertDate(), DATE_TIME_FORMAT_LONG);
if ($showTeacherName) {
$insertUser = $itemProperty->getInsertUser()->getId() !== $studentId
? $itemProperty->getInsertUser()->getCompleteName()
: '-';
return "$insertUser<br>".Display::tag('small', $formattedDate);
}
return $formattedDate;
}
$subscriptionEvent = Event::findUserSubscriptionToCourse($studentId, $courseId, $sessionId);
@ -61,7 +72,15 @@ class StudentFollowPage
return '-';
}
return api_convert_and_format_date($subscriptionEvent['default_date'], DATE_TIME_FORMAT_LONG);
$formattedDate = api_convert_and_format_date($subscriptionEvent['default_date'], DATE_TIME_FORMAT_LONG);
if ($showTeacherName) {
$creator = api_get_user_entity($subscriptionEvent['default_user_id']);
return "{$creator->getCompleteName()}<br>".Display::tag('small', $formattedDate);
}
return $formattedDate;
}
public static function getLpAcquisition(

@ -416,7 +416,7 @@ class SessionManager
SELECT DISTINCT
IF (
(s.access_start_date <= '$today' AND '$today' <= s.access_end_date) OR
(s.access_start_date IS NULL AND s.access_end_date = IS NULL ) OR
(s.access_start_date IS NULL AND s.access_end_date IS NULL ) OR
(s.access_start_date <= '$today' AND s.access_end_date IS NULL) OR
('$today' <= s.access_end_date AND s.access_start_date IS NULL)
, 1, 0) as session_active,
@ -6444,7 +6444,8 @@ class SessionManager
$active,
$lastConnectionDate,
api_is_student_boss() ? STUDENT_BOSS : COURSEMANAGER,
$keyword
$keyword,
true
);
}

@ -1313,10 +1313,8 @@ class Tracking
$assignedCourses = [];
$drhCount = 0;
$teachersCount = 0;
$studentsCount = 0;
$studentBossCount = 0;
$courseCount = 0;
$sessionCount = 0;
$assignedCourseCount = 0;
if (api_is_drh() && api_drh_can_access_all_session_content()) {
@ -5457,9 +5455,8 @@ class Tracking
* @param int $user_id
* @param string $course_code
* @param int $session_id
* @param bool $showDiagram
*/
public static function show_course_detail($user_id, $course_code, $session_id, $showDiagram = false): string
public static function show_course_detail($user_id, $course_code, $session_id, $isAllowedToEdit = true): string
{
if (empty($user_id) || empty($course_code)) {
return '';
@ -5476,18 +5473,10 @@ class Tracking
$html = '<a name="course_session_data"></a>';
$html .= Display::page_subheader2($course_info['title']);
if ($showDiagram && !empty($session_id)) {
$visibility = api_get_session_visibility($session_id);
if (SESSION_AVAILABLE === $visibility) {
$html .= Display::page_subheader2($course_info['title']);
}
}
// Show exercise results of invisible exercises? see BT#4091
$quizzesHtml = self::generateQuizzesTable($course_info, $session_id);
// LP table results
$learningPathsHtml = self::generateLearningPathsTable($user, $course_info, $session_id);
$learningPathsHtml = self::generateLearningPathsTable($user, $course_info, $session_id, $isAllowedToEdit);
$skillsHtml = self::displayUserSkills($user_id, $course_info['id'], $session_id);
$toolsHtml = [
@ -7515,8 +7504,12 @@ class Tracking
);
}
private static function generateLearningPathsTable(User $user, array $courseInfo, int $sessionId = 0): string
{
private static function generateLearningPathsTable(
User $user,
array $courseInfo,
int $sessionId = 0,
bool $isAllowedToEdit = true
) : string {
$html = [];
$columnHeaders = [
@ -7555,11 +7548,7 @@ class Tracking
}
$addLpInvisibleCheckbox = api_get_configuration_value('student_follow_page_add_LP_invisible_checkbox');
$showInvisibleLp = api_get_configuration_value('student_follow_page_show_invisible_lp_students');
if ($addLpInvisibleCheckbox && $showInvisibleLp) {
$addLpInvisibleCheckbox = false;
}
$includeNotsubscribedLp = api_get_configuration_value('student_follow_page_include_not_subscribed_lp_students');
$columnHeadersKeys = array_keys($columnHeaders);
@ -7579,7 +7568,8 @@ class Tracking
true,
$category->getId(),
false,
$showInvisibleLp
false,
$includeNotsubscribedLp === false
);
$lpList = $objLearnpathList->get_flat_list();
@ -7701,7 +7691,8 @@ class Tracking
$learnpath,
$user->getId(),
$courseInfo['real_id'],
$sessionId
$sessionId,
$isAllowedToEdit
);
}

@ -5319,7 +5319,7 @@ class UserManager
* Get users followed by human resource manager.
*
* @param int $userId
* @param int $userStatus Filter users by status (STUDENT, COURSEMANAGER, etc)
* @param int $userStatus Filter users by status (STUDENT, COURSEMANAGER, etc)
* @param bool $getOnlyUserId
* @param bool $getSql
* @param bool $getCount
@ -5329,8 +5329,9 @@ class UserManager
* @param string $direction
* @param int $active
* @param string $lastConnectionDate
* @param int $status the function is called by who? COURSEMANAGER, DRH?
* @param int $status the function is called by who? COURSEMANAGER, DRH?
* @param string $keyword
* @param bool $checkSessionVisibility
*
* @return mixed Users list (array) or the SQL query if $getSQL was set to true
*/
@ -5347,7 +5348,8 @@ class UserManager
$active = null,
$lastConnectionDate = null,
$status = null,
$keyword = null
$keyword = null,
$checkSessionVisibility = false
) {
// Database Table Definitions
$tbl_user = Database::get_main_table(TABLE_MAIN_USER);
@ -5417,6 +5419,8 @@ class UserManager
$drhConditions = null;
$teacherSelect = null;
$urlId = api_get_current_access_url_id();
switch ($status) {
case DRH:
$drhConditions .= " AND
@ -5438,6 +5442,20 @@ class UserManager
(scu.status = 2 AND scu.user_id = '$userId')
";
if ($checkSessionVisibility) {
$today = api_strtotime('now', 'UTC');
$today = date('Y-m-d', $today);
$sessionConditionsTeacher .= "
AND
(
(s.access_start_date <= '$today' AND '$today' <= s.access_end_date) OR
(s.access_start_date IS NULL AND s.access_end_date IS NULL) OR
(s.access_start_date <= '$today' AND s.access_end_date IS NULL) OR
('$today' <= s.access_end_date AND s.access_start_date IS NULL)
)
";
}
$teacherSelect =
"UNION ALL (
$select
@ -5449,7 +5467,7 @@ class UserManager
SELECT DISTINCT(s.id) FROM $tbl_session s INNER JOIN
$tbl_session_rel_access_url session_rel_access_rel_user
ON session_rel_access_rel_user.session_id = s.id
WHERE access_url_id = ".api_get_current_access_url_id()."
WHERE access_url_id = ".$urlId."
$sessionConditionsCoach
) OR sru.session_id IN (
SELECT DISTINCT(s.id) FROM $tbl_session s
@ -5457,7 +5475,7 @@ class UserManager
ON (url.session_id = s.id)
INNER JOIN $tbl_session_rel_course_rel_user scu
ON (scu.session_id = s.id)
WHERE access_url_id = ".api_get_current_access_url_id()."
WHERE access_url_id = ".$urlId."
$sessionConditionsTeacher
)
)
@ -5496,7 +5514,7 @@ class UserManager
LEFT JOIN $tbl_user_rel_access_url a ON (a.user_id = u.id)
$join
WHERE
access_url_id = ".api_get_current_access_url_id()."
access_url_id = ".$urlId."
$drhConditions
$userConditions
)

@ -27,6 +27,13 @@ session_start();
require_once api_get_path(LIBRARY_PATH).'database.constants.inc.php';
require_once 'install.lib.php';
// A protection measure for already installed systems.
if (isAlreadyInstalledSystem()) {
// The system has already been installed, so block re-installation.
echo "Chamilo has already been installed";
exit;
}
$action = isset($_POST['a']) ? $_POST['a'] : null;
$dbHost = isset($_POST['db_host']) ? $_POST['db_host'] : 'localhost';

@ -400,7 +400,7 @@ INSERT INTO extra_field (extra_field_type, field_type, variable, display_text, d
*/
//$_configuration['student_follow_page_add_LP_invisible_checkbox'] = false;
// Show the LP not marked as invisible by teacher in tracking page
//$_configuration['student_follow_page_show_invisible_lp_students'] = false;
//$_configuration['student_follow_page_include_not_subscribed_lp_students'] = false;
// Allow change the order to show the tools in "My progress" page.
/*$_configuration['my_progress_course_tools_order'] = [
'order' => ['quizzes', 'learning_paths', 'skills'],

@ -8774,4 +8774,11 @@ $EmailToTeachersWhenNewPost = "E-mail to teachers on new user's post in the port
$PortfolioAlertNewPostContent = "There is a new post by %s in the portfolio of course %s. To view it <a href='%s'>go here</a>.";
$PortfolioAlertNewPostSubject = "[Portfolio] New post in course %s";
$OngoingTraining = "Ongoing training";
$QuizRemindSubject = "You have a new message from %s";
$QuizFirstRemindBody = "Dear %s,<br /><br /> A new test/quiz %s has been added to course %s.<br /><br />Course: %s <br />Test/Quiz name: %s <br />";
$QuizLastRemindBody = "Visit the test/quiz page <a href=\"%s\">%s</a><br />";
$QuizDhrRemindBody = "Dear %s,<br /><br />As his/her parent, you are receiving this e-mail to let you know that %s just got a new test/quiz %s in course %s.<br /><br />Learner: %s<br /> Course: %s<br />Test/Quiz name: %s<br />";
$QuizRemindDuration = "Test duration: %s <br />";
$QuizRemindStartDate = "Test start date: %s <br />";
$QuizRemindEndDate = "Test end date: %s <br />";
?>

@ -2,7 +2,7 @@
/*
for more information: see languages.txt in the lang folder.
*/
$OpenBadgesBannerText = "Vous pouvez maintenant créer des insignes qui reconnaissent les compétences apprisent par vos utilisateurs, les récompenses pour leurs efforts et au travers desquels ils pourront démontrer leurs compétences acquises sur leur page de profil. Pour plus d'informations au sujet d'OpenBadges: <a href='http://openbadges.org'>http://openbadges.org</a>.";
$OpenBadgesBannerText = "Vous pouvez maintenant créer des insignes qui reconnaissent les compétences apprises par vos utilisateurs, les récompenses pour leurs efforts et au travers desquels ils pourront démontrer leurs compétences acquises sur leur page de profil. Pour plus d'informations au sujet d'OpenBadges: <a href='http://openbadges.org'>http://openbadges.org</a>.";
$OpenBadgesIntroduction = "Vous pouvez maintenant élaborer des badges pour récompenser l'acquisition de compétences au travers des cours sur ce campus virtuel.";
$DesignANewBadgeComment = "Élaborez un nouveau badge, téléchargez-le et utilisez-le dans le formulaire du badge.";
$TheBadgesWillBeSentToThatBackpack = "Les badges seront envoyés vers ce sac à dos";
@ -12,7 +12,7 @@ $BadgePreview = "Prévisualisation du badge";
$DesignNewBadge = "Élaborer un nouveau badge";
$TotalX = "Total: %s";
$DownloadBadges = "Télécharger les badges";
$IssuerDetails = "Détails émetteur des badges";
$IssuerDetails = "Détails de l'émetteur des badges";
$CreateBadge = "Créer un badge";
$Badges = "Badges";
$StudentsWhoAchievedTheSkillX = "Apprenants qui ont acquis la compétence %s";
@ -33,7 +33,7 @@ $CotangentCot = "Cotangente:\t\t\tcot(x)";
$HyperbolicCotangentCoth = "Cotangente hyperbolique:\t\tcoth(x)";
$ArccotangentArccot = "Arccotangente:\t\t\tarccot(x)";
$HyperbolicArccotangentArccoth = "Arccotangente hyperbolique:\t\tarccoth(x)";
$HelpCookieUsageValidation = "Dans un soucis de bon fonctionnement et de mesure de fréquentation de la plateforme, Chamilo utilise les cookies.<br/><br/>Au besoin, la rubrique « Aide » des navigateurs vous indique comment paramétrer les cookies.<br/><br/>Pour plus d'informations sur les cookies, visitez le site de la <a href='http://www.cnil.fr/vos-obligations/sites-web-cookies-et-autres-traceurs/que-dit-la-loi/' target='_blank'>CNIL</a>.";
$HelpCookieUsageValidation = "Dans un souci de bon fonctionnement et de mesure de fréquentation de la plateforme, Chamilo utilise les cookies.<br/><br/>Au besoin, la rubrique « Aide » des navigateurs vous indique comment paramétrer les cookies.<br/><br/>Pour plus d'informations sur les cookies, visitez le site de la <a href='http://www.cnil.fr/vos-obligations/sites-web-cookies-et-autres-traceurs/que-dit-la-loi/' target='_blank'>CNIL</a>.";
$YouAcceptCookies = "En continuant votre navigation sur ce site, vous acceptez l’utilisation des cookies.";
$TemplateCertificateComment = "Exemple de certificat";
$TemplateCertificateTitle = "Certificat";
@ -194,7 +194,7 @@ $NoActionAvailable = "Pas d'action disponible";
$Coaches = "Tuteurs";
$ShowDescription = "Montrer la description";
$HumanResourcesManagerShouldNotBeRegisteredToCourses = "Les DRH ne devraient pas être inscrits directement à des cours (ils doivent les 'suivre'). Les utilisateurs de ce type n'ont pas été inscrits.";
$CleanAndUpdateCourseCoaches = "Vider et mettre à jours les tuteurs";
$CleanAndUpdateCourseCoaches = "Vider et mettre à jour les tuteurs";
$NoPDFFoundAtRoot = "Aucun PDF n'a été trouvé à la racine: assurez-vous que les PDFs sont à la racine de votre fichier zip (sans répertoire intermédiaire)";
$PDFsMustLookLike = "Les PDFs doivent utiliser un format similaire à l'exemple suivant:";
$ImportZipFileLocation = "Sélection du fichier zip";
@ -215,7 +215,7 @@ $SendToUsersInSessions = "Envoyer aux utilisateurs de toutes les sessions de ce
$ParametersNotFound = "Paramètres non trouvés";
$UsersToAdd = "Utilisateurs à ajouter";
$DocumentsAdded = "Documents ajoutés";
$NoUsersToAdd = "Aucun utilisateurs à ajouter";
$NoUsersToAdd = "Aucun utilisateur à ajouter";
$StartSurvey = "Commencer l'enquête";
$Subgroup = "Sous-groupe";
$Subgroups = "Sous-groupes";
@ -266,7 +266,7 @@ $AreYouSureDeleteTestResultBeforeDateD = "Êtes-vous sûr de vouloir supprimer t
$CleanStudentsResultsBeforeDate = "Supprimer les tentatives antérieures à une date donnée";
$HGlossary = "Aide Glossaire";
$GlossaryContent = "<p>L'outil permet de créer des termes du glossaire qui sont spécifiques à ce cours, vous pouvez alors utiliser ces termes dans l'outil de Documents.</p>";
$ForumContent = "<p>Le forum est un outil de discussion asynchrone par écrit. À la différence du courriel, le forum situe la discussion dans un espace public ou semi-public (à plusieurs).</p><p>Pour utiliser l'outil de forum de Chamilo, les membres n'ont besoin que d'un simple navigateur Web, pas besoin d'outil de courriel.</P> <p>Pour organiser les forums, cliquez sur 'administrer'. Les échanges sont organisés de façon hiérarchique selon l'arborescence suivante:</p><p><b>Catégorie > Forum > Sujet > Réponse</b></p>Pour permettre aux membres de discuter de façon structurée, il est indispensable d'organiser les échanges préalablement en catégories et forums (à eux de créer sujets et réponses). Par défaut, le forum contient uniquement la catégorie Public, un sujet d'exemple et un message exemple. Vous pouvez ajouter des forums dans la catégorie public, ou bien modifier son intitulé ou encore créer d'autres catégories dans lesquelles il vous faudra alors créer de nouveaux forums. Une catégorie qui ne contient aucun forum ne s'affiche pas et est inutilisable.</p> <b>Forums de groupes</b> <p>Pour créer des forums de groupes, utilisez l'outil Groupes et non l'outil Forums. Cela vous permettra de créer des forums privatifs (non accessibles aux membres des autres groupes) et de fournir simultanément un espace de documents aux groupes.</p> <p><b>Astuces pédagogiques</b></p> Un forum d'apprentissage n'est pas identique aux forums que l'on trouve habituellement sur internet. D'une part il n'est pas possible pour les apprenants de modifier leurs messages une fois publiés car le cours suit une logique d'archivage et peut être utilisé pour vérifier ce qui a été dit dans le passé. Par ailleurs, les forums Chamilo permettent certains usages particulièrement pertinents dans un contexte d'apprentissage. Ainsi certains enseignants/formateurs publient directement dans les forums leurs corrections: <ul><li>Un apprenant est invité à publier un rapport directement dans le forum,</li> <li>L'enseignant le corrige en cliquant sur Editer (crayon jaune) puis introduit ses corrections à l'aide de l'éditeur graphique : couleur, soulignage etc.,</li> <li>Finalement, les autres apprenants profitent de la correction qui a été faite sur la production de l'un d'entre eux,</li> <li>Notez que le même principe peut être utilisé d'un apprenant à l'autre, mais il faudra alors copier/coller le message de son condisciple car les étudiants/stagiaires ne peuvent éditer les messages des autres apprenants.<.li></ul>";
$ForumContent = "<p>Le forum est un outil de discussion asynchrone par écrit. À la différence du courriel, le forum situe la discussion dans un espace public ou semi-public (à plusieurs).</p><p>Pour utiliser l'outil de forum de Chamilo, les membres n'ont besoin que d'un simple navigateur Web, pas besoin d'outil de courriel.</P> <p>Pour organiser les forums, cliquez sur 'administrer'. Les échanges sont organisés de façon hiérarchique selon l'arborescence suivante:</p><p><b>Catégorie > Forum > Sujet > Réponse</b></p>Pour permettre aux membres de discuter de façon structurée, il est indispensable d'organiser les échanges préalablement en catégories et forums (à eux de créer sujets et réponses). Par défaut, le forum contient uniquement la catégorie Public, un sujet d'exemple et un message exemple. Vous pouvez ajouter des forums dans la catégorie public, ou bien modifier son intitulé ou encore créer d'autres catégories dans lesquelles il vous faudra alors créer de nouveaux forums. Une catégorie qui ne contient aucun forum ne s'affiche pas et est inutilisable.</p> <b>Forums de groupes</b> <p>Pour créer des forums de groupes, utilisez l'outil Groupes et non l'outil Forums. Cela vous permettra de créer des forums privatifs (non accessibles aux membres des autres groupes) et de fournir simultanément un espace de documents aux groupes.</p> <p><b>Astuces pédagogiques</b></p> Un forum d'apprentissage n'est pas identique aux forums que l'on trouve habituellement sur internet. D'une part il n'est pas possible pour les apprenants de modifier leurs messages une fois publiés, car le cours suit une logique d'archivage et peut être utilisé pour vérifier ce qui a été dit dans le passé. Par ailleurs, les forums Chamilo permettent certains usages particulièrement pertinents dans un contexte d'apprentissage. Ainsi certains enseignants/formateurs publient directement dans les forums leurs corrections: <ul><li>Un apprenant est invité à publier un rapport directement dans le forum,</li> <li>L'enseignant le corrige en cliquant sur Editer (crayon jaune) puis introduit ses corrections à l'aide de l'éditeur graphique : couleur, soulignage etc.,</li> <li>Finalement, les autres apprenants profitent de la correction qui a été faite sur la production de l'un d'entre eux,</li> <li>Notez que le même principe peut être utilisé d'un apprenant à l'autre, mais il faudra alors copier/coller le message de son condisciple car les étudiants/stagiaires ne peuvent éditer les messages des autres apprenants.<.li></ul>";
$HForum = "Aide Forums";
$LoginToGoToThisCourse = "Veuillez vous connecter pour accéder au cours";
$AreYouSureToEmptyAllTestResults = "Êtes-vous certain de vouloir supprimer les résultats de tous les exercices ?";
@ -276,7 +276,7 @@ $LoginDate = "Date de connexion";
$ChooseStartDateAndEndDate = "Choisissez les dates de début et de fin";
$TestFeedbackNotShown = "Ce test est configuré pour ne pas montrer les commentaires (feedbacks) aux apprenants. Les commentaires des réponses aux questions ne seront pas affichés à la fin de ce test.";
$WorkAdded = "Travail ajouté";
$FeedbackDisplayOptions = "Détermine la manière dont se montreront les commentaires (feedback) enregistrés pour chacune des alternatives des questions présentées à l'apprenant. Nous recommandons fortement l'évaluation de ces différents modes de feedback avant d'inviter les apprenant à passer le test.";
$FeedbackDisplayOptions = "Détermine la manière dont se montreront les commentaires (feedback) enregistrés pour chacune des alternatives des questions présentées à l'apprenant. Nous recommandons fortement l'évaluation de ces différents modes de feedback avant d'inviter les apprenants à passer le test.";
$InactiveUsers = "Utilisateurs au compte désactivé";
$ActiveUsers = "Utilisateurs actifs";
$SurveysProgress = "Progrès dans les enquêtes";
@ -297,12 +297,12 @@ $ForumsLeft = "Forums non lus";
$ForumsDone = "Forums lus";
$ForumsTotal = "Total des forums";
$ExercisesProgress = "Progrès des exercices";
$ExercisesLeft = "Exercices incomplètes";
$ExercisesLeft = "Exercices incomplets";
$ExercisesDone = "Exercices terminés";
$ExercisesTotal = "Total d'exercices";
$LearnpathsProgress = "Parcours en progrès";
$LearnpathsLeft = "Parcours incomplètes";
$LearnpathsDone = "Parcours accomplies";
$LearnpathsDone = "Parcours accomplis";
$LearnpathsTotal = "Nombre de parcours";
$TimeLoggedIn = "Durée de connexion (hh:mm)";
$SelectSurvey = "Choisissez l'enquête";
@ -4749,7 +4749,7 @@ $GlossaryTermAlreadyExistsYouShouldEditIt = "Ce terme de glossaire existe déjà
$GlossaryManagement = "Gestion du glossaire";
$TermMoved = "Le terme a été déplacé";
$HFor = "Aide Forums";
$ForContent = "<p>Le forum est un outil de discussion asynchrone par écrit. À la différence du courriel, le forum situe la discussion dans un espace public ou semi-public (à plusieurs).</p><p>Pour utiliser l'outil de forum de Chamilo, les membres n'ont besoin que d'un simple navigateur web, pas besoin d'outil de courriel.</P> <p>Pour organiser les forums, cliquez sur 'administrer'. Les échanges sont organisés de façon hiérarchique selon l'arborescence suivante:</p><p><b>Catégorie > Forum > Sujet > Réponse</b></p>Pour permettre aux membres de discuter de façon structurée, il est indispensable d'organiser les échanges préalablement en catégories et forums (à eux de créer sujets et réponses). Par défaut, le forum contient uniquement la catégorie Public, un sujet d'exemple et un message exemple. Vous pouvez ajouter des forums dans la catégorie public, ou bien modifier son intitulé ou encore créer d'autres catégories dans lesquelles il vous faudra alors créer de nouveaux forums. Une catégorie qui ne contient aucun forum ne s'affiche pas et est inutilisable.</p> <b>Forums de groupes</b> <p>Pour créer des forums de groupes, utilisez l'outil Groupes et non l'outil Forums. Cela vous permettra de créer des forums privatifs (non accessibles aux membres des autres groupes) et de fournir simultanément un espace de documents aux groupes.</p> <p><b>Astuces pédagogiques</b></p> Un forum d'apprentissage n'est pas identique aux forums que l'on trouve habituellement sur internet. D'une part il n'est pas possible pour les apprenants de modifier leurs messages une fois publiés car le cours suit une logique d'archivage et peut être utilisé pour vérifier ce qui a été dit dans le passé. Par ailleurs, les forums Chamilo permettent certains usages particulièrement pertinents dans un contexte d'apprentissage. Ainsi certains enseignants/formateurs publient directement dans les forums leurs corrections: <ul><li>Un apprenant est invité à publier un rapport directement dans le forum,</li> <li>L'enseignant le corrige en cliquant sur Editer (crayon jaune) puis introduit ses corrections à l'aide de l'éditeur graphique : couleur, soulignage etc.,</li> <li>Finalement, les autres apprenants profitent de la correction qui a été faite sur la production de l'un d'entre eux,</li> <li>Notez que le même principe peut être utilisé d'un apprenant à l'autre, mais il faudra alors copier/coller le message de son consdisciple car les étudiants/stagiaires ne peuvent éditer les messages des autres apprenants.<.li></ul>";
$ForContent = "<p>Le forum est un outil de discussion asynchrone par écrit. À la différence du courriel, le forum situe la discussion dans un espace public ou semi-public (à plusieurs).</p><p>Pour utiliser l'outil de forum de Chamilo, les membres n'ont besoin que d'un simple navigateur web, pas besoin d'outil de courriel.</P> <p>Pour organiser les forums, cliquez sur 'administrer'. Les échanges sont organisés de façon hiérarchique selon l'arborescence suivante:</p><p><b>Catégorie > Forum > Sujet > Réponse</b></p>Pour permettre aux membres de discuter de façon structurée, il est indispensable d'organiser les échanges préalablement en catégories et forums (à eux de créer sujets et réponses). Par défaut, le forum contient uniquement la catégorie Public, un sujet d'exemple et un message exemple. Vous pouvez ajouter des forums dans la catégorie public, ou bien modifier son intitulé ou encore créer d'autres catégories dans lesquelles il vous faudra alors créer de nouveaux forums. Une catégorie qui ne contient aucun forum ne s'affiche pas et est inutilisable.</p> <b>Forums de groupes</b> <p>Pour créer des forums de groupes, utilisez l'outil Groupes et non l'outil Forums. Cela vous permettra de créer des forums privatifs (non accessibles aux membres des autres groupes) et de fournir simultanément un espace de documents aux groupes.</p> <p><b>Astuces pédagogiques</b></p> Un forum d'apprentissage n'est pas identique aux forums que l'on trouve habituellement sur internet. D'une part il n'est pas possible pour les apprenants de modifier leurs messages une fois publiés, car le cours suit une logique d'archivage et peut être utilisé pour vérifier ce qui a été dit dans le passé. Par ailleurs, les forums Chamilo permettent certains usages particulièrement pertinents dans un contexte d'apprentissage. Ainsi certains enseignants/formateurs publient directement dans les forums leurs corrections: <ul><li>Un apprenant est invité à publier un rapport directement dans le forum,</li> <li>L'enseignant le corrige en cliquant sur Editer (crayon jaune) puis introduit ses corrections à l'aide de l'éditeur graphique : couleur, soulignage etc.,</li> <li>Finalement, les autres apprenants profitent de la correction qui a été faite sur la production de l'un d'entre eux,</li> <li>Notez que le même principe peut être utilisé d'un apprenant à l'autre, mais il faudra alors copier/coller le message de son consdisciple car les étudiants/stagiaires ne peuvent éditer les messages des autres apprenants.<.li></ul>";
$HDropbox = "Aide Partage de fichiers";
$DropboxContent = "L'outil de partage affiche les fichiers qui vous ont été envoyés (dossier Reçu) et les fichiers que vous avez communiqués à d'autres utilisateurs (dossier Envoyé). Si vous envoyez deux fois un fichier du même nom, vous pouvez choisir d'écraser le premier envoi par le second.<br /><br />Comme utilisateur, vous pouvez seulement envoyer un fichier au responsable du cours,à moins que le gestionnaire système ait activé le partage entre les utilisateurs.<br /><br />Un responsable peut choisir d'envoyer un fichier à tous les utilisateurs du cours.<br /><br />L'administrateur système peut activer l'envoi de fichiers sans destinataire.<br /><br />Si la liste des fichiers devient trop longue, vous pouvez supprimer certains fichiers outous les fichiers. Le fichier lui-même n'est toutefois pas supprimé pour les autres utilisateursqui y ont accès à moins que tous le suppriment.<br />";
$HHome = "Aide Page d'accueil";
@ -8706,4 +8706,11 @@ $EmailToTeachersWhenNewPost = "E-mail aux enseignants quand il y a un nouveau po
$PortfolioAlertNewPostContent = "Il y a un nouveau post de %s dans le portfolio du cours %s. Pour le voir <a href='%s'> cliquer ici</a>.";
$PortfolioAlertNewPostSubject = "[Portfolio] Nouveau post dans le cours %s";
$OngoingTraining = "Formation(s) en cours";
$QuizRemindSubject = "Vous avez un nouveau message de %s";
$QuizFirstRemindBody = "Bonjour %s,<br /><br /> Un nouvel exercice %s a été rajouté au cours %s.<br /><br />Cours : %s <br />Exercice : %s <br />";
$QuizLastRemindBody = "Voir la page de l'exercice : <a href=\"%s\">%s</a><br />";
$QuizDhrRemindBody = "Bonjour %s,<br /><br />Comme parent, vous recevez ce message pour vous informer que %s a eu un nouvel exercice %s publié dans le cours %s.<br /><br />Apprenant : %s<br /> Cours : %s<br />Exercice : %s<br />";
$QuizRemindDuration = "Durée de l'exercice : %s <br />";
$QuizRemindStartDate = "Date de début de l'exercice : %s <br />";
$QuizRemindEndDate = "Date de fin de l'exercice : %s <br />";
?>

@ -8802,4 +8802,11 @@ $EmailToTeachersWhenNewPost = "Enviar correo electrónico a los profesores sobre
$PortfolioAlertNewPostContent = "Hay un nuevo artículo por %s en el portafolio del curso %s. Para verlo haga <a href='%s'>click aquí</a>.";
$PortfolioAlertNewPostSubject = "[Portfolio] Nuevo artículo en el curso %s";
$OngoingTraining = "Formación(es) en curso";
$QuizRemindSubject = "Tienes un nuevo mensaje de %s";
$QuizFirstRemindBody = "Hola \%s,<br /><br /> Un nuevo ejercicio %s ha sido agregado en el curso %s.<br /><br />Curso: %s <br />Ejercicio: %s <br />";
$QuizLastRemindBody = "Visitar el ejercicio en <a href=\"%s\">%s</a><br />";
$QuizDhrRemindBody = "Hola %s,<br /><br />Como padre, estan recibiendo este correo para avisarle que %s tiene un nuevo ejercicio %s en el curso %s.<br /><br />Estudiante: %s<br /> Curso: %s<br />Ejercicio: %s<br />";
$QuizRemindDuration = "Duration del ejercicio: %s <br />";
$QuizRemindStartDate = "Fecha de inicio del ejercicio: %s <br />";
$QuizRemindEndDate = "Fecha de fin del ejercicio: %s <br />";
?>

@ -2299,6 +2299,7 @@ class learnpath
* @param int $student_id
* @param array $courseInfo
* @param int $sessionId
* @param bool $checkSubscription Optional. Allow don't check if user is subscribed to the LP.
*
* @return bool
*/
@ -2306,7 +2307,8 @@ class learnpath
$lp_id,
$student_id,
$courseInfo = [],
$sessionId = 0
$sessionId = 0,
bool $checkSubscription = true
) {
$courseInfo = empty($courseInfo) ? api_get_course_info() : $courseInfo;
$lp_id = (int) $lp_id;
@ -2390,7 +2392,7 @@ class learnpath
}
}
if ($is_visible) {
if ($is_visible && $checkSubscription) {
$is_visible = self::isUserSubscribedToLp(
$row,
(int) $student_id,

@ -45,7 +45,7 @@ class LearnpathList
$categoryId = null,
$ignoreCategoryFilter = false,
$ignoreLpVisibility = false,
$ignoreLpSubscription = true
bool $includeSubscribedLp = true
) {
if (empty($courseInfo)) {
$courseInfo = api_get_course_info();
@ -169,7 +169,8 @@ class LearnpathList
$row->getId(),
$user_id,
$courseInfo,
$session_id
$session_id,
$includeSubscribedLp
);
if ($lpVisibility === false) {
continue;
@ -177,7 +178,7 @@ class LearnpathList
}
}
if (!$ignoreLpSubscription && $row->getSubscribeUsers()) {
if (!$includeSubscribedLp && $row->getSubscribeUsers() && $isAllowToEdit) {
$isSubscribedToLp = learnpath::isUserSubscribedToLp(
['subscribe_users' => $row->getSubscribeUsers(), 'id' => $row->getIid()],
(int) $this->user_id,

@ -1,4 +1,5 @@
<?php
/* For licensing terms, see /license.txt */
/**
@ -10,11 +11,10 @@ $cidReset = true;
require_once __DIR__.'/../inc/global.inc.php';
// Access control
api_block_anonymous_users();
$htmlHeadXtra[] = api_get_jqgrid_js();
$htmlHeadXtra[] = '<script type="text/javascript" src="'.api_get_path(WEB_PUBLIC_PATH).'assets/jquery.easy-pie-chart/dist/jquery.easypiechart.js"></script>';
$htmlHeadXtra[] = '<script src="'.api_get_path(WEB_PUBLIC_PATH).'assets/jquery.easy-pie-chart/dist/jquery.easypiechart.js"></script>';
$this_section = SECTION_TRACKING;
@ -33,8 +33,6 @@ $skipData = api_get_configuration_value('tracking_skip_generic_data');
$logInfo = [
'tool' => SECTION_TRACKING,
'tool_id' => 0,
'tool_id_detail' => 0,
];
Event::registerLog($logInfo);
@ -61,7 +59,7 @@ $pluginCalendar = api_get_plugin_setting('learning_calendar', 'enabled') === 'tr
$calendarMenuAdded = false;
if ($is_platform_admin) {
if ($view == 'admin') {
if ($view === 'admin') {
$menu_items[] = Display::url(
Display::return_icon('teacher.png', get_lang('TeacherInterface'), [], ICON_SIZE_MEDIUM),
api_get_self().'?view=teacher'
@ -94,7 +92,6 @@ if ($is_platform_admin) {
);
$menu_items[] = Display::url(
Display::return_icon('star.png', get_lang('AdminInterface'), [], ICON_SIZE_MEDIUM),
//api_get_path(WEB_CODE_PATH).'tracking/course_session_report.php?view=admin'
api_get_path(WEB_CODE_PATH).'mySpace/admin_view.php'
);
$menu_items[] = Display::url(
@ -151,7 +148,7 @@ if ($is_drh) {
$actionsRight = '';
$actionsLeft = '';
if ($display == 'useroverview' || $display == 'sessionoverview' || $display == 'courseoverview') {
if ($display === 'useroverview' || $display === 'sessionoverview' || $display === 'courseoverview') {
$actionsRight .= Display::url(
Display::return_icon(
'export_csv.png',
@ -190,7 +187,7 @@ if (!empty($session_id) &&
'index.php'
);
if (!api_is_platform_admin()) {
if (api_get_setting('add_users_by_coach') == 'true') {
if (api_get_setting('add_users_by_coach') === 'true') {
if ($is_coach) {
$actionsLeft .= Display::url(
Display::return_icon(

@ -120,7 +120,8 @@ function get_users($from, $limit, $column, $direction)
$active,
$lastConnectionDate,
api_is_student_boss() ? STUDENT_BOSS : COURSEMANAGER,
$keyword
$keyword,
true
);
}

@ -130,7 +130,7 @@ function generateHtmlForLearningPaths(int $studentId, array $courseInfo, int $se
{
$student = api_get_user_entity($studentId);
$html = Display::page_subheader2(get_lang('ToolLearnpath'));
$html = '';
$columnHeaders = [];
$columnHeaders['lp'] = get_lang('LearningPath');
@ -190,10 +190,6 @@ function generateHtmlForLearningPaths(int $studentId, array $courseInfo, int $se
$flatList = $lpList->get_flat_list();
if (count($lpCategories) > 1) {
$html .= Display::page_subheader3($item->getName());
}
$lpTable = [];
foreach ($flatList as $learnpath) {
@ -311,11 +307,19 @@ function generateHtmlForLearningPaths(int $studentId, array $courseInfo, int $se
continue;
}
if (count($lpCategories) > 1) {
$html .= Display::page_subheader3($item->getName());
}
array_unshift($lpTable, [$columnHeaders]);
$html .= Export::convert_array_to_html($lpTable);
}
if (!empty($html)) {
$html = Display::page_subheader2(get_lang('ToolLearnpath')).PHP_EOL.$html;
}
return $html;
}

@ -1,4 +1,5 @@
<?php
/* For licensing terms, see /license.txt */
/**
@ -19,7 +20,7 @@ if (!$allowToTrack) {
}
$nameTools = get_lang('Users');
$export_csv = isset($_GET['export']) && 'csv' == $_GET['export'] ? true : false;
$export_csv = isset($_GET['export']) && 'csv' === $_GET['export'] ? true : false;
$keyword = isset($_GET['keyword']) ? Security::remove_XSS($_GET['keyword']) : null;
$active = isset($_GET['active']) ? intval($_GET['active']) : 1;
$sleepingDays = isset($_GET['sleeping_days']) ? intval($_GET['sleeping_days']) : null;
@ -41,7 +42,7 @@ if (isset($_GET["user_id"]) && $_GET["user_id"] != "" && !isset($_GET["type"]))
];
}
if (isset($_GET["user_id"]) && $_GET["user_id"] != "" && isset($_GET["type"]) && $_GET["type"] == "coach") {
if (isset($_GET["user_id"]) && $_GET["user_id"] != "" && isset($_GET["type"]) && $_GET["type"] === "coach") {
$interbreadcrumb[] = ["url" => "coaches.php", "name" => get_lang('Tutors')];
}
@ -118,7 +119,8 @@ function get_users($from, $limit, $column, $direction)
$active,
$lastConnectionDate,
COURSEMANAGER,
$keyword
$keyword,
true
);
}
@ -244,7 +246,7 @@ if (api_is_drh()) {
Display::return_icon('user_na.png', get_lang('Students'), [], ICON_SIZE_MEDIUM),
'#'
);
$actions .= Display::url(
$actionsLeft .= Display::url(
Display::return_icon('skills.png', get_lang('Skills'), [], ICON_SIZE_MEDIUM),
$webCodePath.'social/my_skills_report.php'
);

Loading…
Cancel
Save