Update from 1.11.x

pull/3890/head
Julio Montoya 4 years ago
parent 00181688f8
commit 68a4d2c41c
  1. 64
      public/main/inc/lib/usermanager.lib.php
  2. 43
      public/main/inc/lib/webservices/Rest.php
  3. 1
      public/main/lang/dutch/trad4all.inc.php
  4. 8
      public/main/lang/english/trad4all.inc.php
  5. 28
      public/main/lang/french/trad4all.inc.php
  6. 8
      public/main/lang/spanish/trad4all.inc.php
  7. 4
      public/main/mySpace/student.php
  8. 4
      public/main/mySpace/teachers.php
  9. 4
      public/main/mySpace/users.php
  10. 12
      public/main/plagiarism/compilatio/upload.php
  11. 71
      public/main/ticket/ticket_details.php
  12. 15
      public/main/webservices/api/v2.php
  13. 6
      public/main/webservices/registration.soap.php

@ -4458,6 +4458,7 @@ class UserManager
* @param string $lastConnectionDate
* @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
*/
@ -4474,7 +4475,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);
@ -4521,13 +4523,26 @@ class UserManager
}
if (!empty($keyword)) {
$keyword = Database::escape_string($keyword);
$keyword = trim(Database::escape_string($keyword));
$keywordParts = array_filter(explode(' ', $keyword));
$extraKeyword = '';
if (!empty($keywordParts)) {
$keywordPartsFixed = Database::escape_string(implode('%', $keywordParts));
if (!empty($keywordPartsFixed)) {
$extraKeyword .= " OR
CONCAT(u.firstname, ' ', u.lastname) LIKE '%$keywordPartsFixed%' OR
CONCAT(u.lastname, ' ', u.firstname) LIKE '%$keywordPartsFixed%' ";
}
}
$userConditions .= " AND (
u.username LIKE '%$keyword%' OR
u.firstname LIKE '%$keyword%' OR
u.lastname LIKE '%$keyword%' OR
u.official_code LIKE '%$keyword%' OR
u.email LIKE '%$keyword%'
u.email LIKE '%$keyword%' OR
CONCAT(u.firstname, ' ', u.lastname) LIKE '%$keyword%' OR
CONCAT(u.lastname, ' ', u.firstname) LIKE '%$keyword%'
$extraKeyword
)";
}
@ -4537,9 +4552,10 @@ class UserManager
}
$sessionConditionsCoach = null;
$sessionConditionsTeacher = null;
$dateCondition = '';
$drhConditions = null;
$teacherSelect = null;
$urlId = api_get_current_access_url_id();
switch ($status) {
case DRH:
@ -4558,10 +4574,30 @@ class UserManager
(s.id_coach = '$userId')
";
$sessionConditionsTeacher .= " AND
$sessionConditionsTeacher = " AND
(scu.status = 2 AND scu.user_id = '$userId')
";
if ($checkSessionVisibility) {
$today = api_strtotime('now', 'UTC');
$today = date('Y-m-d', $today);
$dateCondition = "
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)
)
";
}
// Use $tbl_session_rel_course_rel_user instead of $tbl_session_rel_user
/*
INNER JOIN $tbl_session_rel_user sru
ON (sru.user_id = u.id)
INNER JOIN $tbl_session_rel_course_rel_user scu
ON (scu.user_id = u.id AND scu.c_id IS NOT NULL AND visibility = 1)*/
$teacherSelect =
"UNION ALL (
$select
@ -4573,7 +4609,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
@ -4581,8 +4617,9 @@ 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
$dateCondition
)
)
$userConditions
@ -4620,7 +4657,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
)
@ -5095,15 +5132,18 @@ class UserManager
*
* @param int $bossId The boss id
* @param array $usersId The users array
* @param bool $deleteOtherAssignedUsers
*
* @return int Affected rows
*/
public static function subscribeBossToUsers($bossId, $usersId)
public static function subscribeBossToUsers($bossId, $usersId, $deleteOtherAssignedUsers = true)
{
return self::subscribeUsersToUser(
$bossId,
$usersId,
USER_RELATION_TYPE_BOSS
USER_RELATION_TYPE_BOSS,
false,
$deleteOtherAssignedUsers
);
}
@ -5383,7 +5423,7 @@ class UserManager
if ($userId > 0) {
$userRelTable = Database::get_main_table(TABLE_MAIN_USER_REL_USER);
$result = Database::select(
return Database::select(
'DISTINCT friend_user_id AS boss_id',
$userRelTable,
[
@ -5395,8 +5435,6 @@ class UserManager
],
]
);
return $result;
}
return [];

@ -22,10 +22,14 @@ class Rest extends WebService
public const GET_AUTH = 'authenticate';
public const GET_USER_MESSAGES = 'user_messages';
public const GET_USER_COURSES = 'user_courses';
public const GET_USER_SESSIONS = 'user_sessions';
public const GET_USERS_SUBSCRIBED_TO_COURSE = 'get_users_subscribed_to_course';
public const GET_USER_MESSAGES_RECEIVED = 'user_messages_received';
public const GET_USER_MESSAGES_SENT = 'user_messages_sent';
public const POST_USER_MESSAGE_READ = 'user_message_read';
public const POST_USER_MESSAGE_UNREAD = 'user_message_unread';
public const SAVE_GCM_ID = 'gcm_id';
public const GET_USER_COURSES = 'user_courses';
public const GET_PROFILE = 'user_profile';
public const GET_COURSE_INFO = 'course_info';
public const GET_COURSE_DESCRIPTIONS = 'course_descriptions';
@ -41,7 +45,6 @@ class Rest extends WebService
public const GET_COURSE_LEARNPATH = 'course_learnpath';
public const GET_COURSE_LP_PROGRESS = 'course_lp_progress';
public const SAVE_FORUM_POST = 'save_forum_post';
public const GET_USER_SESSIONS = 'user_sessions';
public const SAVE_USER_MESSAGE = 'save_user_message';
public const GET_MESSAGE_USERS = 'message_users';
public const SAVE_COURSE_NOTEBOOK = 'save_course_notebook';
@ -52,8 +55,6 @@ class Rest extends WebService
public const SUBSCRIBE_USER_TO_COURSE = 'subscribe_user_to_course';
public const UNSUBSCRIBE_USER_FROM_COURSE = 'unsubscribe_user_from_course';
public const EXTRAFIELD_GCM_ID = 'gcm_registration_id';
public const GET_USER_MESSAGES_RECEIVED = 'user_messages_received';
public const GET_USER_MESSAGES_SENT = 'user_messages_sent';
public const DELETE_USER_MESSAGE = 'delete_user_message';
public const SET_MESSAGE_READ = 'set_message_read';
public const CREATE_CAMPUS = 'add_campus';
@ -1028,6 +1029,23 @@ class Rest extends WebService
return $data;
}
public function getUsersSubscribedToCourse()
{
$users = CourseManager::get_user_list_from_course_code($this->course->getCode());
$userList = [];
foreach ($users as $user) {
$userList[] = [
'user_id' => $user['user_id'],
'username' => $user['username'],
'firstname' => $user['firstname'],
'lastname' => $user['lastname'],
'status_rel' => $user['status_rel'],
];
}
return $userList;
}
/**
* @param string $subject
* @param string $text
@ -1219,6 +1237,7 @@ class Rest extends WebService
$diskQuota = isset($courseParam['disk_quota']) ? $courseParam['disk_quota'] : '100';
$visibility = isset($courseParam['visibility']) ? (int) $courseParam['visibility'] : null;
$removeCampusId = $courseParam['remove_campus_id_from_wanted_code'] ?? 0;
$language = $courseParam['language'] ?? '';
if (isset($courseParam['visibility'])) {
if ($courseParam['visibility'] &&
@ -1238,6 +1257,13 @@ class Rest extends WebService
$params['user_id'] = $this->user->getId();
$params['visibility'] = $visibility;
$params['disk_quota'] = $diskQuota;
$params['course_language'] = $language;
foreach ($courseParam as $key => $value) {
if (substr($key, 0, 6) === 'extra_') { //an extra field
$params[$key] = $value;
}
}
$courseInfo = CourseManager::create_course($params, $params['user_id'], $idCampus);
@ -1246,6 +1272,9 @@ class Rest extends WebService
$results['status'] = true;
$results['code_course'] = $courseInfo['code'];
$results['title_course'] = $courseInfo['title'];
$extraFieldValues = new ExtraFieldValue('course');
$extraFields = $extraFieldValues->getAllValuesByItem($courseInfo['real_id']);
$results['extra_fields'] = $extraFields;
$results['message'] = sprintf(get_lang('CourseXAdded'), $courseInfo['code']);
} else {
$results['status'] = false;
@ -1392,7 +1421,11 @@ class Rest extends WebService
if (!$course_id && !$course_code) {
return [false];
}
if (CourseManager::subscribeUser($user_id, $course_id, $status)) {
if (!$course_code) {
$course_code = CourseManager::get_course_code_from_course_id($course_id);
}
if (CourseManager::subscribeUser($user_id, $course_code, $status, 0, 0, false)) {
return [true];
}

@ -6881,4 +6881,5 @@ Deze module maakt deel uit van de opleiding %s.";
$YourNextModule = "Jouw eerstvolgende lesmoment voor de module";
$FirstLesson = "Eerste lesmoment";
$UserGuides = "Gidsen voor gebruikers";
$OngoingTraining = "Lopende opleiding(en)";
?>

@ -8773,4 +8773,12 @@ $XPercentCompleted = "%s %% Completed";
$EmailToTeachersWhenNewPost = "E-mail to teachers on new user's post in the portfolio tool";
$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";
@ -8705,4 +8705,12 @@ $XPercentCompleted = "%s %% Complété";
$EmailToTeachersWhenNewPost = "E-mail aux enseignants quand il y a un nouveau post dans l'outil portfolio";
$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 />";
?>

@ -8801,4 +8801,12 @@ $XPercentCompleted = "%s %% Completado";
$EmailToTeachersWhenNewPost = "Enviar correo electrónico a los profesores sobre los nuevos artículos en la herramienta de portafolio";
$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 />";
?>

@ -106,6 +106,7 @@ function get_users($from, $limit, $column, $direction)
}
}
$checkSessionVisibility = api_get_configuration_value('show_users_in_active_sessions_in_tracking');
if (false === $drhLoaded) {
$students = UserManager::getUsersFollowedByUser(
api_get_user_id(),
@ -120,7 +121,8 @@ function get_users($from, $limit, $column, $direction)
$active,
$lastConnectionDate,
api_is_student_boss() ? STUDENT_BOSS : COURSEMANAGER,
$keyword
$keyword,
$checkSessionVisibility
);
}

@ -92,6 +92,7 @@ function get_users($from, $limit, $column, $direction)
$drhLoaded = true;
}
$checkSessionVisibility = api_get_configuration_value('show_users_in_active_sessions_in_tracking');
if (false == $drhLoaded) {
$students = UserManager::getUsersFollowedByUser(
api_get_user_id(),
@ -106,7 +107,8 @@ function get_users($from, $limit, $column, $direction)
$active,
$lastConnectionDate,
COURSEMANAGER,
$keyword
$keyword,
$checkSessionVisibility
);
}
$all_datas = [];

@ -105,6 +105,7 @@ function get_users($from, $limit, $column, $direction)
}
if (false === $drhLoaded) {
$checkSessionVisibility = api_get_configuration_value('show_users_in_active_sessions_in_tracking');
$students = UserManager::getUsersFollowedByUser(
api_get_user_id(),
$status,
@ -118,7 +119,8 @@ function get_users($from, $limit, $column, $direction)
$active,
$lastConnectionDate,
COURSEMANAGER,
$keyword
$keyword,
$checkSessionVisibility
);
}

@ -9,6 +9,7 @@ ini_set('default_socket_timeout', '1000');
api_set_more_memory_and_time_limits();
api_protect_course_script();
$courseId = api_get_course_int_id();
$courseInfo = api_get_course_info();
$compilatio = new Compilatio();
@ -87,7 +88,16 @@ if (isset($_REQUEST['type']) && 'multi' === $_REQUEST['type']) {
function sendDocument($documentId, $courseInfo)
{
$courseId = $courseInfo['real_id'];
if (empty($courseInfo)) {
return false;
}
$courseId = $courseInfo['real_id'] ?? 0;
$documentId = (int) $documentId;
if (empty($courseId) || empty($documentId)) {
return false;
}
compilatioUpdateWorkDocument($documentId, $courseId);
$workTable = Database::get_course_table(TABLE_STUDENT_PUBLICATION);

@ -117,48 +117,38 @@ $htmlHeadXtra[] = '<style>
}
</style>';
$ticket_id = (int) $_REQUEST['ticket_id'];
$ticket = TicketManager::get_ticket_detail_by_id($ticket_id);
if (!isset($ticket['ticket']) ||
// make sure it's either a user assigned to this ticket, or the reporter, or and admin
!($ticket['ticket']['assigned_last_user'] == $user_id ||
$ticket['ticket']['sys_insert_user_id'] == $user_id ||
$isAdmin)
) {
api_not_allowed(true);
}
if (!isset($_REQUEST['ticket_id'])) {
header('Location: '.api_get_path(WEB_CODE_PATH).'ticket/tickets.php');
exit;
}
/*if (isset($_POST['response'])) {
if ($user_id == $ticket['ticket']['assigned_last_user'] || api_is_platform_admin()) {
$response = $_POST['response'] === '1' ? true : false;
$newStatus = TicketManager::STATUS_PENDING;
if ($response) {
$newStatus = TicketManager::STATUS_CLOSE;
$userInfo = api_get_user_info();
$ticket_id = (int) $_REQUEST['ticket_id'];
$ticket = TicketManager::get_ticket_detail_by_id($ticket_id);
if (empty($ticket)) {
api_not_allowed(true);
}
TicketManager::update_ticket_status(
TicketManager::getStatusIdFromCode($newStatus),
$ticket_id,
$user_id
);
Display::addFlash(Display::return_message(get_lang('Update successful')));
header("Location:".api_get_self()."?ticket_id=".$ticket_id);
exit;
$projectId = $ticket['ticket']['project_id'];
$userIsAllowInProject = TicketManager::userIsAllowInProject($userInfo, $projectId);
$allowEdition = $ticket['ticket']['assigned_last_user'] == $user_id ||
$ticket['ticket']['sys_insert_user_id'] == $user_id ||
$isAdmin;
if (false === $userIsAllowInProject) {
// make sure it's either a user assigned to this ticket, or the reporter, or and admin
if (false === $allowEdition) {
api_not_allowed(true);
}
}*/
}
$title = 'Ticket #'.$ticket['ticket']['code'];
if (isset($_REQUEST['close'])) {
if ($allowEdition && isset($_REQUEST['close'])) {
TicketManager::close_ticket($ticket_id, $user_id);
$ticket['ticket']['status_id'] = TicketManager::STATUS_CLOSE;
$ticket['ticket']['status'] = get_lang('Closed');
}
$projectId = $ticket['ticket']['project_id'];
$messages = $ticket['messages'];
$counter = 1;
$messageToShow = '';
@ -211,12 +201,9 @@ foreach ($messages as $message) {
$subject = get_lang('Re:').': '.Security::remove_XSS($ticket['ticket']['subject']);
if (TicketManager::STATUS_FORWARDED != $ticket['ticket']['status_id'] &&
TicketManager::STATUS_CLOSE != $ticket['ticket']['status_id']
) {
if ($ticket['ticket']['assigned_last_user'] == $user_id ||
$ticket['ticket']['sys_insert_user_id'] == $user_id ||
$isAdmin
if ($allowEdition &&
$ticket['ticket']['status_id'] != TicketManager::STATUS_FORWARDED &&
$ticket['ticket']['status_id'] != TicketManager::STATUS_CLOSE
) {
$form = getForm($ticket['ticket']);
$formToShow = $form->returnForm();
@ -335,7 +322,6 @@ if (TicketManager::STATUS_FORWARDED != $ticket['ticket']['status_id'] &&
exit;
}
}
}
Display::display_header();
echo '<div class="actions">';
@ -407,6 +393,23 @@ if (null != $ticket['ticket']['course_url']) {
<td></td>
<td colspan="2"></td>
</tr>';
if (api_get_configuration_value('ticket_lp_quiz_info_add')) {
if (!empty($ticket['ticket']['exercise_url'])) {
echo '<tr>
<td><b>'.get_lang('Exercise').':</b> '.$ticket['ticket']['exercise_url'].' </td>
<td></td>
<td colspan="2"></td>
</tr>';
}
if (!empty($ticket['ticket']['lp_id'])) {
echo '<tr>
<td><b>'.get_lang('LearningPath').':</b> '.$ticket['ticket']['lp_url'].' </td>
<td></td>
<td colspan="2"></td>
</tr>';
}
}
}
echo '<tr>

@ -215,6 +215,7 @@ try {
break;
case Rest::GET_COURSES_FROM_EXTRA_FIELD:
$variable = $_REQUEST['extra_field_variable'] ?? '';
$value = $_REQUEST['extra_field_value'] ?? '';
$urlId = $_REQUEST['id_campus'] ?? '';
$extraField = new ExtraField('course');
$extraFieldInfo = $extraField->get_handler_field_info_by_field_variable($variable);
@ -224,12 +225,18 @@ try {
}
$extraFieldValue = new ExtraFieldValue('course');
$items = $extraFieldValue->getValuesByFieldId($extraFieldInfo['id']);
$items = $extraFieldValue->get_item_id_from_field_variable_and_field_value(
$variable,
$value,
false,
false,
true
);
$courseList = [];
foreach ($items as $item) {
$courseId = $item['item_id'];
if (UrlManager::relation_url_course_exist($courseId, $urlId)) {
$courseList[] = api_get_course_info($courseId);
$courseList[] = api_get_course_info_by_id($courseId);
}
}
@ -290,6 +297,10 @@ try {
$courses = $restApi->getUserSessions();
$restResponse->setData($courses);
break;
case Rest::GET_USERS_SUBSCRIBED_TO_COURSE:
$users = $restApi->getUsersSubscribedToCourse();
$restResponse->setData($users);
break;
case Rest::SAVE_USER_MESSAGE:
$receivers = isset($_POST['receivers']) ? $_POST['receivers'] : [];
$subject = !empty($_POST['subject']) ? $_POST['subject'] : null;

@ -792,8 +792,8 @@ function WSCreateUsersPasswordCrypted($params)
$active = 1;
$hr_dept_id = 0;
$extra = null;
$original_user_id_name = $user_param['original_user_id_name'];
$original_user_id_value = $user_param['original_user_id_value'];
$original_user_id_name = Database::escape_string($user_param['original_user_id_name']);
$original_user_id_value = Database::escape_string($user_param['original_user_id_value']);
$orig_user_id_value[] = $user_param['original_user_id_value'];
$extra_list = $user_param['extra'];
$salt = '';
@ -845,7 +845,7 @@ function WSCreateUsersPasswordCrypted($params)
$sql = "SELECT value as field_value,item_id as user_id
FROM $t_uf uf, $t_ufv ufv
WHERE
uf.extra_field_type = $extraFieldType
uf.extra_field_type = $extraFieldType AND
ufv.field_id=uf.id AND
variable='$original_user_id_name' AND
value ='$original_user_id_value'";

Loading…
Cancel
Save