Minor - partial merge from 1.11.x

pull/2487/merge
Julio Montoya 7 years ago
parent 791a25abe9
commit ece1d3a1b3
  1. 1
      main/admin/access_url_edit_usergroup_to_url.php
  2. 25
      main/admin/add_courses_to_usergroup.php
  3. 2
      main/admin/add_drh_to_user.php
  4. 66
      main/admin/add_sessions_to_usergroup.php
  5. 27
      main/admin/add_users_to_usergroup.php
  6. 21
      main/admin/archive_cleanup.php
  7. 52
      main/admin/course_edit.php
  8. 2
      main/admin/course_intro_pdf_import.php
  9. 24
      main/admin/index.php
  10. 22
      main/admin/legal_list.php
  11. 3
      main/admin/settings.lib.php
  12. 6
      main/admin/special_exports.php
  13. 2
      main/admin/sub_language.php
  14. 2
      main/admin/teacher_time_report.php
  15. 21
      main/admin/user_edit.php
  16. 4
      main/admin/user_information.php
  17. 153
      main/admin/user_list.php
  18. 662
      main/admin/user_list_consent.php
  19. 4
      main/admin/user_move_stats.php
  20. 8
      main/admin/usergroup_export.php
  21. 10
      main/admin/usergroup_import.php
  22. 11
      main/admin/usergroup_user_import.php
  23. 321
      main/admin/usergroup_users.php
  24. 281
      main/admin/usergroups.php
  25. 29
      main/announcements/announcements.php
  26. 1
      main/auth/conditional_login/conditional_login.php
  27. 16
      main/auth/courses.php
  28. 173
      main/course_info/about.php
  29. 1329
      main/exercise/MultipleAnswerTrueFalseDegreeCertainty.php
  30. 80
      main/exercise/export/scorm/ScormAnswerFillInBlanks.php
  31. 100
      main/exercise/export/scorm/ScormAnswerMatching.php
  32. 119
      main/exercise/export/scorm/ScormAnswerMultipleChoice.php
  33. 56
      main/exercise/export/scorm/ScormAnswerTrueFalse.php
  34. 184
      main/exercise/export/scorm/ScormAssessmentItem.php
  35. 221
      main/exercise/export/scorm/ScormExercise.php
  36. 223
      main/exercise/export/scorm/ScormQuestion.php
  37. 25
      main/exercise/export/scorm/common.js
  38. 1067
      main/exercise/export/scorm/scorm_classes.php
  39. 27
      main/inc/ajax/usergroup.ajax.php
  40. 37
      main/inc/lib/hook/HookCreateCourse.php
  41. 23
      main/inc/lib/hook/interfaces/HookCreateCourseEventInterface.php
  42. 21
      main/inc/lib/hook/interfaces/HookCreateCourseObserverInterface.php
  43. 553
      main/inc/lib/javascript/pear/qfamsHandler.js
  44. 128
      main/lang/brazilian/trad4all.inc.php
  45. 2
      main/lang/dutch/trad4all.inc.php
  46. 179
      main/lang/english/trad4all.inc.php
  47. 220
      main/lang/french/trad4all.inc.php
  48. 11
      main/lang/german/trad4all.inc.php
  49. 1
      main/lang/italian/trad4all.inc.php
  50. 181
      main/lang/spanish/trad4all.inc.php
  51. 397
      main/social/personal_data.php
  52. 52
      main/social/terms.php

@ -1,5 +1,6 @@
<?php
/* For licensing terms, see /license.txt */
/**
* @package chamilo.admin
*

@ -10,6 +10,11 @@ $cidReset = true;
// Including some necessary files.
require_once __DIR__.'/../inc/global.inc.php';
$id = isset($_REQUEST['id']) ? (int) $_REQUEST['id'] : 0;
$usergroup = new UserGroup();
$data = $usergroup->get($id);
$usergroup->protectScript($data);
$xajax = new xajax();
$xajax->registerFunction('search');
@ -17,9 +22,6 @@ $xajax->registerFunction('search');
$this_section = SECTION_PLATFORM_ADMIN;
// Access restrictions.
api_protect_admin_script(true);
// Setting breadcrumbs.
$interbreadcrumb[] = ['url' => 'index.php', 'name' => get_lang('PlatformAdmin')];
$interbreadcrumb[] = ['url' => 'usergroups.php', 'name' => get_lang('Classes')];
@ -48,8 +50,6 @@ function remove_item(origin) {
$form_sent = 0;
$errorMsg = '';
$sessions = [];
$usergroup = new UserGroup();
$id = intval($_GET['id']);
if (isset($_POST['form_sent']) && $_POST['form_sent']) {
$form_sent = $_POST['form_sent'];
@ -97,8 +97,17 @@ if (!empty($filters) && !empty($filterData)) {
}
}
$data = $usergroup->get($id);
$course_list_in = $usergroup->get_courses_by_usergroup($id, true);
$onlyThisCourseList = [];
if ($usergroup->allowTeachers()) {
$userId = api_get_user_id();
$courseList = CourseManager::getCoursesFollowedByUser($userId, COURSEMANAGER);
if (!empty($courseList)) {
$onlyThisCourseList = array_column($courseList, 'id');
}
}
$course_list = CourseManager::get_courses_list(
0,
0,
@ -108,11 +117,11 @@ $course_list = CourseManager::get_courses_list(
null,
api_get_current_access_url_id(),
false,
$conditions
$conditions,
$onlyThisCourseList
);
$elements_not_in = $elements_in = [];
foreach ($course_list_in as $course) {
$elements_in[$course['id']] = $course['title']." (".$course['visual_code'].")";
}

@ -15,7 +15,7 @@ if (!isset($_REQUEST['u'])) {
}
$em = Database::getManager();
$userRepository = $em->getRepository('ChamiloUserBundle:User');
$userRepository = UserManager::getRepository();
/** @var UserEntity $user */
$user = UserManager::getManager()->find($_REQUEST['u']);

@ -9,6 +9,11 @@ $cidReset = true;
// including some necessary files
require_once __DIR__.'/../inc/global.inc.php';
$id = isset($_REQUEST['id']) ? (int) $_REQUEST['id'] : 0;
$usergroup = new UserGroup();
$data = $usergroup->get($id);
$usergroup->protectScript($data);
$xajax = new xajax();
//$xajax->debugOn();
@ -17,15 +22,13 @@ $xajax->registerFunction('search_usergroup_sessions');
// setting the section (for the tabs)
$this_section = SECTION_PLATFORM_ADMIN;
// Access restrictions
// setting breadcrumbs
api_protect_admin_script(true);
// setting breadcrumbs
$interbreadcrumb[] = ['url' => 'index.php', 'name' => get_lang('PlatformAdmin')];
$interbreadcrumb[] = ['url' => 'usergroups.php', 'name' => get_lang('Classes')];
// Database Table Definitions
// setting the name of the tool
$tool_name = get_lang('SubscribeClassToSessions');
@ -37,18 +40,14 @@ if (isset($_REQUEST['add_type']) && $_REQUEST['add_type'] != '') {
$htmlHeadXtra[] = $xajax->getJavascript('../inc/lib/xajax/');
$htmlHeadXtra[] = '<script>
function add_user_to_session (code, content) {
document.getElementById("user_to_add").value = "";
document.getElementById("ajax_list_users_single").innerHTML = "";
destination = document.getElementById("elements_in");
for (i=0;i<destination.length;i++) {
if(destination.options[i].text == content) {
return false;
}
}
destination.options[destination.length] = new Option(content,code);
destination.selectedIndex = -1;
sortOptions(destination.options);
@ -63,13 +62,13 @@ function remove_item(origin) {
}
function display_advanced_search () {
if ($("#advancedSearch").css("display") == "none") {
$("#advancedSearch").css("display","block");
$("#img_plus_and_minus").html(\'&nbsp;'.Display::return_icon('div_hide.gif', get_lang('Hide'), ['style' => 'vertical-align:middle']).'&nbsp;'.get_lang('AdvancedSearch').'\');
} else {
$("#advancedSearch").css("display","none");
$("#img_plus_and_minus").html(\'&nbsp;'.Display::return_icon('div_show.gif', get_lang('Show'), ['style' => 'vertical-align:middle']).'&nbsp;'.get_lang('AdvancedSearch').'\');
}
if ($("#advancedSearch").css("display") == "none") {
$("#advancedSearch").css("display","block");
$("#img_plus_and_minus").html(\'&nbsp;'.Display::return_icon('div_hide.gif', get_lang('Hide'), ['style' => 'vertical-align:middle']).'&nbsp;'.get_lang('AdvancedSearch').'\');
} else {
$("#advancedSearch").css("display","none");
$("#img_plus_and_minus").html(\'&nbsp;'.Display::return_icon('div_show.gif', get_lang('Show'), ['style' => 'vertical-align:middle']).'&nbsp;'.get_lang('AdvancedSearch').'\');
}
}
function validate_filter() {
@ -82,8 +81,6 @@ function validate_filter() {
$form_sent = 0;
$errorMsg = '';
$sessions = [];
$usergroup = new UserGroup();
$id = intval($_GET['id']);
if (isset($_POST['form_sent']) && $_POST['form_sent']) {
$form_sent = $_POST['form_sent'];
$elements_posted = $_POST['elements_in_name'];
@ -97,9 +94,17 @@ if (isset($_POST['form_sent']) && $_POST['form_sent']) {
exit;
}
}
$data = $usergroup->get($id);
$session_list_in = $usergroup->get_sessions_by_usergroup($id);
$session_list = SessionManager::get_sessions_list([], ['name']);
$onlyThisSessionList = [];
if ($usergroup->allowTeachers()) {
$userId = api_get_user_id();
$sessionList = SessionManager::getSessionsFollowedByUser($userId, COURSEMANAGER);
if (!empty($sessionList)) {
$onlyThisSessionList = array_column($sessionList, 'id');
}
}
$session_list = SessionManager::get_sessions_list([], ['name'], null, null, 0, $onlyThisSessionList);
$elements_not_in = $elements_in = [];
if (!empty($session_list)) {
@ -112,10 +117,9 @@ if (!empty($session_list)) {
}
}
$ajax_search = $add_type == 'unique' ? true : false;
//checking for extra field with filter on
$ajax_search = $add_type === 'unique' ? true : false;
// checking for extra field with filter on
function search_usergroup_sessions($needle, $type)
{
global $elements_in;
@ -165,7 +169,8 @@ if ($add_type == 'multiple') {
}
echo '<div class="actions">';
echo '<a href="usergroups.php">'.Display::return_icon('back.png', get_lang('Back'), '', ICON_SIZE_MEDIUM).'</a>';
echo '<a href="usergroups.php">'.
Display::return_icon('back.png', get_lang('Back'), '', ICON_SIZE_MEDIUM).'</a>';
echo '<a href="javascript://" class="advanced_parameters" style="margin-top: 8px" onclick="display_advanced_search();"><span id="img_plus_and_minus">&nbsp;'.
Display::return_icon('div_show.gif', get_lang('Show'), ['style' => 'vertical-align:middle']).' '.get_lang('AdvancedSearch').'</span></a>';
echo '</div>';
@ -223,7 +228,13 @@ if (!empty($errorMsg)) {
} else {
?>
<div id="ajax_list_multiple">
<?php echo Display::select('elements_not_in_name', $elements_not_in, '', ['style' => 'width:360px', 'multiple' => 'multiple', 'id' => 'elements_not_in', 'size' => '15px'], false); ?>
<?php echo Display::select(
'elements_not_in_name',
$elements_not_in,
'',
['style' => 'width:360px', 'multiple' => 'multiple', 'id' => 'elements_not_in', 'size' => '15px'],
false
); ?>
</div>
<?php
}
@ -254,7 +265,13 @@ if (!empty($errorMsg)) {
</td>
<td align="center">
<?php
echo Display::select('elements_in_name[]', $elements_in, '', ['style' => 'width:360px', 'multiple' => 'multiple', 'id' => 'elements_in', 'size' => '15px'], false);
echo Display::select(
'elements_in_name[]',
$elements_in,
'',
['style' => 'width:360px', 'multiple' => 'multiple', 'id' => 'elements_in', 'size' => '15px'],
false
);
unset($sessionUsersList);
?>
</td>
@ -331,7 +348,6 @@ function loadUsersInSelect(select) {
xhr_object.onreadystatechange = function() {
if(xhr_object.readyState == 4) {
document.getElementById('content_source').innerHTML = result = xhr_object.responseText;
//alert(xhr_object.responseText);
}
}
}

@ -14,21 +14,19 @@ require_once __DIR__.'/../inc/global.inc.php';
// setting the section (for the tabs)
$this_section = SECTION_PLATFORM_ADMIN;
// Access restrictions
api_protect_admin_script(true);
$id = isset($_REQUEST['id']) ? (int) $_REQUEST['id'] : 0;
$relation = isset($_REQUEST['relation']) ? (int) $_REQUEST['relation'] : '';
$usergroup = new UserGroup();
$groupInfo = $usergroup->get($id);
$usergroup->protectScript($groupInfo);
// setting breadcrumbs
$interbreadcrumb[] = ['url' => 'index.php', 'name' => get_lang('PlatformAdmin')];
$interbreadcrumb[] = ['url' => 'usergroups.php', 'name' => get_lang('Classes')];
// Database Table Definitions
// setting the name of the tool
$tool_name = get_lang('SubscribeUsersToClass');
$id = intval($_GET['id']);
$relation = isset($_REQUEST['relation']) ? intval($_REQUEST['relation']) : '';
$htmlHeadXtra[] = '
<script>
@ -66,8 +64,8 @@ function validate_filter() {
document.formulaire.submit();
}
function checked_in_no_group(checked) {
function checked_in_no_group(checked)
{
$("#relation")
.find("option")
.attr("selected", false);
@ -102,14 +100,10 @@ if (is_array($extra_field_list)) {
}
}
$usergroup = new UserGroup();
if (empty($id)) {
api_not_allowed(true);
}
$groupInfo = $usergroup->get($id);
$first_letter_user = '';
if (isset($_POST['form_sent']) && $_POST['form_sent']) {
@ -244,7 +238,7 @@ if (!empty($filters) && !empty($filterData)) {
}
$elements_not_in = $elements_in = [];
$complete_user_list = UserManager::get_user_list_like([], $order);
$complete_user_list = UserManager::getUserListLike([], $order, false, 'AND');
if (!empty($complete_user_list)) {
foreach ($complete_user_list as $item) {
@ -281,9 +275,8 @@ if (!empty($complete_user_list)) {
}
$user_with_any_group = isset($_REQUEST['user_with_any_group']) && !empty($_REQUEST['user_with_any_group']) ? true : false;
if ($user_with_any_group) {
$user_list = UserManager::get_user_list_like($conditions, $order, true);
$user_list = UserManager::getUserListLike($conditions, $order, true, 'AND');
$new_user_list = [];
foreach ($user_list as $item) {
if (!in_array($item['user_id'], $list_all)) {
@ -292,7 +285,7 @@ if ($user_with_any_group) {
}
$user_list = $new_user_list;
} else {
$user_list = UserManager::get_user_list_like($conditions, $order, true);
$user_list = UserManager::getUserListLike($conditions, $order, true, 'AND');
}
if (!empty($user_list)) {

@ -36,14 +36,31 @@ if ($form->validate()) {
opcache_reset();
}
$file = api_get_path(SYS_PUBLIC_PATH).'build/main.js';
if (file_exists($file)) {
unlink($file);
}
$dir = api_get_path(SYS_PUBLIC_PATH).'build';
$files = scandir($dir);
foreach ($files as $file) {
if (preg_match('/main\..*\.js/', $file)) {
unlink($dir.'/'.$file);
}
}
$archive_path = api_get_path(SYS_ARCHIVE_PATH);
$htaccess = @file_get_contents($archive_path.'.htaccess');
$result = rmdirr($archive_path, true, true);
if (false === $result) {
Display::addFlash(Display::return_message(get_lang('ArchiveDirCleanupFailed'), 'error'));
} else {
Display::addFlash(Display::return_message(get_lang('ArchiveDirCleanupSucceeded')));
}
try {
\Chamilo\CoreBundle\Composer\ScriptHandler::dumpCssFiles();
Display::addFlash(Display::return_message(get_lang('ArchiveDirCleanupSucceeded')));
Display::addFlash(Display::return_message(get_lang('WebFolderRefreshSucceeded')));
} catch (Exception $e) {
Display::addFlash(Display::return_message(get_lang('ArchiveDirCleanupFailed'), 'error'));
Display::addFlash(Display::return_message(get_lang('WebFolderRefreshFailed'), 'error'));
error_log($e->getMessage());
}

@ -229,7 +229,7 @@ if (!empty($coursesInSession) && $allowEditSessionCoaches) {
}
}
$groupName = 'session_coaches['.$sessionId.']';
$groupName = 'session_coaches_'.$sessionId;
$platformTeacherId = 'platform_teachers_by_session_'.$sessionId;
$coachId = 'coaches_by_session_'.$sessionId;
$platformTeacherName = 'platform_teachers_by_session';
@ -397,17 +397,21 @@ if ($form->validate()) {
// Updating teachers
if ($addTeacherToSessionCourses) {
// Updating session coaches
$sessionCoaches = $course['session_coaches'];
if (!empty($sessionCoaches)) {
foreach ($sessionCoaches as $sessionId => $teacherInfo) {
$coachesToSubscribe = $teacherInfo['coaches_by_session'];
SessionManager::updateCoaches(
$sessionId,
$courseId,
$coachesToSubscribe,
true
);
foreach ($coursesInSession as $session) {
$sessionId = $session['id'];
// Updating session coaches
$sessionCoaches = isset($course['session_coaches_'.$sessionId]) ? $course['session_coaches_'.$sessionId] : [];
if (!empty($sessionCoaches)) {
foreach ($sessionCoaches as $teacherInfo) {
$coachesToSubscribe = isset($teacherInfo['coaches_by_session']) ? $teacherInfo['coaches_by_session'] : [];
SessionManager::updateCoaches(
$sessionId,
$courseId,
$coachesToSubscribe,
true
);
}
}
}
@ -422,18 +426,18 @@ if ($form->validate()) {
// Normal behaviour
CourseManager::updateTeachers($courseInfo, $teachers, true, false);
// Updating session coaches
$sessionCoaches = isset($course['session_coaches']) ? $course['session_coaches'] : [];
if (!empty($sessionCoaches)) {
foreach ($sessionCoaches as $sessionId => $coachesToSubscribe) {
if (!empty($coachesToSubscribe)) {
SessionManager::updateCoaches(
$sessionId,
$courseId,
$coachesToSubscribe,
true
);
}
foreach ($coursesInSession as $session) {
$sessionId = $session['id'];
// Updating session coaches
$sessionCoaches = isset($course['session_coaches_'.$sessionId]) ? $course['session_coaches_'.$sessionId] : [];
if (!empty($sessionCoaches)) {
SessionManager::updateCoaches(
$sessionId,
$courseId,
$sessionCoaches,
true
);
}
}
}

@ -54,7 +54,7 @@ if (count($errors) != 0) {
} elseif ($_POST['formSent']) {
Display::addFlash(
Display::return_message(
get_lang('CourseIntroductionsAllImportesSuccessfully'),
get_lang('CourseIntroductionsAllImportedSuccessfully'),
'confirmation',
false
)

@ -539,8 +539,30 @@ if (api_is_platform_admin()) {
}
}
/* Chamilo.org */
// Data protection
$blocks['data_privacy']['icon'] = Display::return_icon(
'platform.png',
get_lang('Platform'),
[],
ICON_SIZE_MEDIUM,
false
);
$blocks['data_privacy']['label'] = api_ucfirst(get_lang('PersonalDataPrivacy'));
$blocks['data_privacy']['class'] = 'block-admin-platform';
$blocks['data_privacy']['editable'] = false;
$items = [];
$items[] = [
'url' => api_get_path(WEB_CODE_PATH).'admin/user_list_consent.php',
'label' => get_lang('UserList'),
];
$blocks['data_privacy']['items'] = $items;
$blocks['data_privacy']['extra'] = null;
$blocks['data_privacy']['search_form'] = null;
/* Chamilo.org */
$blocks['chamilo']['icon'] = Display::return_icon(
'platform.png',
'Chamilo.org',

@ -1,6 +1,8 @@
<?php
/* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Repository\LegalRepository;
/**
* Sessions list script.
*
@ -8,24 +10,32 @@
*/
$cidReset = true;
require_once __DIR__.'/../inc/global.inc.php';
$this_section = SECTION_PLATFORM_ADMIN;
api_protect_admin_script();
$interbreadcrumb[] = ["url" => 'index.php', "name" => get_lang('PlatformAdmin')];
$interbreadcrumb[] = ['url' => 'index.php', 'name' => get_lang('PlatformAdmin')];
$tool_name = get_lang('TermsAndConditions');
Display :: display_header($tool_name);
Display::display_header($tool_name);
$parameters['sec_token'] = Security::get_token();
// action menu
echo '<div class="actions">';
echo '<a href="'.api_get_path(WEB_CODE_PATH).'admin/legal_add.php">';
echo Display::return_icon('edit.png', get_lang('EditTermsAndConditions')).get_lang('EditTermsAndConditions').'</a>&nbsp;&nbsp;';
echo Display::return_icon(
'edit.png',
get_lang('EditTermsAndConditions')
);
echo get_lang('EditTermsAndConditions').'</a>&nbsp;&nbsp;';
echo '</div>';
$legal_count = LegalManager::count();
$em = Database::getManager();
/** @var LegalRepository $legalTermsRepo */
$legalTermsRepo = $em->getRepository('ChamiloCoreBundle:Legal');
$legalCount = $legalTermsRepo->countAllActiveLegalTerms();
$languages = api_get_languages();
$available_languages = count($languages);
if ($legal_count != $available_languages) {
$available_languages = count($languages['folder']);
if ($legalCount != $available_languages) {
echo Display::return_message(get_lang('YouShouldCreateTermAndConditionsForAllAvailableLanguages'), 'warning');
}

@ -585,6 +585,7 @@ function uploadStylesheet($values, $picture)
$result = true;
} else {
$extraction_path = $cssToUpload.$style_name.'/';
$mode = api_get_permissions_for_new_directories();
for ($i = 0; $i < $num_files; $i++) {
$entry = $zip->getNameIndex($i);
if (substr($entry, -1) == '/') {
@ -597,7 +598,7 @@ function uploadStylesheet($values, $picture)
if (strpos($entry_without_first_dir, '/') !== false) {
if (!is_dir($extraction_path.dirname($entry_without_first_dir))) {
// Create it.
@mkdir($extraction_path.dirname($entry_without_first_dir), $mode = 0777, true);
@mkdir($extraction_path.dirname($entry_without_first_dir), $mode, true);
}
}

@ -25,11 +25,7 @@ $nameTools = get_lang('SpecialExports');
$export = '';
$querypath = '';
// include additional libraries
if (function_exists('ini_set')) {
api_set_memory_limit('256M');
ini_set('max_execution_time', 0);
}
api_set_more_memory_and_time_limits();
// Displaying the header
Display::display_header($nameTools);

@ -27,7 +27,7 @@ $htmlHeadXtra[] = '<script>
if (is_new_language.length>0 && is_new_language!="_" && file_id!="" && button_name!="") {
$.ajax({
contentType: "application/x-www-form-urlencoded",
beforeSend: function(objeto) {
beforeSend: function(myObject) {
$("#div_message_information_id").html("<div class=\"alert alert-info\"><img src=\'../inc/lib/javascript/indicator.gif\' /></div>");
},
type: "POST",

@ -230,7 +230,7 @@ if (!empty($selectedSession)) {
if (!empty($selectedTeacher)) {
$withFilter = true;
$teacher = api_get_user_info();
$teacher = api_get_user_info($selectedTeacher);
$teacherData = [
'userId' => $teacher['user_id'],
'lastname' => $teacher['lastname'],

@ -327,15 +327,30 @@ $returnParams = $extraField->addElements(
[],
true
);
$jquery_ready_content = $returnParams['jquery_ready_content'];
$jqueryReadyContent = $returnParams['jquery_ready_content'];
// the $jquery_ready_content variable collects all functions that will be load in the $(document).ready javascript function
$htmlHeadXtra[] = '<script>
$(document).ready(function(){
'.$jquery_ready_content.'
'.$jqueryReadyContent.'
});
</script>';
// Freeze user conditions, admin cannot updated them
$extraConditions = api_get_configuration_value('show_conditions_to_user');
if ($extraConditions && isset($extraConditions['conditions'])) {
$extraConditions = $extraConditions['conditions'];
foreach ($extraConditions as $condition) {
/** @var HTML_QuickForm_group $element */
$element = $form->getElement('extra_'.$condition['variable']);
if ($element) {
$element->freeze();
}
}
}
// Submit button
$form->addButtonSave(get_lang('Save'));
@ -373,7 +388,7 @@ if ($form->validate()) {
$picture_uri = $user_data['picture_uri'];
if (isset($user['delete_picture']) && $user['delete_picture']) {
$picture_uri = UserManager::delete_user_picture($user_id);
$picture_uri = UserManager::deleteUserPicture($user_id);
} elseif (!empty($picture['name'])) {
$picture_uri = UserManager::update_user_picture(
$user_id,

@ -197,7 +197,7 @@ if (api_get_setting('allow_terms_conditions') === 'true') {
'legal_accept'
);
$icon = Display::return_icon('accept_na.png');
if (isset($value['value'])) {
if (!empty($value['value'])) {
list($legalId, $legalLanguageId, $legalTime) = explode(':', $value['value']);
$icon = Display::return_icon('accept.png').' '.api_get_local_time($legalTime);
$icon .= ' '.Display::url(
@ -621,7 +621,7 @@ if ($studentBossList) {
}
$em = Database::getManager();
$userRepository = $em->getRepository('ChamiloUserBundle:User');
$userRepository = UserManager::getRepository();
$hrmList = $userRepository->getAssignedHrmUserList(
$userEntity->getId(),

@ -46,12 +46,6 @@ if (isset($_GET['user_id']) && $action == 'login_as') {
api_protect_admin_script(true);
// Blocks the possibility to delete a user
$deleteUserAvailable = true;
if (api_get_configuration_value('deny_delete_users')) {
$deleteUserAvailable = false;
}
trimVariables();
$url = api_get_path(WEB_AJAX_PATH).'course.ajax.php?a=get_user_courses';
@ -76,7 +70,7 @@ $htmlHeadXtra[] = '<script>
function load_course_list (div_course,my_user_id) {
$.ajax({
contentType: "application/x-www-form-urlencoded",
beforeSend: function(objeto) {
beforeSend: function(myObject) {
$("div#"+div_course).html("<img src=\'../inc/lib/javascript/indicator.gif\' />"); },
type: "POST",
url: "'.$url.'",
@ -92,7 +86,7 @@ function load_course_list (div_course,my_user_id) {
function load_session_list(div_session, my_user_id) {
$.ajax({
contentType: "application/x-www-form-urlencoded",
beforeSend: function(objeto) {
beforeSend: function(myObject) {
$("div#"+div_session).html("<img src=\'../inc/lib/javascript/indicator.gif\' />"); },
type: "POST",
url: "'.$urlSession.'",
@ -119,7 +113,7 @@ function active_user(element_div) {
if (confirm("'.get_lang('AreYouSureToEditTheUserStatus', '').'")) {
$.ajax({
contentType: "application/x-www-form-urlencoded",
beforeSend: function(objeto) {
beforeSend: function(myObject) {
$(ident).attr("src","'.Display::returnIconPath('loading1.gif').'"); }, //candy eye stuff
type: "GET",
url: "'.api_get_path(WEB_AJAX_PATH).'user_manager.ajax.php?a=active_user",
@ -440,6 +434,8 @@ function get_number_of_users()
* @param int Column to sort on
* @param string Order (ASC,DESC)
*
* @return array Users list
*
* @see SortableTable#get_table_data($from)
*/
function get_user_data($from, $number_of_items, $column, $direction)
@ -517,7 +513,9 @@ function email_filter($email)
/**
* Returns a mailto-link.
*
* @param string $email An email-address
* @param string $email An email-address
* @param array $params Deprecated
* @param array $row
*
* @return string HTML-code with a mailto-link
*/
@ -533,6 +531,8 @@ function user_filter($name, $params, $row)
* @param string URL params to add to table links
* @param array Row of elements to alter
*
* @throws Exception
*
* @return string Some HTML-code with modify-buttons
*/
function modify_filter($user_id, $url_params, $row)
@ -731,6 +731,21 @@ function modify_filter($user_id, $url_params, $row)
ICON_SIZE_SMALL
).
'</a>';
if ($user_id != api_get_user_id() &&
!$user_is_anonymous &&
api_global_admin_can_edit_admin($user_id)
) {
$result .= ' <a href="user_list.php?action=anonymize&user_id='.$user_id.'&'.$url_params.'&sec_token='.Security::getTokenFromSession().'" onclick="javascript:if(!confirm('."'".addslashes(api_htmlentities(get_lang("ConfirmYourChoice")))."'".')) return false;">'.
Display::return_icon(
'anonymous.png',
get_lang('Anonymize'),
[],
ICON_SIZE_SMALL
).
'</a>';
}
$deleteAllowed = !api_get_configuration_value('deny_delete_users');
if ($deleteAllowed) {
if ($user_id != api_get_user_id() &&
@ -740,13 +755,13 @@ function modify_filter($user_id, $url_params, $row)
// you cannot lock yourself out otherwise you could disable all the accounts
// including your own => everybody is locked out and nobody can change it anymore.
$result .= ' <a href="user_list.php?action=delete_user&user_id='.$user_id.'&'.$url_params.'&sec_token='.Security::getTokenFromSession().'" onclick="javascript:if(!confirm('."'".addslashes(api_htmlentities(get_lang("ConfirmYourChoice")))."'".')) return false;">'.
Display::return_icon(
'delete.png',
get_lang('Delete'),
[],
ICON_SIZE_SMALL
).
'</a>';
Display::return_icon(
'delete.png',
get_lang('Delete'),
[],
ICON_SIZE_SMALL
).
'</a>';
} else {
$result .= Display::return_icon(
'delete_na.png',
@ -855,67 +870,95 @@ if (!empty($action)) {
}
break;
case 'delete_user':
$allowDelete = api_get_configuration_value('allow_delete_user_for_session_admin');
if (api_is_platform_admin() ||
($allowDelete && api_is_session_admin())
) {
$user_to_delete = $_GET['user_id'];
$userToDeleteInfo = api_get_user_info($user_to_delete);
$current_user_id = api_get_user_id();
if ($userToDeleteInfo && $deleteUserAvailable &&
api_global_admin_can_edit_admin($_GET['user_id'], null, $allowDelete)
) {
if ($user_to_delete != $current_user_id &&
UserManager::delete_user($_GET['user_id'])
) {
$message = Display::return_message(
get_lang('UserDeleted').': '.$userToDeleteInfo['complete_name_with_username'],
'confirmation'
);
} else {
$message = Display::return_message(
get_lang('CannotDeleteUserBecauseOwnsCourse'),
'error'
);
$message = UserManager::deleteUserWithVerification($_GET['user_id']);
Display::addFlash($message);
header('Location: '.api_get_self());
exit;
break;
case 'delete':
if (api_is_platform_admin()) {
$number_of_selected_users = count($_POST['id']);
$number_of_affected_users = 0;
if (is_array($_POST['id'])) {
foreach ($_POST['id'] as $index => $user_id) {
if ($user_id != $_user['user_id']) {
if (UserManager::delete_user($user_id)) {
$number_of_affected_users++;
}
}
}
}
if ($number_of_selected_users == $number_of_affected_users) {
$message = Display::return_message(
get_lang('SelectedUsersDeleted'),
'confirmation'
);
} else {
$message = Display::return_message(
get_lang('CannotDeleteUser'),
get_lang('SomeUsersNotDeleted'),
'error'
);
}
Display::addFlash($message);
header('Location: '.api_get_self());
exit;
}
break;
case 'delete':
case 'disable':
if (api_is_platform_admin()) {
$number_of_selected_users = count($_POST['id']);
$number_of_deleted_users = 0;
$number_of_affected_users = 0;
if (is_array($_POST['id'])) {
foreach ($_POST['id'] as $index => $user_id) {
if ($user_id != $_user['user_id']) {
if (UserManager::delete_user($user_id)) {
$number_of_deleted_users++;
if (UserManager::disable($user_id)) {
$number_of_affected_users++;
}
}
}
}
if ($number_of_selected_users == $number_of_deleted_users) {
if ($number_of_selected_users == $number_of_affected_users) {
$message = Display::return_message(
get_lang('SelectedUsersDeleted'),
get_lang('SelectedUsersDisabled'),
'confirmation'
);
} else {
$message = Display::return_message(
get_lang('SomeUsersNotDeleted'),
get_lang('SomeUsersNotDisabled'),
'error'
);
}
}
break;
case 'enable':
if (api_is_platform_admin()) {
$number_of_selected_users = count($_POST['id']);
$number_of_affected_users = 0;
if (is_array($_POST['id'])) {
foreach ($_POST['id'] as $index => $user_id) {
if ($user_id != $_user['user_id']) {
if (UserManager::enable($user_id)) {
$number_of_affected_users++;
}
}
}
}
if ($number_of_selected_users == $number_of_affected_users) {
$message = Display::return_message(
get_lang('SelectedUsersEnabled'),
'confirmation'
);
} else {
$message = Display::return_message(
get_lang('SomeUsersNotEnabled'),
'error'
);
}
}
break;
case 'anonymize':
$message = UserManager::anonymizeUserWithVerification($_GET['user_id']);
Display::addFlash($message);
header('Location: '.api_get_self());
exit;
break;
}
Security::clear_token();
}
@ -1059,13 +1102,15 @@ $table->set_column_filter(8, 'active_filter');
$table->set_column_filter(10, 'modify_filter');
// Only show empty actions bar if delete users has been blocked
$actionsList = [];
if (api_is_platform_admin() &&
!api_get_configuration_value('deny_delete_users')
) {
$table->set_form_actions(['delete' => get_lang('DeleteFromPlatform')]);
} else {
$table->set_form_actions(['none' => get_lang('NoActionAvailable')]);
$actionsList['delete'] = get_lang('DeleteFromPlatform');
}
$actionsList['disable'] = get_lang('Disable');
$actionsList['enable'] = get_lang('Enable');
$table->set_form_actions($actionsList);
$table_result = $table->return_table();
$extra_search_options = '';

@ -0,0 +1,662 @@
<?php
/* For licensing terms, see /license.txt */
use ChamiloSession as Session;
/**
* @author Bart Mollet
* @author Julio Montoya <gugli100@gmail.com> BeezNest 2011
*
* @package chamilo.admin
*/
$cidReset = true;
require_once __DIR__.'/../inc/global.inc.php';
$urlId = api_get_current_access_url_id();
$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : '';
api_protect_admin_script();
$this_section = SECTION_PLATFORM_ADMIN;
$extraFields = UserManager::createDataPrivacyExtraFields();
Session::write('data_privacy_extra_fields', $extraFields);
/**
* Prepares the shared SQL query for the user table.
* See get_user_data() and get_number_of_users().
*
* @param bool $getCount Whether to count, or get data
*
* @return string SQL query
*/
function prepare_user_sql_query($getCount)
{
$sql = '';
$user_table = Database::get_main_table(TABLE_MAIN_USER);
$admin_table = Database::get_main_table(TABLE_MAIN_ADMIN);
if ($getCount) {
$sql .= "SELECT COUNT(u.id) AS total_number_of_items FROM $user_table u";
} else {
$sql .= 'SELECT u.id AS col0, u.official_code AS col2, ';
if (api_is_western_name_order()) {
$sql .= 'u.firstname AS col3, u.lastname AS col4, ';
} else {
$sql .= 'u.lastname AS col3, u.firstname AS col4, ';
}
$sql .= " u.username AS col5,
u.email AS col6,
u.status AS col7,
u.active AS col8,
u.id AS col9,
u.registration_date AS col10,
u.expiration_date AS exp,
u.password,
v.field_id
FROM $user_table u";
}
// adding the filter to see the user's only of the current access_url
if ((api_is_platform_admin() || api_is_session_admin()) && api_get_multiple_access_url()) {
$access_url_rel_user_table = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER);
$sql .= " INNER JOIN $access_url_rel_user_table url_rel_user
ON (u.id=url_rel_user.user_id)";
}
$extraFields = Session::read('data_privacy_extra_fields');
$extraFieldId = $extraFields['delete_legal'];
$extraFieldIdDeleteAccount = $extraFields['delete_account_extra_field'];
$extraFieldValue = Database::get_main_table(TABLE_EXTRA_FIELD_VALUES);
$sql .= " INNER JOIN $extraFieldValue v
ON (
u.id = v.item_id AND
(field_id = $extraFieldId OR field_id = $extraFieldIdDeleteAccount) AND
v.value = 1
) ";
$keywordList = [
'keyword_firstname',
'keyword_lastname',
'keyword_username',
'keyword_email',
'keyword_officialcode',
'keyword_status',
'keyword_active',
'keyword_inactive',
'check_easy_passwords',
];
$keywordListValues = [];
$atLeastOne = false;
foreach ($keywordList as $keyword) {
$keywordListValues[$keyword] = null;
if (isset($_GET[$keyword]) && !empty($_GET[$keyword])) {
$keywordListValues[$keyword] = $_GET[$keyword];
$atLeastOne = true;
}
}
if ($atLeastOne == false) {
$keywordListValues = [];
}
if (isset($_GET['keyword']) && !empty($_GET['keyword'])) {
$keywordFiltered = Database::escape_string("%".$_GET['keyword']."%");
$sql .= " WHERE (
u.firstname LIKE '$keywordFiltered' OR
u.lastname LIKE '$keywordFiltered' OR
concat(u.firstname, ' ', u.lastname) LIKE '$keywordFiltered' OR
concat(u.lastname,' ',u.firstname) LIKE '$keywordFiltered' OR
u.username LIKE '$keywordFiltered' OR
u.official_code LIKE '$keywordFiltered' OR
u.email LIKE '$keywordFiltered'
)
";
} elseif (isset($keywordListValues) && !empty($keywordListValues)) {
$query_admin_table = '';
$keyword_admin = '';
if (isset($keywordListValues['keyword_status']) &&
$keywordListValues['keyword_status'] == PLATFORM_ADMIN
) {
$query_admin_table = " , $admin_table a ";
$keyword_admin = ' AND a.user_id = u.id ';
$keywordListValues['keyword_status'] = '%';
}
$keyword_extra_value = '';
$sql .= " $query_admin_table
WHERE (
u.firstname LIKE '".Database::escape_string("%".$keywordListValues['keyword_firstname']."%")."' AND
u.lastname LIKE '".Database::escape_string("%".$keywordListValues['keyword_lastname']."%")."' AND
u.username LIKE '".Database::escape_string("%".$keywordListValues['keyword_username']."%")."' AND
u.email LIKE '".Database::escape_string("%".$keywordListValues['keyword_email']."%")."' AND
u.status LIKE '".Database::escape_string($keywordListValues['keyword_status'])."' ";
if (!empty($keywordListValues['keyword_officialcode'])) {
$sql .= " AND u.official_code LIKE '".Database::escape_string("%".$keywordListValues['keyword_officialcode']."%")."' ";
}
$sql .= "
$keyword_admin
$keyword_extra_value
";
if (isset($keywordListValues['keyword_active']) &&
!isset($keywordListValues['keyword_inactive'])
) {
$sql .= " AND u.active = 1";
} elseif (isset($keywordListValues['keyword_inactive']) &&
!isset($keywordListValues['keyword_active'])
) {
$sql .= " AND u.active = 0";
}
$sql .= " ) ";
}
$preventSessionAdminsToManageAllUsers = api_get_setting('prevent_session_admins_to_manage_all_users');
if (api_is_session_admin() && $preventSessionAdminsToManageAllUsers === 'true') {
$sql .= " AND u.creator_id = ".api_get_user_id();
}
// adding the filter to see the user's only of the current access_url
if ((api_is_platform_admin() || api_is_session_admin()) &&
api_get_multiple_access_url()
) {
$sql .= " AND url_rel_user.access_url_id = ".api_get_current_access_url_id();
}
return $sql;
}
/**
* Get the total number of users on the platform.
*
* @see SortableTable#get_total_number_of_items()
*/
function get_number_of_users()
{
$sql = prepare_user_sql_query(true);
$res = Database::query($sql);
$obj = Database::fetch_object($res);
return $obj->total_number_of_items;
}
/**
* Get the users to display on the current page (fill the sortable-table).
*
* @param int offset of first user to recover
* @param int Number of users to get
* @param int Column to sort on
* @param string Order (ASC,DESC)
*
* @return array Users list
*
* @see SortableTable#get_table_data($from)
*/
function get_user_data($from, $number_of_items, $column, $direction)
{
$sql = prepare_user_sql_query(false);
if (!in_array($direction, ['ASC', 'DESC'])) {
$direction = 'ASC';
}
$column = (int) $column;
$from = (int) $from;
$number_of_items = (int) $number_of_items;
$sql .= " ORDER BY col$column $direction ";
$sql .= " LIMIT $from,$number_of_items";
$res = Database::query($sql);
$users = [];
$t = time();
while ($user = Database::fetch_row($res)) {
$userPicture = UserManager::getUserPicture(
$user[0],
USER_IMAGE_SIZE_SMALL
);
$photo = '<img
src="'.$userPicture.'" width="22" height="22"
alt="'.api_get_person_name($user[2], $user[3]).'"
title="'.api_get_person_name($user[2], $user[3]).'" />';
if ($user[7] == 1 && !empty($user[10])) {
// check expiration date
$expiration_time = convert_sql_date($user[10]);
// if expiration date is passed, store a special value for active field
if ($expiration_time < $t) {
$user[7] = '-1';
}
}
// forget about the expiration date field
$users[] = [
$user[0],
$photo,
$user[1],
$user[2],
$user[3],
$user[4],
$user[5],
$user[6],
$user[7],
api_get_local_time($user[9]),
$user[12],
$user[0],
];
}
return $users;
}
/**
* Returns a mailto-link.
*
* @param string $email An email-address
*
* @return string HTML-code with a mailto-link
*/
function email_filter($email)
{
return Display::encrypted_mailto_link($email, $email);
}
/**
* Returns a mailto-link.
*
* @param string $email An email-address
* @param array $params Deprecated
* @param array $row
*
* @return string HTML-code with a mailto-link
*/
function user_filter($name, $params, $row)
{
return '<a href="'.api_get_path(WEB_PATH).'whoisonline.php?origin=user_list&id='.$row[0].'">'.$name.'</a>';
}
function requestTypeFilter($fieldId, $url_params, $row)
{
$extraFields = Session::read('data_privacy_extra_fields');
$extraFieldId = $extraFields['delete_legal'];
if ($fieldId == $extraFieldId) {
return get_lang('DeleteLegal');
} else {
return get_lang('DeleteAccount');
}
}
/**
* Build the modify-column of the table.
*
* @param int The user id
* @param string URL params to add to table links
* @param array Row of elements to alter
*
* @throws Exception
*
* @return string Some HTML-code with modify-buttons
*/
function modify_filter($user_id, $url_params, $row)
{
$_admins_list = Session::read('admin_list', []);
$is_admin = in_array($user_id, $_admins_list);
$token = Security::getTokenFromSession();
$result = '';
$result .= '<a href="user_information.php?user_id='.$user_id.'">'.
Display::return_icon('synthese_view.gif', get_lang('Info')).'</a>&nbsp;&nbsp;';
$result .= Display::url(
Display::return_icon('message_new.png'),
api_get_path(WEB_CODE_PATH).'messages/new_message.php?send_to_user='.$user_id
);
$result .= '&nbsp;&nbsp;';
$extraFields = Session::read('data_privacy_extra_fields');
$extraFieldId = $extraFields['delete_legal'];
if ($row[10] == $extraFieldId) {
$result .= Display::url(
get_lang('RemoveTerms'),
api_get_self().'?user_id='.$user_id.'&action=delete_terms&sec_token='.$token
);
$result .= '&nbsp;&nbsp;';
}
$result .= ' <a href="'.api_get_self().'?action=anonymize&user_id='.$user_id.'&'.$url_params.'&sec_token='.$token.'" onclick="javascript:if(!confirm('."'".addslashes(
api_htmlentities(get_lang('ConfirmYourChoice'))
)."'".')) return false;">'.
Display::return_icon(
'anonymous.png',
get_lang('Anonymize'),
[],
ICON_SIZE_SMALL
).
'</a>';
if ($user_id != api_get_user_id()) {
$result .= ' <a href="'.api_get_self().'?action=delete_user&user_id='.$user_id.'&'.$url_params.'&sec_token='.$token.'" onclick="javascript:if(!confirm('."'".addslashes(
api_htmlentities(get_lang('ConfirmYourChoice'))
)."'".')) return false;">'.
Display::return_icon(
'delete.png',
get_lang('Delete'),
[],
ICON_SIZE_SMALL
).
'</a>';
}
$editProfileUrl = Display::getProfileEditionLink($user_id, true);
$result .= '<a href="'.$editProfileUrl.'">'.
Display::return_icon(
'edit.png',
get_lang('Edit'),
[],
ICON_SIZE_SMALL
).
'</a>&nbsp;';
if ($is_admin) {
$result .= Display::return_icon(
'admin_star.png',
get_lang('IsAdministrator'),
['width' => ICON_SIZE_SMALL, 'heigth' => ICON_SIZE_SMALL]
);
} else {
$result .= Display::return_icon(
'admin_star_na.png',
get_lang('IsNotAdministrator')
);
}
return $result;
}
/**
* Build the active-column of the table to lock or unlock a certain user
* lock = the user can no longer use this account.
*
* @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
*
* @param int $active the current state of the account
* @param string $params
* @param array $row
*
* @return string Some HTML-code with the lock/unlock button
*/
function active_filter($active, $params, $row)
{
$_user = api_get_user_info();
if ($active == '1') {
$action = 'Lock';
$image = 'accept';
} elseif ($active == '-1') {
$action = 'edit';
$image = 'warning';
} elseif ($active == '0') {
$action = 'Unlock';
$image = 'error';
}
$result = '';
if ($action === 'edit') {
$result = Display::return_icon(
$image.'.png',
get_lang('AccountExpired'),
[],
16
);
} elseif ($row['0'] != $_user['user_id']) {
// you cannot lock yourself out otherwise you could disable all the
// accounts including your own => everybody is locked out and nobody
// can change it anymore.
$result = Display::return_icon(
$image.'.png',
get_lang(ucfirst($action)),
['onclick' => 'active_user(this);', 'id' => 'img_'.$row['0']],
16
);
}
return $result;
}
/**
* Instead of displaying the integer of the status, we give a translation for the status.
*
* @param int $status
*
* @return string translation
*
* @version march 2008
*
* @author Patrick Cool <patrick.cool@UGent.be>, Ghent University, Belgium
*/
function status_filter($status)
{
$statusname = api_get_status_langvars();
return $statusname[$status];
}
if (isset($_GET['keyword']) || isset($_GET['keyword_firstname'])) {
$interbreadcrumb[] = ['url' => 'index.php', 'name' => get_lang('PlatformAdmin')];
$interbreadcrumb[] = ['url' => 'user_list_consent.php', 'name' => get_lang('UserList')];
$tool_name = get_lang('SearchUsers');
} else {
$interbreadcrumb[] = ['url' => 'index.php', 'name' => get_lang('PlatformAdmin')];
$tool_name = get_lang('UserList');
}
$message = '';
if (!empty($action)) {
$check = Security::check_token('get');
if ($check) {
switch ($action) {
case 'delete_terms':
$extraFieldValue = new ExtraFieldValue('user');
$value = $extraFieldValue->get_values_by_handler_and_field_variable(
$_GET['user_id'],
'legal_accept'
);
$result = $extraFieldValue->delete($value['id']);
$value = $extraFieldValue->get_values_by_handler_and_field_variable(
$_GET['user_id'],
'request_for_legal_agreement_consent_removal'
);
$result = $extraFieldValue->delete($value['id']);
Display::addFlash(Display::return_message(get_lang('Deleted')));
header('Location: '.api_get_self());
exit;
break;
case 'delete_user':
$message = UserManager::deleteUserWithVerification($_GET['user_id']);
Display::addFlash($message);
header('Location: '.api_get_self());
exit;
break;
case 'delete':
if (api_is_platform_admin()) {
$number_of_selected_users = count($_POST['id']);
$number_of_affected_users = 0;
if (is_array($_POST['id'])) {
foreach ($_POST['id'] as $index => $user_id) {
if ($user_id != $_user['user_id']) {
if (UserManager::delete_user($user_id)) {
$number_of_affected_users++;
}
}
}
}
if ($number_of_selected_users == $number_of_affected_users) {
$message = Display::return_message(
get_lang('SelectedUsersDeleted'),
'confirmation'
);
} else {
$message = Display::return_message(
get_lang('SomeUsersNotDeleted'),
'error'
);
}
}
break;
case 'anonymize':
$message = UserManager::anonymizeUserWithVerification($_GET['user_id']);
Display::addFlash($message);
header('Location: '.api_get_self());
exit;
break;
}
Security::clear_token();
}
}
// Create a search-box
$form = new FormValidator('search_simple', 'get', null, null, null, 'inline');
$form->addText(
'keyword',
get_lang('Search'),
false,
[
'aria-label' => get_lang('SearchUsers'),
]
);
$form->addButtonSearch(get_lang('Search'));
$actionsLeft = '';
$actionsCenter = '';
$actionsRight = '';
$actionsLeft .= $form->returnForm();
if (isset($_GET['keyword'])) {
$parameters = ['keyword' => Security::remove_XSS($_GET['keyword'])];
} elseif (isset($_GET['keyword_firstname'])) {
$parameters['keyword_firstname'] = Security::remove_XSS($_GET['keyword_firstname']);
$parameters['keyword_lastname'] = Security::remove_XSS($_GET['keyword_lastname']);
$parameters['keyword_username'] = Security::remove_XSS($_GET['keyword_username']);
$parameters['keyword_email'] = Security::remove_XSS($_GET['keyword_email']);
$parameters['keyword_officialcode'] = Security::remove_XSS($_GET['keyword_officialcode']);
$parameters['keyword_status'] = Security::remove_XSS($_GET['keyword_status']);
$parameters['keyword_active'] = Security::remove_XSS($_GET['keyword_active']);
$parameters['keyword_inactive'] = Security::remove_XSS($_GET['keyword_inactive']);
}
// Create a sortable table with user-data
$parameters['sec_token'] = Security::get_token();
$_admins_list = array_keys(UserManager::get_all_administrators());
Session::write('admin_list', $_admins_list);
// Display Advanced search form.
$form = new FormValidator(
'advanced_search',
'get',
'',
'',
[],
FormValidator::LAYOUT_HORIZONTAL
);
$form->addElement('html', '<div id="advanced_search_form" style="display:none;">');
$form->addElement('header', get_lang('AdvancedSearch'));
$form->addText('keyword_firstname', get_lang('FirstName'), false);
$form->addText('keyword_lastname', get_lang('LastName'), false);
$form->addText('keyword_username', get_lang('LoginName'), false);
$form->addText('keyword_email', get_lang('Email'), false);
$form->addText('keyword_officialcode', get_lang('OfficialCode'), false);
$status_options = [];
$status_options['%'] = get_lang('All');
$status_options[STUDENT] = get_lang('Student');
$status_options[COURSEMANAGER] = get_lang('Teacher');
$status_options[DRH] = get_lang('Drh');
$status_options[SESSIONADMIN] = get_lang('SessionsAdmin');
$status_options[PLATFORM_ADMIN] = get_lang('Administrator');
$form->addElement(
'select',
'keyword_status',
get_lang('Profile'),
$status_options
);
$form->addButtonSearch(get_lang('SearchUsers'));
$defaults = [];
$defaults['keyword_active'] = 1;
$defaults['keyword_inactive'] = 1;
$form->setDefaults($defaults);
$form->addElement('html', '</div>');
$form = $form->returnForm();
$table = new SortableTable(
'users',
'get_number_of_users',
'get_user_data',
(api_is_western_name_order() xor api_sort_by_first_name()) ? 3 : 2
);
$table->set_additional_parameters($parameters);
$table->set_header(0, '', false, 'width="18px"');
$table->set_header(1, get_lang('Photo'), false);
$table->set_header(2, get_lang('OfficialCode'));
if (api_is_western_name_order()) {
$table->set_header(3, get_lang('FirstName'));
$table->set_header(4, get_lang('LastName'));
} else {
$table->set_header(3, get_lang('LastName'));
$table->set_header(4, get_lang('FirstName'));
}
$table->set_header(5, get_lang('LoginName'));
$table->set_header(6, get_lang('Email'));
$table->set_header(7, get_lang('Profile'));
$table->set_header(8, get_lang('Active'), true, 'width="15px"');
$table->set_header(9, get_lang('RegistrationDate'), true, 'width="90px"');
$table->set_header(10, get_lang('RequestType'), true, 'width="15px"');
$table->set_header(11, get_lang('Action'), false, 'width="220px"');
$table->set_column_filter(3, 'user_filter');
$table->set_column_filter(4, 'user_filter');
$table->set_column_filter(6, 'email_filter');
$table->set_column_filter(7, 'status_filter');
$table->set_column_filter(8, 'active_filter');
$table->set_column_filter(11, 'modify_filter');
$table->set_column_filter(10, 'requestTypeFilter');
// Only show empty actions bar if delete users has been blocked
$actionsList = [];
if (api_is_platform_admin() &&
!api_get_configuration_value('deny_delete_users')
) {
$actionsList['delete'] = get_lang('DeleteFromPlatform');
}
$actionsList['disable'] = get_lang('Disable');
$actionsList['enable'] = get_lang('Enable');
$table->set_form_actions($actionsList);
$table_result = $table->return_table();
$extra_search_options = '';
$toolbarActions = Display::toolbarAction(
'toolbarUser',
[$actionsLeft, $actionsCenter, $actionsRight],
[4, 4, 4]
);
$notice = Display::return_message(get_lang('InformationRightToBeForgottenText'), 'normal', false);
$tpl = new Template($tool_name);
$tpl->assign('actions', $toolbarActions);
$tpl->assign('message', $message);
$tpl->assign('content', $form.$table_result.$extra_search_options.$notice);
$tpl->display_one_col_template();

@ -641,7 +641,7 @@ $htmlHeadXtra[] = '<script>
var session_id = document.getElementById(unique_id).options[document.getElementById(unique_id).selectedIndex].value;
$.ajax({
contentType: "application/x-www-form-urlencoded",
beforeSend: function(objeto) {
beforeSend: function(myObject) {
$("div#reponse_"+unique_id).html("<img src=\'../inc/lib/javascript/indicator.gif\' />"); },
type: "POST",
url: "user_move_stats.php",
@ -656,7 +656,7 @@ $htmlHeadXtra[] = '<script>
$.ajax({
contentType: "application/x-www-form-urlencoded",
beforeSend: function(objeto) {
beforeSend: function(myObject) {
$("div#reponse_"+unique_id).html("<img src=\'../inc/lib/javascript/indicator.gif\' />"); },
type: "POST",
url: "user_move_stats.php",

@ -9,11 +9,10 @@ $cidReset = true;
require_once __DIR__.'/../inc/global.inc.php';
$this_section = SECTION_PLATFORM_ADMIN;
api_protect_admin_script();
$userGroup = new UserGroup();
$userGroup->protectScript();
$tool_name = get_lang('Export');
$interbreadcrumb[] = ["url" => 'index.php', "name" => get_lang('PlatformAdmin')];
$interbreadcrumb[] = ['url' => 'usergroups.php', 'name' => get_lang('Classes')];
set_time_limit(0);
@ -23,7 +22,6 @@ $form->addElement('header', $tool_name);
$form->addButtonExport(get_lang('Export'));
if ($form->validate()) {
$userGroup = new UserGroup();
$header = [['id', 'name', 'description', 'users']];
$data = $userGroup->getDataToExport();
$data = array_merge($header, $data);
@ -32,6 +30,6 @@ if ($form->validate()) {
exit;
}
Display :: display_header($tool_name);
Display::display_header($tool_name);
$form->display();
Display::display_footer();

@ -82,15 +82,13 @@ require_once __DIR__.'/../inc/global.inc.php';
// Setting the section (for the tabs).
$this_section = SECTION_PLATFORM_ADMIN;
$usergroup = new UserGroup();
$usergroup->protectScript();
// Access restrictions.
api_protect_admin_script();
// setting breadcrumbs
$interbreadcrumb[] = ['url' => 'index.php', 'name' => get_lang('PlatformAdmin')];
$interbreadcrumb[] = ['url' => 'usergroups.php', 'name' => get_lang('Classes')];
// Database Table Definitions
// Setting the name of the tool.
$tool_name = get_lang('ImportClassListCSV');
set_time_limit(0);
@ -128,7 +126,7 @@ if ($form->validate()) {
}
// Displaying the header.
Display :: display_header($tool_name);
Display::display_header($tool_name);
$form->display();
?>
@ -140,4 +138,4 @@ $form->display();
</pre>
<?php
// Displaying the footer.
Display :: display_footer();
Display::display_footer();

@ -83,8 +83,6 @@ function save_data($users_classes, $deleteUsersNotInList = false)
WHERE username = '".Database::escape_string(UserManager::purify_username($user_class['UserName'], $purification_option_for_usernames))."'";
$res1 = Database::query($sql1);
$obj1 = Database::fetch_object($res1);
$usergroup = new UserGroup();
$id = $usergroup->get_id_by_name($user_class['ClassName']);
if ($obj1 && $id) {
@ -135,11 +133,12 @@ $cidReset = true;
require_once __DIR__.'/../inc/global.inc.php';
$this_section = SECTION_PLATFORM_ADMIN;
api_protect_admin_script(true);
$usergroup = new UserGroup();
$usergroup->protectScript();
$tool_name = get_lang('AddUsersToAClass').' CSV';
$interbreadcrumb[] = ['url' => 'index.php', 'name' => get_lang('PlatformAdmin')];
$interbreadcrumb[] = ['url' => 'usergroups.php', 'name' => get_lang('Classes')];
// Set this option to true to enforce strict purification for usenames.
@ -164,7 +163,7 @@ if ($form->validate()) {
}
}
Display :: display_header($tool_name);
Display::display_header($tool_name);
if (isset($return) && $return) {
echo $return;
@ -188,4 +187,4 @@ jdoe;class01
adam;class01
</pre>
<?php
Display :: display_footer();
Display::display_footer();

@ -0,0 +1,321 @@
<?php
/* For licensing terms, see /license.txt */
/**
* @package chamilo.admin
*/
$cidReset = true;
require_once __DIR__.'/../inc/global.inc.php';
$this_section = SECTION_PLATFORM_ADMIN;
$id = isset($_GET['id']) ? (int) $_GET['id'] : 0;
$usergroup = new UserGroup();
$userGroupInfo = $usergroup->get($id);
if (empty($userGroupInfo)) {
api_not_allowed(true);
}
$usergroup->protectScript($userGroupInfo);
$calendarPlugin = null;
if (api_get_plugin_setting('learning_calendar', 'enabled') === 'true') {
$calendarPlugin = LearningCalendarPlugin::create();
}
// Add the JS needed to use the jqgrid
$htmlHeadXtra[] = api_get_jqgrid_js();
$action = isset($_GET['action']) ? Security::remove_XSS($_GET['action']) : null;
$userId = isset($_GET['user_id']) ? (int) $_GET['user_id'] : 0;
$calendarId = isset($_REQUEST['calendar_id']) ? (int) $_REQUEST['calendar_id'] : 0;
// setting breadcrumbs
$interbreadcrumb[] = ['url' => 'usergroups.php', 'name' => get_lang('Classes')];
$interbreadcrumb[] = ['url' => '#', 'name' => $userGroupInfo['name']];
switch ($action) {
case 'add_calendar':
$form = new FormValidator(
'add_calendar',
'post',
api_get_self().'?id='.$id.'&user_id='.$userId.'&action=add_calendar'
);
$userInfo = api_get_user_info($userId);
$form->addHeader($userInfo['complete_name']);
$calendarPlugin->getAddUserToCalendarForm($form);
$form->addButtonSave(get_lang('Add'));
$form->display();
if ($form->validate()) {
$calendarId = $form->getSubmitValue('calendar_id');
if (!empty($calendarId)) {
$calendarPlugin->addUserToCalendar($calendarId, $userId);
Display::addFlash(Display::return_message(get_lang('Added'), 'confirmation'));
header('Location: '.api_get_self().'?id='.$id);
exit;
}
}
exit;
break;
case 'edit_calendar':
$form = new FormValidator(
'add_calendar',
'post',
api_get_self().'?id='.$id.'&user_id='.$userId.'&action=edit_calendar&calendar_id='.$calendarId
);
$userInfo = api_get_user_info($userId);
$form->addHeader($userInfo['complete_name']);
$calendarPlugin->getAddUserToCalendarForm($form);
$form->setDefaults(['calendar_id' => $calendarId]);
$form->addButtonSave(get_lang('Update'));
$form->display();
if ($form->validate()) {
$calendarId = $form->getSubmitValue('calendar_id');
if (!empty($calendarId)) {
$calendarPlugin->updateUserToCalendar($calendarId, $userId);
Display::addFlash(Display::return_message(get_lang('Added'), 'confirmation'));
header('Location: '.api_get_self().'?id='.$id);
exit;
}
}
exit;
break;
case 'delete':
$res = $usergroup->delete_user_rel_group($_GET['user_id'], $_GET['id']);
Display::addFlash(Display::return_message(get_lang('Deleted'), 'confirmation'));
header('Location: '.api_get_self().'?id='.$id);
exit;
break;
case 'create_control_point':
$value = isset($_GET['value']) ? (int) $_GET['value'] : 0;
$calendarPlugin->addControlPoint($userId, $value);
Display::addFlash(
Display::return_message($calendarPlugin->get_lang('ControlPointAdded'), 'confirmation')
);
header('Location: '.api_get_self().'?id='.$id);
exit;
case 'add_multiple_users_to_calendar':
$userList = isset($_REQUEST['user_list']) ? explode(',', $_REQUEST['user_list']) : 0;
foreach ($userList as $userId) {
$isAdded = $calendarPlugin->addUserToCalendar($calendarId, $userId);
if (!$isAdded) {
$isAdded = $calendarPlugin->updateUserToCalendar($calendarId, $userId);
}
}
Display::addFlash(
Display::return_message(get_lang('Added'), 'confirmation')
);
header('Location: '.api_get_self().'?id='.$id);
exit;
break;
}
Display::display_header();
// jqgrid will use this URL to do the selects
$url = api_get_path(WEB_AJAX_PATH).'model.ajax.php?a=get_usergroups_users&id='.$id;
// The order is important you need to check the the $column variable in the model.ajax.php file
$columns = [
get_lang('Name'),
get_lang('Actions'),
];
// Column config
$column_model = [
['name' => 'name', 'index' => 'name', 'width' => '35', 'align' => 'left', 'sortable' => 'false'],
[
'name' => 'actions',
'index' => 'actions',
'width' => '20',
'align' => 'center',
'sortable' => 'false',
'formatter' => 'action_formatter',
],
];
if (api_get_plugin_setting('learning_calendar', 'enabled') === 'true') {
$columns = [
get_lang('Name'),
get_lang('Calendar'),
get_lang('ClassroomActivity'),
get_lang('TimeSpentByStudentsInCourses'),
$calendarPlugin->get_lang('NumberDaysAccumulatedInCalendar'),
$calendarPlugin->get_lang('DifferenceOfDaysAndCalendar'),
get_lang('Actions'),
];
// Column config
$column_model = [
['name' => 'name', 'index' => 'name', 'width' => '35', 'align' => 'left', 'sortable' => 'false'],
[
'name' => 'calendar',
'index' => 'calendar',
'width' => '35',
'align' => 'left',
'sortable' => 'false',
'formatter' => 'extra_formatter',
],
[
'name' => 'gradebook_items',
'index' => 'gradebook_items',
'width' => '35',
'align' => 'left',
'sortable' => 'false',
],
['name' => 'time_spent', 'index' => 'time_spent', 'width' => '35', 'align' => 'left', 'sortable' => 'false'],
[
'name' => 'lp_day_completed',
'index' => 'lp_day_completed',
'width' => '35',
'align' => 'left',
'sortable' => 'false',
],
['name' => 'days_diff', 'index' => 'days_diff', 'width' => '35', 'align' => 'left', 'sortable' => 'false'],
[
'name' => 'actions',
'index' => 'actions',
'width' => '20',
'align' => 'center',
'sortable' => 'false',
'formatter' => 'action_formatter',
],
];
}
// Autowidth
$extraParams['autowidth'] = 'true';
// height auto
$extraParams['height'] = 'auto';
$extraParams['sortname'] = 'name';
$extraParams['sortorder'] = 'desc';
$extraParams['multiselect'] = true;
$deleteIcon = Display::return_icon('delete.png', get_lang('Delete'), null, ICON_SIZE_SMALL);
$urlStats = api_get_path(WEB_CODE_PATH);
//$addCalendar = '<a href="'.$urlStats.'mySpace/myStudents.php?student=\'+options.rowId+\'">'.Display::return_icon('agenda.png', get_lang('Agenda'), '', ICON_SIZE_SMALL).'</a>';
$reportingIcon = Display::return_icon('stats.png', get_lang('Reporting'), '', ICON_SIZE_SMALL);
$controlPoint = Display::return_icon('add.png', get_lang('ControlPoint'), '', ICON_SIZE_SMALL);
//return \'<a href="session_edit.php?page=resume_session.php&id=\'+options.rowId+\'">'.Display::return_icon('edit.png', get_lang('Edit'), '', ICON_SIZE_SMALL).'</a>'.
// With this function we can add actions to the jgrid
$action_links = '
function action_formatter(cellvalue, options, rowObject) {
var value = rowObject[5];
return \''.
'&nbsp;<a href="'.$urlStats.'admin/usergroup_users.php?action=create_control_point&value=\'+value+\'&id='.$id.'&user_id=\'+options.rowId+\'">'.$controlPoint.'</a>'.
'&nbsp;<a href="'.$urlStats.'mySpace/myStudents.php?student=\'+options.rowId+\'">'.$reportingIcon.'</a>'.
' <a onclick="javascript:if(!confirm('."\'".addslashes(api_htmlentities(get_lang('ConfirmYourChoice'), ENT_QUOTES))."\'".')) return false;" href="?id='.$id.'&action=delete&user_id=\'+options.rowId+\'">'.$deleteIcon.'</a>\';
}
function extra_formatter(cellvalue, options, rowObject) {
var calendarName = rowObject[1];
var calendarId = rowObject[7];
if (calendarName == "") {
return \'<a href="'.
api_get_path(WEB_CODE_PATH).'admin/usergroup_users.php?user_id=\'+options.rowId+\'&id='.$id.'&action=add_calendar&width=700" class="btn btn-primary ajax">'.get_lang('Add').'</a>\';
} else {
return \' \'+calendarName+\' <a href="'.
api_get_path(WEB_CODE_PATH).'admin/usergroup_users.php?calendar_id=\'+calendarId+\'&user_id=\'+options.rowId+\'&id='.$id.'&action=edit_calendar&width=700" class="btn btn-primary ajax"> '.get_lang('Edit').'</a>\';
}
return calendarName;
return \''.
'&nbsp;<a href="'.$urlStats.'mySpace/myStudents.php?student=\'+options.rowId+\'">'.Display::return_icon('stats.png', get_lang('Reporting'), '', ICON_SIZE_SMALL).'</a>'.
' <a onclick="javascript:if(!confirm('."\'".addslashes(api_htmlentities(get_lang("ConfirmYourChoice"), ENT_QUOTES))."\'".')) return false;" href="?id='.$id.'&action=delete&user_id=\'+options.rowId+\'">'.$deleteIcon.'</a>\';
}';
$deleteUrl = api_get_path(WEB_AJAX_PATH).'usergroup.ajax.php?a=delete_user_in_usergroup&group_id='.$id;
$form = new FormValidator(
'add_multiple_calendar',
'post',
api_get_self().'?id='.$id.'&action=add_multiple_users_to_calendar'
);
$calendarPlugin->getAddUserToCalendarForm($form);
$form->addHidden('user_list', '');
$form->addButtonSave(get_lang('Add'));
?>
<script>
$(function() {
<?php
// grid definition see the $usergroup>display() function
echo Display::grid_js(
'usergroups',
$url,
$columns,
$column_model,
$extraParams,
[],
$action_links,
true
);
?>
$("#usergroups").jqGrid(
"navGrid",
"#usergroups_pager",
{ edit: false, add: false, del: true, search: false},
{ height:280, reloadAfterSubmit:false }, // edit options
{ height:280, reloadAfterSubmit:false }, // add options
{ reloadAfterSubmit:false, url: "<?php echo $deleteUrl; ?>" }, // del options
{ width:500 } // search options
)
.navButtonAdd('#usergroups_pager',{
caption:"<?php echo addslashes($calendarPlugin->get_lang('UpdateCalendar')); ?>",
buttonicon:"ui-icon ui-icon-plus",
onClickButton: function(a) {
var userIdList = $("#usergroups").jqGrid('getGridParam', 'selarrrow');
if (userIdList.length) {
$(".modal-body #add_multiple_calendar_user_list").val(userIdList);
$('#myModal').modal();
} else {
alert("<?php echo addslashes(get_lang('SelectStudents')); ?>");
}
},
position:"last"
});
});
</script>
<div class="modal fade" id="myModal" 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="Close">
<span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="myModalLabel">
<?php echo $calendarPlugin->get_lang('AddMultipleUsersToCalendar'); ?>
</h4>
</div>
<div class="modal-body">
<?php echo $form->display(); ?>
</div>
</div>
</div>
</div>
<?php
$usergroup->showGroupTypeSetting = true;
// Action handling: Adding a note
if ($action === 'delete' && is_numeric($_GET['id'])) {
$res = $usergroup->delete_user_rel_group($_GET['user_id'], $_GET['id']);
Display::addFlash(Display::return_message(get_lang('Deleted'), 'confirmation'));
header('Location: '.api_get_self().'?id='.$id);
exit;
} else {
$usergroup->displayToolBarUserGroupUsers();
}
Display::display_footer();

@ -5,15 +5,17 @@
* @package chamilo.admin
*/
$cidReset = true;
require_once __DIR__.'/../inc/global.inc.php';
$this_section = SECTION_PLATFORM_ADMIN;
api_protect_admin_script(true);
api_protect_limit_for_session_admin();
//Add the JS needed to use the jqgrid
$usergroup = new UserGroup();
$usergroup->protectScript();
// Add the JS needed to use the jqgrid
$htmlHeadXtra[] = api_get_jqgrid_js();
// setting breadcrumbs
$interbreadcrumb[] = ['url' => 'index.php', 'name' => get_lang('PlatformAdmin')];
$action = isset($_GET['action']) ? Security::remove_XSS($_GET['action']) : null;
if ($action == 'add') {
@ -25,22 +27,11 @@ if ($action == 'add') {
} else {
$interbreadcrumb[] = ['url' => '#', 'name' => get_lang('Classes')];
}
// The header.
Display::display_header();
// Tool name
if ($action == 'add') {
$tool = 'Add';
$interbreadcrumb[] = ['url' => api_get_self(), 'name' => get_lang('Group')];
}
if ($action == 'edit') {
$tool = 'Modify';
$interbreadcrumb[] = ['url' => api_get_self(), 'name' => get_lang('Group')];
}
// setting breadcrumbs
$action = isset($_GET['action']) ? Security::remove_XSS($_GET['action']) : '';
$userGroupId = isset($_GET['id']) ? (int) $_GET['id'] : 0;
// jqgrid will use this URL to do the selects
$url = api_get_path(WEB_AJAX_PATH).'model.ajax.php?a=get_usergroups';
//The order is important you need to check the the $column variable in the model.ajax.php file
@ -60,16 +51,23 @@ $column_model = [
['name' => 'courses', 'index' => 'courses', 'width' => '15', 'align' => 'left'],
['name' => 'sessions', 'index' => 'sessions', 'width' => '15', 'align' => 'left'],
['name' => 'group_type', 'index' => 'group_type', 'width' => '15', 'align' => 'center'],
['name' => 'actions', 'index' => 'actions', 'width' => '20', 'align' => 'center', 'sortable' => 'false', 'formatter' => 'action_formatter'],
[
'name' => 'actions',
'index' => 'actions',
'width' => '20',
'align' => 'center',
'sortable' => 'false',
'formatter' => 'action_formatter',
],
];
//Autowidth
// Autowidth
$extra_params['autowidth'] = 'true';
//height auto
// Height auto
$extra_params['height'] = 'auto';
$extra_params['sortname'] = 'name';
$extra_params['sortorder'] = 'desc';
//With this function we can add actions to the jgrid
// With this function we can add actions to the jgrid
$action_links = 'function action_formatter (cellvalue, options, rowObject) {
return \''
.' <a href="add_users_to_usergroup.php?id=\'+options.rowId+\'">'.Display::return_icon('user_to_class.png', get_lang('SubscribeUsersToClass'), null, ICON_SIZE_MEDIUM).'</a>'
@ -79,118 +77,141 @@ $action_links = 'function action_formatter (cellvalue, options, rowObject) {
.' <a onclick="javascript:if(!confirm('."\'".addslashes(api_htmlentities(get_lang("ConfirmYourChoice"), ENT_QUOTES))."\'".')) return false;" href="?action=delete&id=\'+options.rowId+\'">'.Display::return_icon('delete.png', get_lang('Delete'), null, ICON_SIZE_SMALL).'</a>\';
}';
?>
<script>
$(function() {
<?php
// grid definition see the $usergroup>display() function
echo Display::grid_js(
'usergroups',
$url,
$columns,
$column_model,
$extra_params,
[],
$action_links,
true
);
?>
});
</script>
<?php
$usergroup = new UserGroup();
$usergroup->showGroupTypeSetting = true;
$content = '';
// Action handling: Adding a note
if ($action == 'add') {
if (api_get_session_id() != 0 && !api_is_allowed_to_session_edit(false, true)) {
api_not_allowed();
}
$form = new FormValidator(
'usergroup',
'post',
api_get_self().'?action='.$action
);
$usergroup->setForm($form, 'add');
// Setting the defaults
$form->setDefaults(['visibility' => 2]);
// The validation or display
if ($form->validate()) {
$values = $form->exportValues();
$res = $usergroup->save($values);
if ($res) {
echo Display::return_message(get_lang('ItemAdded'), 'confirmation');
} else {
echo Display::return_message(
Security::remove_XSS($values['name']).': '.
get_lang('AlreadyExists'),
'warning'
);
}
switch ($action) {
case 'add':
$interbreadcrumb[] = ['url' => 'usergroups.php', 'name' => get_lang('Classes')];
$interbreadcrumb[] = ['url' => '#', 'name' => get_lang('Add')];
$usergroup->display();
} else {
echo '<div class="actions">';
echo '<a href="'.api_get_self().'">'.
if (api_get_session_id() != 0 && !api_is_allowed_to_session_edit(false, true)) {
api_not_allowed();
}
$form = new FormValidator(
'usergroup',
'post',
api_get_self().'?action='.$action
);
$usergroup->setForm($form, 'add');
// Setting the defaults
$form->setDefaults(['visibility' => 2]);
// The validation or display
if ($form->validate()) {
$values = $form->exportValues();
$res = $usergroup->save($values);
if ($res) {
Display::addFlash(Display::return_message(get_lang('ItemAdded'), 'confirmation'));
} else {
Display::addFlash(Display::return_message(
Security::remove_XSS($values['name']).': '.
get_lang('AlreadyExists'),
'warning'
));
}
header('Location: '.api_get_self());
exit;
} else {
$content .= '<div class="actions">';
$content .= '<a href="'.api_get_self().'">'.
Display::return_icon('back.png', get_lang('Back'), '', ICON_SIZE_MEDIUM).'</a>';
echo '</div>';
$token = Security::get_token();
$form->addElement('hidden', 'sec_token');
$form->setConstants(['sec_token' => $token]);
$form->display();
}
} elseif ($action == 'edit' && is_numeric($_GET['id'])) {
$id = intval($_GET['id']);
$form = new FormValidator(
'usergroup',
'post',
api_get_self().'?action='.$action.'&id='.$id
);
$defaults = $usergroup->get($id);
$usergroup->setForm($form, 'edit', $defaults);
// Setting the form elements
$form->addElement('hidden', 'id', $id);
// Setting the defaults
$form->setDefaults($defaults);
// The validation or display.
if ($form->validate()) {
$values = $form->getSubmitValues();
$res = $usergroup->update($values);
if ($res) {
echo Display::return_message(get_lang('Updated'), 'confirmation');
$content .= '</div>';
$token = Security::get_token();
$form->addElement('hidden', 'sec_token');
$form->setConstants(['sec_token' => $token]);
$content .= $form->returnForm();
}
break;
case 'edit':
$interbreadcrumb[] = ['url' => 'usergroups.php', 'name' => get_lang('Classes')];
$interbreadcrumb[] = ['url' => '#', 'name' => get_lang('Edit')];
$defaults = $usergroup->get($userGroupId);
$usergroup->protectScript($defaults);
$form = new FormValidator(
'usergroup',
'post',
api_get_self().'?action='.$action.'&id='.$userGroupId
);
$usergroup->setForm($form, 'edit', $defaults);
// Setting the form elements
$form->addElement('hidden', 'id', $userGroupId);
// Setting the defaults
$form->setDefaults($defaults);
// The validation or display.
if ($form->validate()) {
$values = $form->getSubmitValues();
$res = $usergroup->update($values);
if ($res) {
Display::addFlash(Display::return_message(get_lang('Updated'), 'confirmation'));
} else {
Display::addFlash(Display::return_message(
Security::remove_XSS($values['name']).': '.
get_lang('AlreadyExists'),
'warning'
));
}
header('Location: '.api_get_self());
exit;
} else {
echo Display::return_message(
Security::remove_XSS($values['name']).': '.
get_lang('AlreadyExists'),
'warning'
);
$content .= '<div class="actions">';
$content .= '<a href="'.api_get_self().'">'.Display::return_icon(
'back.png',
get_lang('Back'),
'',
ICON_SIZE_MEDIUM
).'</a>';
$content .= '</div>';
$content .= $form->returnForm();
}
$usergroup->display();
} else {
echo '<div class="actions">';
echo '<a href="'.api_get_self().'">'.Display::return_icon(
'back.png',
get_lang('Back'),
'',
ICON_SIZE_MEDIUM
).'</a>';
echo '</div>';
$form->display();
}
} elseif ($action == 'delete' && is_numeric($_GET['id'])) {
$res = $usergroup->delete($_GET['id']);
if ($res) {
echo Display::return_message(get_lang('Deleted'), 'confirmation');
}
$usergroup->display();
} else {
$usergroup->display();
break;
case 'delete':
$defaults = $usergroup->get($userGroupId);
$usergroup->protectScript($defaults);
$res = $usergroup->delete($userGroupId);
if ($res) {
Display::addFlash(Display::return_message(get_lang('Deleted'), 'confirmation'));
}
header('Location: '.api_get_self());
exit;
break;
default:
$interbreadcrumb[] = ['url' => '#', 'name' => get_lang('Classes')];
$content = $usergroup->returnGrid();
break;
}
Display :: display_footer();
// The header.
Display::display_header();
?>
<script>
$(function() {
<?php
// grid definition see the $usergroup>display() function
echo Display::grid_js(
'usergroups',
$url,
$columns,
$column_model,
$extra_params,
[],
$action_links,
true
);
?>
});
</script>
<?php
echo $content;
Display::display_footer();

@ -83,12 +83,11 @@ if (!empty($group_id)) {
}
}
/* Tracking */
/* Tracking */
Event::event_access_tool(TOOL_ANNOUNCEMENT);
$announcement_id = isset($_GET['id']) ? intval($_GET['id']) : null;
$action = isset($_GET['action']) ? Security::remove_XSS($_GET['action']) : 'list';
$announcement_number = AnnouncementManager::getNumberAnnouncements();
$homeUrl = api_get_self().'?action=list&'.api_get_cidreq();
@ -97,7 +96,6 @@ $searchFormToString = '';
switch ($action) {
case 'move':
if (!$allowToEdit) {
api_not_allowed(true);
}
@ -119,7 +117,6 @@ switch ($action) {
}
$announcementInfo = AnnouncementManager::get_by_id($courseId, $thisAnnouncementId);
$sql = "SELECT DISTINCT announcement.id, announcement.display_order
FROM $tbl_announcement announcement,
$tbl_item_property itemproperty
@ -143,7 +140,6 @@ switch ($action) {
Database::query($sql);
$sql = "UPDATE $tbl_announcement SET display_order = '$thisAnnouncementOrder'
WHERE c_id = $courseId AND id = $nextAnnouncementId";
Database::query($sql);
break;
}
@ -382,7 +378,7 @@ switch ($action) {
}
// DISPLAY ADD ANNOUNCEMENT COMMAND
$id = isset($_GET['id']) ? intval($_GET['id']) : 0;
$id = isset($_GET['id']) ? (int) $_GET['id'] : 0;
$url = api_get_self().'?action='.$action.'&id='.$id.'&'.api_get_cidreq();
$form = new FormValidator(
@ -393,15 +389,13 @@ switch ($action) {
['enctype' => 'multipart/form-data']
);
$form_name = get_lang('ModifyAnnouncement');
if (empty($id)) {
$form_name = get_lang('AddAnnouncement');
} else {
$form_name = get_lang('ModifyAnnouncement');
}
$interbreadcrumb[] = [
"url" => api_get_path(WEB_CODE_PATH)."announcements/announcements.php?".api_get_cidreq(),
"name" => $nameTools,
'url' => api_get_path(WEB_CODE_PATH).'announcements/announcements.php?'.api_get_cidreq(),
'name' => $nameTools,
];
$nameTools = $form_name;
@ -428,7 +422,7 @@ switch ($action) {
} elseif (isset($_GET['remindallinactives']) && $_GET['remindallinactives'] === 'true') {
// we want to remind inactive users. The $_GET['since'] parameter
// determines which users have to be warned (i.e the users who have been inactive for x days or more
$since = isset($_GET['since']) ? intval($_GET['since']) : 6;
$since = isset($_GET['since']) ? (int) $_GET['since'] : 6;
// Getting the users who have to be reminded
$to = Tracking::getInactiveStudentsInCourse(
@ -479,10 +473,8 @@ switch ($action) {
}
$announcementInfo = AnnouncementManager::get_by_id($courseId, $id);
if (isset($announcementInfo) && !empty($announcementInfo)) {
$to = AnnouncementManager::load_edit_users('announcement', $id);
$defaults = [
'title' => $announcementInfo['title'],
'content' => $announcementInfo['content'],
@ -503,7 +495,6 @@ switch ($action) {
if (!isset($parts[1]) || empty($parts[1])) {
continue;
}
$form->addHtml("
<script>
$(document).on('ready', function () {
@ -520,20 +511,19 @@ switch ($action) {
'text',
'title',
get_lang('EmailTitle'),
["onkeypress" => "return event.keyCode != 13;"]
['onkeypress' => 'return event.keyCode != 13;']
);
$form->addRule('title', get_lang('ThisFieldIsRequired'), 'required');
$form->addElement('hidden', 'id');
$htmlTags = '';
$tags = AnnouncementManager::getTags();
foreach ($tags as $tag) {
$htmlTags .= "<b>".$tag."</b><br />";
$htmlTags .= "<b>$tag</b><br />";
}
$form->addButtonAdvancedSettings('tags', get_lang('Tags'));
$form->addElement('html', '<div id="tags_options" style="display:none">');
$form->addLabel('', Display::return_message($htmlTags, 'normal', false));
$form->addElement('html', '</div>');
$form->addHtmlEditor(
'content',
get_lang('Description'),
@ -541,7 +531,6 @@ switch ($action) {
false,
['ToolbarSet' => 'Announcements']
);
$form->addElement('file', 'user_upload', get_lang('AddAnAttachment'));
$form->addElement('textarea', 'file_comment', get_lang('FileComment'));
$form->addHidden('sec_token', $token);
@ -597,6 +586,7 @@ switch ($action) {
'success'
)
);
Security::clear_token();
header('Location: '.$homeUrl);
exit;
}
@ -646,6 +636,7 @@ switch ($action) {
$sendToUsersInSession
);
}
Security::clear_token();
header('Location: '.$homeUrl);
exit;
}

@ -55,6 +55,7 @@ function check_platform_legal_conditions($user)
api_get_setting('load_term_conditions_section') === 'login'
) {
$termAndConditionStatus = api_check_term_condition($user['user_id']);
// @todo not sure why we need the login password and update_term_status
if ($termAndConditionStatus === false) {
Session::write('term_and_condition', ['user_id' => $user['user_id']]);

@ -105,7 +105,7 @@ if (isset($_GET['move'])) {
// We are moving the course of the user to a different user defined course category (=Sort My Courses).
if (isset($_POST['submit_change_course_category'])) {
if ($ctok == $_POST['sec_token']) {
if (!empty($_POST['sec_token']) && $ctok == $_POST['sec_token']) {
$courseController->change_course_category(
$_POST['course_2_edit_category'],
$_POST['course_categories']
@ -118,7 +118,7 @@ if (isset($_POST['submit_edit_course_category']) &&
isset($_POST['title_course_category']) &&
strlen(trim($_POST['title_course_category'])) > 0
) {
if ($ctok == $_POST['sec_token']) {
if (!empty($_POST['sec_token']) && $ctok == $_POST['sec_token']) {
$courseController->edit_course_category(
$_POST['title_course_category'],
$_POST['edit_course_category']
@ -128,7 +128,7 @@ if (isset($_POST['submit_edit_course_category']) &&
// we are deleting a course category
if ($action == 'deletecoursecategory' && isset($_GET['id'])) {
if ($ctok == $_GET['sec_token']) {
if (!empty($_GET['sec_token']) && $ctok == $_GET['sec_token']) {
$get_id_cat = intval($_GET['id']);
$courseController->delete_course_category($get_id_cat);
}
@ -139,14 +139,14 @@ if (isset($_POST['create_course_category']) &&
isset($_POST['title_course_category']) &&
strlen(trim($_POST['title_course_category'])) > 0
) {
if ($ctok == $_POST['sec_token']) {
if (!empty($_POST['sec_token']) && $ctok == $_POST['sec_token']) {
$courseController->addCourseCategory($_POST['title_course_category']);
}
}
// search courses
if (isset($_REQUEST['search_course'])) {
if ($ctok == $_REQUEST['sec_token']) {
if (!empty($_REQUEST['sec_token']) && $ctok == $_REQUEST['sec_token']) {
$courseController->search_courses(
$searchTerm,
null,
@ -161,7 +161,7 @@ if (isset($_REQUEST['search_course'])) {
// Subscribe user to course
if (isset($_REQUEST['subscribe_course'])) {
if ($ctok == $_GET['sec_token']) {
if (!empty($_GET['sec_token']) && $ctok == $_GET['sec_token']) {
$courseController->subscribe_user(
$_GET['subscribe_course'],
$searchTerm,
@ -172,7 +172,7 @@ if (isset($_REQUEST['subscribe_course'])) {
// We are unsubscribing from a course (=Unsubscribe from course).
if (isset($_GET['unsubscribe'])) {
if ($ctok == $_GET['sec_token']) {
if (!empty($_GET['sec_token']) && $ctok == $_GET['sec_token']) {
$courseController->unsubscribe_user_from_course(
$_GET['unsubscribe'],
$searchTerm,
@ -183,7 +183,7 @@ if (isset($_GET['unsubscribe'])) {
// We are unsubscribing from a course (=Unsubscribe from course).
if (isset($_POST['unsubscribe'])) {
if ($ctok == $_POST['sec_token']) {
if (!empty($_POST['sec_token']) && $ctok == $_POST['sec_token']) {
$courseController->unsubscribe_user_from_course($_POST['unsubscribe']);
}
}

@ -0,0 +1,173 @@
<?php
/* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\CourseRelUser;
use Chamilo\CoreBundle\Entity\ExtraField;
use Chamilo\CourseBundle\Entity\CCourseDescription;
/**
* Course about page
* Show information about a course.
*
* @author Alex Aragon Calixto <alex.aragon@beeznest.com>
*
* @package chamilo.course
*/
$cidReset = true;
require_once __DIR__.'/../inc/global.inc.php';
$courseId = isset($_GET['course_id']) ? (int) $_GET['course_id'] : 0;
$token = Security::get_existing_token();
$em = Database::getManager();
//userID
$userId = api_get_user_id();
/** @var Course $course */
$course = $em->find('ChamiloCoreBundle:Course', $courseId);
if (!$course) {
api_not_allowed(true);
}
$userRepo = UserManager::getRepository();
$fieldsRepo = $em->getRepository('ChamiloCoreBundle:ExtraField');
$fieldTagsRepo = $em->getRepository('ChamiloCoreBundle:ExtraFieldRelTag');
/** @var CCourseDescription $courseDescription */
$courseDescriptionTools = $em->getRepository('ChamiloCourseBundle:CCourseDescription')
->findBy(
[
'cId' => $course->getId(),
'sessionId' => 0,
],
[
'id' => 'DESC',
'descriptionType' => 'ASC',
]
);
$courseValues = new ExtraFieldValue('course');
$userValues = new ExtraFieldValue('user');
$urlCourse = api_get_path(WEB_PATH).'main/course/about.php?course_id='.$courseId;
$courseTeachers = $course->getTeachers();
$teachersData = [];
/** @var CourseRelUser $teacherSubscription */
foreach ($courseTeachers as $teacherSubscription) {
$teacher = $teacherSubscription->getUser();
$userData = [
'complete_name' => $teacher->getCompleteName(),
'image' => UserManager::getUserPicture(
$teacher->getId(),
USER_IMAGE_SIZE_ORIGINAL
),
'diploma' => $teacher->getDiplomas(),
'openarea' => $teacher->getOpenarea(),
];
$teachersData[] = $userData;
}
$tagField = $fieldsRepo->findOneBy([
'extraFieldType' => ExtraField::COURSE_FIELD_TYPE,
'variable' => 'tags',
]);
$courseTags = [];
if (!is_null($tagField)) {
$courseTags = $fieldTagsRepo->getTags($tagField, $courseId);
}
$courseDescription = $courseObjectives = $courseTopics = $courseMethodology = $courseMaterial = $courseResources = $courseAssessment = '';
$courseCustom = [];
foreach ($courseDescriptionTools as $descriptionTool) {
switch ($descriptionTool->getDescriptionType()) {
case CCourseDescription::TYPE_DESCRIPTION:
$courseDescription = $descriptionTool->getContent();
break;
case CCourseDescription::TYPE_OBJECTIVES:
$courseObjectives = $descriptionTool;
break;
case CCourseDescription::TYPE_TOPICS:
$courseTopics = $descriptionTool;
break;
case CCourseDescription::TYPE_METHODOLOGY:
$courseMethodology = $descriptionTool;
break;
case CCourseDescription::TYPE_COURSE_MATERIAL:
$courseMaterial = $descriptionTool;
break;
case CCourseDescription::TYPE_RESOURCES:
$courseResources = $descriptionTool;
break;
case CCourseDescription::TYPE_ASSESSMENT:
$courseAssessment = $descriptionTool;
break;
case CCourseDescription::TYPE_CUSTOM:
$courseCustom[] = $descriptionTool;
break;
}
}
$topics = [
'objectives' => $courseObjectives,
'topics' => $courseTopics,
'methodology' => $courseMethodology,
'material' => $courseMaterial,
'resources' => $courseResources,
'assessment' => $courseAssessment,
'custom' => array_reverse($courseCustom),
];
$subscriptionUser = CourseManager::is_user_subscribed_in_course($userId, $course->getCode());
$plugin = BuyCoursesPlugin::create();
$checker = $plugin->isEnabled();
$courseIsPremium = null;
if ($checker) {
$courseIsPremium = $plugin->getItemByProduct(
$courseId,
BuyCoursesPlugin::PRODUCT_TYPE_COURSE
);
}
$courseItem = [
'code' => $course->getCode(),
'title' => $course->getTitle(),
'description' => $courseDescription,
'image' => CourseManager::getPicturePath($course, true),
'syllabus' => $topics,
'tags' => $courseTags,
'teachers' => $teachersData,
'extra_fields' => $courseValues->getAllValuesForAnItem(
$course->getId(),
null,
true
),
'subscription' => $subscriptionUser,
];
$metaInfo = '<meta property="og:url" content="'.$urlCourse.'" />';
$metaInfo .= '<meta property="og:type" content="website" />';
$metaInfo .= '<meta property="og:title" content="'.$courseItem['title'].'" />';
$metaInfo .= '<meta property="og:description" content="'.$courseDescription.'" />';
$metaInfo .= '<meta property="og:image" content="'.$courseItem['image'].'" />';
$htmlHeadXtra[] = $metaInfo;
$htmlHeadXtra[] = api_get_asset('readmore-js/readmore.js');
$template = new Template($course->getTitle(), true, true, false, true, false);
$template->assign('course', $courseItem);
$essence = Essence\Essence::instance();
$template->assign('essence', $essence);
$template->assign('is_premium', $courseIsPremium);
$template->assign('token', $token);
$template->assign('url', $urlCourse);
$layout = $template->get_template('course_home/about.tpl');
$content = $template->fetch($layout);
$template->assign('content', $content);
$template->display_one_col_template();

File diff suppressed because it is too large Load Diff

@ -0,0 +1,80 @@
<?php
/* For licensing terms, see /license.txt */
/**
* This class handles the SCORM export of fill-in-the-blanks questions.
*
* @package chamilo.exercise.scorm
*/
class ScormAnswerFillInBlanks extends Answer
{
/**
* Export the text with missing words.
*
* As a side effect, it stores two lists in the class :
* the missing words and their respective weightings.
*/
public function export()
{
$js = '';
// get all enclosed answers
$blankList = [];
foreach ($this->answer as $i => $answer) {
$blankList[] = '['.$answer.']';
}
// splits text and weightings that are joined with the character '::'
$listAnswerInfo = FillBlanks::getAnswerInfo($answer);
//$switchableAnswerSet = $listAnswerInfo['switchable'];
// display empty [input] with the right width for student to fill it
$answer = '';
$answerList = [];
for ($i = 0; $i < count($listAnswerInfo['common_words']) - 1; $i++) {
// display the common words
$answer .= $listAnswerInfo['common_words'][$i];
// display the blank word
$attributes['style'] = 'width:'.$listAnswerInfo['input_size'][$i].'px';
$answer .= FillBlanks::getFillTheBlankHtml(
$this->questionJSId,
$this->questionJSId + 1,
'',
$attributes,
$answer,
$listAnswerInfo,
true,
$i,
'question_'.$this->questionJSId.'_fib_'.($i + 1)
);
$answerList[] = $i + 1;
}
// display the last common word
$answer .= $listAnswerInfo['common_words'][$i];
// because [] is parsed here we follow this procedure:
// 1. find everything between the [ and ] tags
$jstmpw = 'questions_answers_ponderation['.$this->questionJSId.'] = new Array();'."\n";
$jstmpw .= 'questions_answers_ponderation['.$this->questionJSId.'][0] = 0;'."\n";
foreach ($listAnswerInfo['weighting'] as $key => $weight) {
$jstmpw .= 'questions_answers_ponderation['.$this->questionJSId.']['.($key + 1).'] = '.$weight.";\n";
}
$wordList = "'".implode("', '", $listAnswerInfo['words'])."'";
$answerList = "'".implode("', '", $answerList)."'";
$html = '<tr><td colspan="2"><table width="100%">';
$html .= '<tr>
<td>
'.$answer.'
</td>
</tr></table></td></tr>';
$js .= 'questions_answers['.$this->questionJSId.'] = new Array('.$answerList.');'."\n";
$js .= 'questions_answers_correct['.$this->questionJSId.'] = new Array('.$wordList.');'."\n";
$js .= 'questions_types['.$this->questionJSId.'] = \'fib\';'."\n";
$js .= $jstmpw;
return [$js, $html];
}
}

@ -0,0 +1,100 @@
<?php
/* For licensing terms, see /license.txt */
/**
* This class handles the SCORM export of matching questions.
*
* @package chamilo.exercise.scorm
*/
class ScormAnswerMatching extends Answer
{
/**
* Export the question part as a matrix-choice, with only one possible answer per line.
*
* @author Amand Tihon <amand@alrj.org>
*/
public function export()
{
$js = '';
// prepare list of right proposition to allow
// - easiest display
// - easiest randomisation if needed one day
// (here I use array_values to change array keys from $code1 $code2 ... to 0 1 ...)
// get max length of displayed array
$nbrAnswers = $this->selectNbrAnswers();
$counter = 1;
$questionId = $this->questionJSId;
$jstmpw = 'questions_answers_ponderation['.$questionId.'] = new Array();'."\n";
$jstmpw .= 'questions_answers_ponderation['.$questionId.'][0] = 0;'."\n";
// Options (A, B, C, ...) that will be put into the list-box
$options = [];
$letter = 'A';
for ($answerId = 1; $answerId <= $nbrAnswers; $answerId++) {
$answerCorrect = $this->isCorrect($answerId);
$answer = $this->selectAnswer($answerId);
$realAnswerId = $this->selectAutoId($answerId);
if (!$answerCorrect) {
$options[$realAnswerId]['Lettre'] = $letter;
// answers that will be shown at the right side
$options[$realAnswerId]['Reponse'] = $answer;
$letter++;
}
}
$html = [];
$jstmp = '';
$jstmpc = '';
// Answers
for ($answerId = 1; $answerId <= $nbrAnswers; $answerId++) {
$identifier = 'question_'.$questionId.'_matching_';
$answer = $this->selectAnswer($answerId);
$answerCorrect = $this->isCorrect($answerId);
$weight = $this->selectWeighting($answerId);
$jstmp .= $answerId.',';
if ($answerCorrect) {
$html[] = '<tr class="option_row">';
//$html[] = '<td width="40%" valign="top"><b>'.$counter.'</b>.&nbsp;'.$answer."</td>";
$html[] = '<td width="40%" valign="top">&nbsp;'.$answer."</td>";
$html[] = '<td width="20%" align="center">&nbsp;&nbsp;';
$html[] = '<select name="'.$identifier.$counter.'" id="'.$identifier.$counter.'">';
$html[] = ' <option value="0">--</option>';
// fills the list-box
foreach ($options as $key => $val) {
$html[] = '<option value="'.$key.'">'.$val['Lettre'].'</option>';
}
$html[] = '</select>&nbsp;&nbsp;</td>';
$html[] = '<td width="40%" valign="top">';
foreach ($options as $key => $val) {
$html[] = '<b>'.$val['Lettre'].'.</b> '.$val['Reponse'].'<br />';
}
$html[] = '</td></tr>';
$jstmpc .= '['.$answerCorrect.','.$counter.'],';
$myWeight = explode('@', $weight);
if (count($myWeight) == 2) {
$weight = $myWeight[0];
} else {
$weight = $myWeight[0];
}
$jstmpw .= 'questions_answers_ponderation['.$questionId.']['.$counter.'] = '.$weight.";\n";
$counter++;
}
}
$js .= 'questions_answers['.$questionId.'] = new Array('.substr($jstmp, 0, -1).');'."\n";
$js .= 'questions_answers_correct['.$questionId.'] = new Array('.substr($jstmpc, 0, -1).');'."\n";
$js .= 'questions_types['.$questionId.'] = \'matching\';'."\n";
$js .= $jstmpw;
$htmlResult = '<tr><td colspan="2"><table id="question_'.$questionId.'" width="100%">';
$htmlResult .= implode("\n", $html);
$htmlResult .= '</table></td></tr>'."\n";
return [$js, $htmlResult];
}
}

@ -0,0 +1,119 @@
<?php
/* For licensing terms, see /license.txt */
/**
* This class handles the export to SCORM of a multiple choice question
* (be it single answer or multiple answers).
*
* @package chamilo.exercise.scorm
*/
class ScormAnswerMultipleChoice extends Answer
{
/**
* Return HTML code for possible answers.
*/
public function export()
{
$js = [];
$type = $this->getQuestionType();
$questionId = $this->questionJSId;
$jstmpw = 'questions_answers_ponderation['.$questionId.'] = new Array();';
$jstmpw .= 'questions_answers_ponderation['.$questionId.'][0] = 0;';
$jstmpw .= 'questions_answers_correct['.$questionId.'] = new Array();';
$html = [];
//not sure if we are going to export also the MULTIPLE_ANSWER_COMBINATION to SCORM
//if ($type == MCMA || $type == MULTIPLE_ANSWER_COMBINATION ) {
if ($type == MCMA) {
$id = 1;
$jstmp = '';
$jstmpc = '';
foreach ($this->answer as $i => $answer) {
$identifier = 'question_'.$questionId.'_multiple_'.$i;
$html[] =
'<tr>
<td align="center" width="5%">
<input name="'.$identifier.'" id="'.$identifier.'" value="'.$i.'" type="checkbox" />
</td>
<td width="95%">
<label for="'.$identifier.'">'.Security::remove_XSS($this->answer[$i]).'</label>
</td>
</tr>';
$jstmp .= $i.',';
if ($this->correct[$i]) {
$jstmpc .= $i.',';
}
$jstmpw .= 'questions_answers_ponderation['.$questionId.']['.$i.'] = '.$this->weighting[$i].";";
$jstmpw .= 'questions_answers_correct['.$questionId.']['.$i.'] = '.$this->correct[$i].';';
$id++;
}
$js[] = 'questions_answers['.$questionId.'] = new Array('.substr($jstmp, 0, -1).');'."\n";
$js[] = 'questions_types['.$questionId.'] = \'mcma\';'."\n";
$js[] = $jstmpw;
} elseif ($type == MULTIPLE_ANSWER_COMBINATION) {
$js = '';
$id = 1;
$jstmp = '';
$jstmpc = '';
foreach ($this->answer as $i => $answer) {
$identifier = 'question_'.$questionId.'_exact_'.$i;
$html[] =
'<tr>
<td align="center" width="5%">
<input name="'.$identifier.'" id="'.$identifier.'" value="'.$i.'" type="checkbox" />
</td>
<td width="95%">
<label for="'.$identifier.'">'.Security::remove_XSS($this->answer[$i]).'</label>
</td>
</tr>';
$jstmp .= $i.',';
if ($this->correct[$i]) {
$jstmpc .= $i.',';
}
$jstmpw .= 'questions_answers_ponderation['.$questionId.']['.$i.'] = '.$this->weighting[$i].';';
$jstmpw .= 'questions_answers_correct['.$questionId.']['.$i.'] = '.$this->correct[$i].';';
$id++;
}
$js[] = 'questions_answers['.$questionId.'] = new Array('.substr($jstmp, 0, -1).');';
$js[] = 'questions_types['.$questionId.'] = "exact";';
$js[] = $jstmpw;
} else {
$id = 1;
$jstmp = '';
$jstmpc = '';
foreach ($this->answer as $i => $answer) {
$identifier = 'question_'.$questionId.'_unique_'.$i;
$identifier_name = 'question_'.$questionId.'_unique_answer';
$html[] =
'<tr>
<td align="center" width="5%">
<input name="'.$identifier_name.'" id="'.$identifier.'" value="'.$i.'" type="checkbox"/>
</td>
<td width="95%">
<label for="'.$identifier.'">'.Security::remove_XSS($this->answer[$i]).'</label>
</td>
</tr>';
$jstmp .= $i.',';
if ($this->correct[$i]) {
$jstmpc .= $i;
}
$jstmpw .= 'questions_answers_ponderation['.$questionId.']['.$i.'] = '.$this->weighting[$i].';';
$jstmpw .= 'questions_answers_correct['.$questionId.']['.$i.'] = '.$this->correct[$i].';';
$id++;
}
$js[] = 'questions_answers['.$questionId.'] = new Array('.substr($jstmp, 0, -1).');';
$js[] = 'questions_types['.$questionId.'] = \'mcua\';';
$js[] = $jstmpw;
}
$htmlResult = '<tr><td colspan="2"><table id="question_'.$questionId.'" width="100%">';
$htmlResult .= implode("\n", $html);
$htmlResult .= '</table></td></tr>';
$js = implode("\n", $js);
return [$js, $htmlResult];
}
}

@ -0,0 +1,56 @@
<?php
/* For licensing terms, see /license.txt */
/**
* This class handles the SCORM export of true/false questions.
*
* @package chamilo.exercise.scorm
*/
class ScormAnswerTrueFalse extends Answer
{
/**
* Return the XML flow for the possible answers.
* That's one <response_lid>, containing several <flow_label>.
*
* @author Amand Tihon <amand@alrj.org>
*/
public function export()
{
$js = '';
$html = '<tr><td colspan="2"><table width="100%">';
$identifier = 'question_'.$this->questionJSId.'_tf';
$identifier_true = $identifier.'_true';
$identifier_false = $identifier.'_false';
$html .=
'<tr>
<td align="center" width="5%">
<input name="'.$identifier_true.'" id="'.$identifier_true.'" value="'.$this->trueGrade.'" type="radio" />
</td>
<td width="95%">
<label for="'.$identifier_true.'">'.get_lang('True').'</label>
</td>
</tr>';
$html .=
'<tr>
<td align="center" width="5%">
<input name="'.$identifier_false.'" id="'.$identifier_false.'" value="'.$this->falseGrade.'" type="radio" />
</td>
<td width="95%">
<label for="'.$identifier_false.'">'.get_lang('False').'</label>
</td>
</tr></table></td></tr>';
$js .= 'questions_answers['.$this->questionJSId.'] = new Array(\'true\',\'false\');'."\n";
$js .= 'questions_types['.$this->questionJSId.'] = \'tf\';'."\n";
if ($this->response === 'TRUE') {
$js .= 'questions_answers_correct['.$this->questionJSId.'] = new Array(\'true\');'."\n";
} else {
$js .= 'questions_answers_correct['.$this->questionJSId.'] = new Array(\'false\');'."\n";
}
$jstmpw = 'questions_answers_ponderation['.$this->questionJSId.'] = new Array();'."\n";
$jstmpw .= 'questions_answers_ponderation['.$this->questionJSId.'][0] = 0;'."\n";
$jstmpw .= 'questions_answers_ponderation['.$this->questionJSId.'][1] = '.$this->weighting[1].";\n";
$js .= $jstmpw;
return [$js, $html];
}
}

@ -0,0 +1,184 @@
<?php
/* For licensing terms, see /license.txt */
/**
* A SCORM item. It corresponds to a single question.
* This class allows export from Chamilo SCORM 1.2 format of a single question.
* It is not usable as-is, but must be subclassed, to support different kinds of questions.
*
* Every start_*() and corresponding end_*(), as well as export_*() methods return a string.
*
* Attached files are NOT exported.
*
* @package chamilo.exercise.scorm
*/
class ScormAssessmentItem
{
public $question;
public $question_ident;
public $answer;
/**
* Constructor.
*
* @param ScormQuestion $question the Question object we want to export
*/
public function __construct($question)
{
$this->question = $question;
$this->question->setAnswer();
$this->questionIdent = 'QST_'.$question->id;
}
/**
* Start the XML flow.
*
* This opens the <item> block, with correct attributes.
*/
public function start_page()
{
$head = '';
/*if ($this->standalone) {
$charset = 'UTF-8';
$head = '<?xml version="1.0" encoding="'.$charset.'" standalone="no"?>';
$head .= '<html>';
}*/
return $head;
}
/**
* End the XML flow, closing the </item> tag.
*/
public function end_page()
{
/*if ($this->standalone) {
return '</html>';
}*/
return '';
}
/**
* Start document header.
*/
public function start_header()
{
/*if ($this->standalone) {
return '<head>';
}*/
return '';
}
/**
* Print CSS inclusion.
*/
public function css()
{
$css = '';
// if ($this->standalone) {
// $css = '<style type="text/css" media="screen, projection">';
// $css .= '/*<![CDATA[*/'."\n";
// $css .= '/*]]>*/'."\n";
// $css .= '</style>'."\n";
// $css .= '<style type="text/css" media="print">';
// $css .= '/*<![CDATA[*/'."\n";
// $css .= '/*]]>*/'."\n";
// $css .= '</style>';
// }
return $css;
}
/**
* End document header.
*/
public function end_header()
{
// if ($this->standalone) {
// return '</head>';
// }
return '';
}
/**
* Start the itemBody.
*/
public function start_js()
{
$js = '<script type="text/javascript" src="assets/api_wrapper.js"></script>';
// if ($this->standalone) {
// return '<script>';
// }
return $js;
}
/**
* End the itemBody part.
*/
public function end_js()
{
/*if ($this->standalone) {
return '</script>';
}*/
return '';
}
/**
* Start the itemBody.
*/
public function start_body()
{
/*if ($this->standalone) {
return '<body><form id="dokeos_scorm_form" method="post" action="">';
}*/
return '';
}
/**
* End the itemBody part.
*/
public function end_body()
{
/*if ($this->standalone) {
return '<br /><input class="btn" type="button" id="dokeos_scorm_submit" name="dokeos_scorm_submit" value="OK" /></form></body>';
}*/
return '';
}
/**
* Export the question as a SCORM Item.
* This is a default behaviour, some classes may want to override this.
*
* @return string|array a string, the XML flow for an Item
*/
public function export()
{
list($js, $html) = $this->question->export();
/*if ($this->standalone) {
$res = $this->start_page()
.$this->start_header()
.$this->css()
.$this->start_js()
.$this->common_js()
.$js
.$this->end_js()
.$this->end_header()
.$this->start_body()
.$html
.$this->end_body()
.$this->end_page();
return $res;
} else {
return [$js, $html];
}*/
return [$js, $html];
}
}

@ -0,0 +1,221 @@
<?php
/* For licensing terms, see /license.txt */
use Chamilo\CourseBundle\Entity\CQuiz;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
/**
* This class represents an entire exercise to be exported in SCORM.
* It will be represented by a single <section> containing several <item>.
*
* Some properties cannot be exported, as SCORM does not support them :
* - type (one page or multiple pages)
* - start_date and end_date
* - max_attempts
* - show_answer
* - anonymous_attempts
*
* @author Julio Montoya
* @author Amand Tihon <amand@alrj.org>
*
* @package chamilo.exercise.scorm
*/
class ScormExercise
{
public $exercise;
public $standalone;
/**
* ScormExercise constructor.
*
* @param Exercise $exe
* @param bool $standalone
*/
public function __construct($exe, $standalone)
{
$this->exercise = $exe;
$this->standalone = $standalone;
}
/**
* Start the XML flow.
*
* This opens the <item> block, with correct attributes.
*/
public function startPage()
{
$charset = 'UTF-8';
$head = '<?xml version="1.0" encoding="'.$charset.'" standalone="no"?><html>';
return $head;
}
/**
* End the XML flow, closing the </item> tag.
*/
public function end_page()
{
return '</html>';
}
/**
* Start document header.
*/
public function start_header()
{
return '<head>';
}
/**
* Common JS functions.
*/
public function common_js()
{
$js = file_get_contents(api_get_path(SYS_CODE_PATH).'exercise/export/scorm/common.js');
return $js."\n";
}
/**
* End the itemBody part.
*/
public function end_js()
{
return '</script>';
}
/**
* Start the itemBody.
*/
public function start_body()
{
return '<body>'.
'<h1>'.$this->exercise->selectTitle().'</h1><p>'.$this->exercise->selectDescription()."</p>".
'<form id="chamilo_scorm_form" method="post" action="">'.
'<table width="100%">';
}
/**
* End the itemBody part.
*/
public function end_body()
{
$button = '<input
id="chamilo_scorm_submit"
class="btn btn-primary"
type="button"
name="chamilo_scorm_submit"
value="OK" />';
return '</table><br />'.$button.'</form></body>';
}
/**
* Export the question as a SCORM Item.
*
* This is a default behaviour, some classes may want to override this.
*
* @param $standalone: Boolean stating if it should be exported as a stand-alone question
*
* @return string string, the XML flow for an Item
*/
public function export()
{
global $charset;
/*$head = '';
if ($this->standalone) {
$head = '<?xml version = "1.0" encoding = "'.$charset.'" standalone = "no"?>'."\n"
.'<!DOCTYPE questestinterop SYSTEM "ims_qtiasiv2p1.dtd">'."\n";
}*/
list($js, $html) = $this->exportQuestions();
$res = $this->startPage()
.$this->start_header()
.$this->css()
.$this->globalAssets()
.$this->start_js()
.$this->common_js()
.$js
.$this->end_js()
.$this->end_header()
.$this->start_body()
.$html
.$this->end_body()
.$this->end_page();
return $res;
}
/**
* Export the questions, as a succession of <items>.
*
* @author Amand Tihon <amand@alrj.org>
*/
public function exportQuestions()
{
$js = $html = '';
$encoders = [new JsonEncoder()];
$normalizers = [new ObjectNormalizer()];
$em = Database::getManager();
// Export cquiz data
/** @var CQuiz $exercise */
$exercise = $em->find('ChamiloCourseBundle:CQuiz', $this->exercise->iId);
$exercise->setDescription('');
$exercise->setTextWhenFinished('');
$serializer = new Serializer($normalizers, $encoders);
$jsonContent = $serializer->serialize($exercise, 'json');
$js .= "var exerciseInfo = JSON.parse('".$jsonContent."');\n";
$counter = 0;
$scormQuestion = new ScormQuestion();
foreach ($this->exercise->selectQuestionList() as $q) {
list($jstmp, $htmltmp) = $scormQuestion->exportQuestionToScorm($q, $counter);
$js .= $jstmp."\n";
$html .= $htmltmp."\n";
$counter++;
}
return [$js, $html];
}
/**
* Print CSS inclusion.
*/
private function css()
{
return '';
}
/**
* End document header.
*/
private function end_header()
{
return '</head>';
}
/**
* Start the itemBody.
*/
private function start_js()
{
return '<script>';
}
/**
* @return string
*/
private function globalAssets()
{
$assets = '<script type="text/javascript" src="assets/jquery/jquery.min.js"></script>'."\n";
$assets .= '<script type="text/javascript" src="assets/api_wrapper.js"></script>'."\n";
$assets .= '<link href="assets/bootstrap/bootstrap.min.css" rel="stylesheet" media="screen" type="text/css" />';
return $assets;
}
}

@ -0,0 +1,223 @@
<?php
/* For licensing terms, see /license.txt */
/**
* The ScormQuestion class is a gateway to getting the answers exported
* (the question is just an HTML text, while the answers are the most important).
* It is important to note that the SCORM export process is done in two parts.
* First, the HTML part (which is the presentation), and second the JavaScript
* part (the process).
* The two bits are separate to allow for a one-big-javascript and a one-big-html
* files to be built. Each export function thus returns an array of HTML+JS.
*
*
* @author Claro Team <cvs@claroline.net>
* @author Yannick Warnier <yannick.warnier@beeznest.com>
*
* @package chamilo.exercise.scorm
*/
class ScormQuestion extends Question
{
public $js_id;
public $answer;
/**
* ScormQuestion constructor.
*/
public function __construct()
{
parent::__construct();
}
/**
* Returns the HTML + JS flow corresponding to one question.
*
* @param int $questionId The question ID
* @param bool $standalone (ie including XML tag, DTD declaration, etc)
* @param int $jsId The JavaScript ID for this question.
* Due to the nature of interactions, we must have a natural sequence for
* questions in the generated JavaScript.
*
* @return string|array
*/
public function exportQuestionToScorm(
$questionId,
$jsId
) {
$question = self::read($questionId);
if (!$question) {
return '';
}
$this->id = $question->id;
$this->js_id = $jsId;
$this->type = $question->type;
$this->question = $question->question;
$this->description = $question->description;
$this->weighting = $question->weighting;
$this->position = $question->position;
$this->picture = $question->picture;
$assessmentItem = new ScormAssessmentItem($this);
return $assessmentItem->export();
}
/**
* Include the correct answer class and create answer.
*/
public function setAnswer()
{
switch ($this->type) {
case MCUA:
$this->answer = new ScormAnswerMultipleChoice($this->id);
$this->answer->questionJSId = $this->js_id;
break;
case MCMA:
case GLOBAL_MULTIPLE_ANSWER:
$this->answer = new ScormAnswerMultipleChoice($this->id);
$this->answer->questionJSId = $this->js_id;
break;
case TF:
$this->answer = new ScormAnswerTrueFalse($this->id);
$this->answer->questionJSId = $this->js_id;
break;
case FIB:
$this->answer = new ScormAnswerFillInBlanks($this->id);
$this->answer->questionJSId = $this->js_id;
break;
case MATCHING:
case MATCHING_DRAGGABLE:
case DRAGGABLE:
$this->answer = new ScormAnswerMatching($this->id);
$this->answer->questionJSId = $this->js_id;
break;
case ORAL_EXPRESSION:
case FREE_ANSWER:
$this->answer = new ScormAnswerFree($this->id);
$this->answer->questionJSId = $this->js_id;
break;
case HOT_SPOT:
$this->answer = new ScormAnswerHotspot($this->id);
$this->answer->questionJSId = $this->js_id;
break;
case MULTIPLE_ANSWER_COMBINATION:
$this->answer = new ScormAnswerMultipleChoice($this->id);
$this->answer->questionJSId = $this->js_id;
break;
case HOT_SPOT_ORDER:
$this->answer = new ScormAnswerHotspot($this->id);
$this->answer->questionJSId = $this->js_id;
break;
case HOT_SPOT_DELINEATION:
$this->answer = new ScormAnswerHotspot($this->id);
$this->answer->questionJSId = $this->js_id;
break;
// not supported
case UNIQUE_ANSWER_NO_OPTION:
case MULTIPLE_ANSWER_TRUE_FALSE:
case MULTIPLE_ANSWER_COMBINATION_TRUE_FALSE:
case UNIQUE_ANSWER_IMAGE:
case CALCULATED_ANSWER:
$this->answer = new ScormAnswerMultipleChoice($this->id);
$this->answer->questionJSId = $this->js_id;
break;
default:
$this->answer = new stdClass();
$this->answer->questionJSId = $this->js_id;
break;
}
return true;
}
/**
* @throws Exception
*
* @return array
*/
public function export()
{
$html = $this->getQuestionHTML();
$js = $this->getQuestionJS();
if (is_object($this->answer) && $this->answer instanceof Answer) {
list($js2, $html2) = $this->answer->export();
$js .= $js2;
$html .= $html2;
} else {
throw new \Exception('Question not supported. Exercise: '.$this->selectTitle());
}
return [$js, $html];
}
/**
* {@inheritdoc}
*/
public function createAnswersForm($form)
{
return true;
}
/**
* {@inheritdoc}
*/
public function processAnswersCreation($form, $exercise)
{
return true;
}
/**
* Returns an HTML-formatted question.
*/
public function getQuestionHTML()
{
$title = $this->selectTitle();
$description = $this->selectDescription();
$cols = 2;
$s = '<tr>
<td colspan="'.$cols.'" id="question_'.$this->id.'_title" valign="middle" style="background-color:#d6d6d6;">
'.$title.'
</td>
</tr>
<tr>
<td valign="top" colspan="'.$cols.'">
<i>'.$description.'</i>
</td>
</tr>';
return $s;
}
/**
* Return the JavaScript code bound to the question.
*/
public function getQuestionJS()
{
$weight = $this->selectWeighting();
$js = '
questions.push('.$this->js_id.');
$(document).ready(function() {
if (exerciseInfo.randomAnswers == true) {
$("#question_'.$this->js_id.'").shuffleRows();
}
});';
$js .= "\n";
switch ($this->type) {
case ORAL_EXPRESSION:
/*$script = file_get_contents(api_get_path(LIBRARY_PATH) . 'javascript/rtc/RecordRTC.js');
$script .= file_get_contents(api_get_path(LIBRARY_PATH) . 'wami-recorder/recorder.js');
$script .= file_get_contents(api_get_path(LIBRARY_PATH) . 'wami-recorder/gui.js');
$js .= $script;*/
break;
case HOT_SPOT:
//put the max score to 0 to avoid discounting the points of
//non-exported quiz types in the SCORM
$weight = 0;
break;
}
$js .= 'questions_score_max['.$this->js_id.'] = '.$weight.";";
return $js;
}
}

@ -0,0 +1,25 @@
var questions = new Array();
var questions_answers = new Array();
var questions_answers_correct = new Array();
var questions_types = new Array();
var questions_score_max = new Array();
var questions_answers_ponderation = new Array();
/**
* Adds the event listener
*/
function addListeners(e) {
loadPage();
var myButton = document.getElementById('chamilo_scorm_submit');
addEvent(myButton, 'click', doQuit, false);
addEvent(myButton, 'click', disableButton, false);
addEvent(window, 'unload', unloadPage, false);
}
/** Disables the submit button on SCORM result submission **/
function disableButton() {
var mybtn = document.getElementById('chamilo_scorm_submit');
mybtn.setAttribute('disabled', 'disabled');
}
addEvent(window,'load', addListeners, false);

File diff suppressed because it is too large Load Diff

@ -0,0 +1,27 @@
<?php
/* For licensing terms, see /license.txt */
/**
* Responses to AJAX calls.
*/
require_once __DIR__.'/../global.inc.php';
$action = isset($_REQUEST['a']) ? $_REQUEST['a'] : '';
$isAllowedToEdit = api_is_allowed_to_edit();
switch ($action) {
case 'delete_user_in_usergroup':
if ($isAllowedToEdit) {
$userGroup = new UserGroup();
$userId = isset($_REQUEST['id']) ? $_REQUEST['id'] : 0;
$userIdList = explode(',', $userId);
$groupId = isset($_REQUEST['group_id']) ? $_REQUEST['group_id'] : 0;
foreach ($userIdList as $userId) {
$userGroup->delete_user_rel_group($userId, $groupId);
}
}
break;
default:
echo '';
break;
}
exit;

@ -0,0 +1,37 @@
<?php
/* For licensing terms, see /license.txt */
/**
* Class HookCreateCourse.
*/
class HookCreateCourse extends HookEvent implements HookCreateCourseEventInterface
{
/**
* HookCreateCourse constructor.
*
* @throws Exception
*/
protected function __construct()
{
parent::__construct('HookCreateCourse');
}
/**
* Update all the observers.
*
* @param int $type
*
* @return int
*/
public function notifyCreateCourse($type)
{
$this->eventData['type'] = $type;
/** @var HookCreateCourseObserverInterface $observer */
foreach ($this->observers as $observer) {
$observer->hookCreateCourse($this);
}
return 1;
}
}

@ -0,0 +1,23 @@
<?php
/* For licensing terms, see /license.txt */
/**
* This file contains all Hook interfaces and their relation.
* They are used for Hook classes.
*
* @package chamilo.library.hook
*/
/**
* Interface HookCreateUserEventInterface.
*/
interface HookCreateCourseEventInterface extends HookEventInterface
{
/**
* Update all the observers.
*
* @param int $type
*
* @return int
*/
public function notifyCreateCourse($type);
}

@ -0,0 +1,21 @@
<?php
/* For licensing terms, see /license.txt */
/**
* This file contains all Hook interfaces and their relation.
* They are used for Hook classes.
*
* @package chamilo.library.hook
*/
/**
* Interface CreateUserHookInterface.
*/
interface HookCreateCourseObserverInterface extends HookObserverInterface
{
/**
* @param HookCreateCourseEventInterface $hook
*
* @return int
*/
public function hookCreateCourse(HookCreateCourseEventInterface $hook);
}

@ -1,553 +0,0 @@
/**
* JavaScript functions to handle standard behaviors of a QuickForm advmultiselect element
*
* @category HTML
* @package HTML_QuickForm_advmultiselect
* @author Laurent Laville <pear@laurent-laville.org>
* @copyright 2007-2009 Laurent Laville
* @license http://www.opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: qfamsHandler.js,v 1.13 2009/02/06 09:49:22 farell Exp $
* @since File available since Release 1.3.0
*/
if (typeof QFAMS === "undefined" || !QFAMS) {
/**
* The QFAMS global namespace object. If QFAMS is already defined, the
* existing QFAMS object will not be overwritten so that defined
* namespaces are preserved.
* @class QFAMS
* @static
* @public
* @since 1.5.0
*/
var QFAMS = {};
}
/**
* QFAMS.env is used to keep track of end-user preferences
* for persistant values.
*
* @class QFAMS.env
* @static
*/
QFAMS.env = QFAMS.env || {
/**
* Keeps the persistant selection preference when items are selected or unselected
*
* @property persistantSelection
* @type Boolean
*/
persistantSelection: false,
/**
* Keeps the persistant selection preference when items are moved up or down
*
* @property persistantMove
* @type Boolean
*/
persistantMove: true
};
/**
* Uses QFAMS.updateCounter as a
* text tools to replace all childs of 'c' element by a new text node of 'v' value
*
* @param dom element c html element; <span> is best use in most case
* @param string v new counter value
*
* @method updateCounter
* @static
* @return void
* @public
* @since 1.5.0
*/
QFAMS.updateCounter = function (c, v) {
var i;
var nodeText = null;
if (c !== null) {
// remove all previous child nodes of 'c' element
if (c.childNodes) {
for (i = 0; i < c.childNodes.length; i++) {
c.removeChild(c.childNodes[i]);
}
}
// add new text value 'v'
nodeText = document.createTextNode(v);
c.appendChild(nodeText);
}
};
/**
* Uses QFAMS.updateLiveCounter as a
* standard onclick event handler to dynamic change value of counter
* that display current selection
*
* @method updateLiveCounter
* @static
* @return void
* @private
* @since 1.5.0
*/
QFAMS.updateLiveCounter = function () {
var lbl = this.parentNode;
var selectedCount = 0;
// Find all the checkboxes...
var div = lbl.parentNode;
var inputs = div.getElementsByTagName('input');
for (var i = 0; i < inputs.length; i++) {
if (inputs[i].checked == 1) {
selectedCount++;
}
}
var e = div.id;
var qfamsName = e.substring(e.indexOf('_', 0) + 1, e.length);
// updates item count
var span = document.getElementById(qfamsName + '_selected');
QFAMS.updateCounter(span, selectedCount + '/' + inputs.length);
};
/**
* Uses QFAMS.editSelection
* in single select box mode, to edit current selection and update live counter
*
* @param string qfamsName QuickForm advmultiselect element name
* @param integer selectMode Selection mode (0 = uncheck, 1 = check, 2 = toggle)
*
* @method editSelection
* @static
* @return void
* @public
* @since 1.5.0
*/
QFAMS.editSelection = function (qfamsName, selectMode) {
if (selectMode !== 0 && selectMode !== 1 && selectMode !== 2) {
return;
}
var selectedCount = 0;
// Find all the checkboxes...
var ams = document.getElementById('qfams_' + qfamsName);
var inputs = ams.getElementsByTagName('input');
// Loop through all checkboxes (input element)
for (var i = 0; i < inputs.length; i++) {
if (selectMode === 2) {
if (inputs[i].checked == 0) {
inputs[i].checked = 1;
} else if (inputs[i].checked == 1) {
inputs[i].checked = 0;
}
} else {
inputs[i].checked = selectMode;
}
if (inputs[i].checked == 1) {
selectedCount++;
}
}
// updates selected item count
var span = document.getElementById(qfamsName + '_selected');
QFAMS.updateCounter(span, selectedCount + '/' + inputs.length);
};
/**
* Uses QFAMS.moveSelection
* in double select box mode, to move current selection and update live counter
*
* @param string qfamsName QuickForm advmultiselect element name
* @param dom element selectLeft Data source list
* @param dom element selectRight Target data list
* @param dom element selectHidden Full data source (selected, unselected)
* private usage
* @param string action Action name (add, remove, all, none, toggle)
* @param string arrange Sort option (none, asc, desc)
*
* @method moveSelection
* @static
* @return void
* @public
* @since 1.5.0
*/
QFAMS.moveSelection = function (qfamsName, selectLeft, selectRight, selectHidden, action, arrange) {
var isIE = /*@cc_on!@*/false; //IE detector
var source = null;
var target = null;
var option;
var c = null;
var s = null;
var i;
var maxFrom, maxTo;
if (action === 'add' || action === 'all' || action === 'toggle') {
source = selectLeft;
target = selectRight;
} else {
source = selectRight;
target = selectLeft;
}
// Don't do anything if nothing selected. Otherwise we throw javascript errors.
if (source.selectedIndex === -1 && (action === 'add' || action === 'remove')) {
return;
}
maxFrom = source.options.length;
maxTo = target.options.length;
// check if target list is empty and remove fake empty option (tip to be XHTML compliant)
if (maxTo > 0 && target.options[0].value === "") {
target.removeAttribute("disabled");
target.options[0] = null;
}
// Add items to the 'TO' list.
for (i = (maxFrom - 1); i >= 0; i--) {
if (action === 'all' || action === 'none' || action === 'toggle' || source.options[i].selected === true) {
if (source.options[i].disabled === false) {
if (isIE) {
option = source.options[i].removeNode(true);
option.selected = QFAMS.env.persistantSelection;
target.appendChild(option);
} else {
option = source.options[i].cloneNode(true);
option.selected = QFAMS.env.persistantSelection;
target.options[target.options.length] = option;
}
}
}
}
// Remove items from the 'FROM' list.
if (!isIE) {
for (i = (maxFrom - 1); i >= 0; i--) {
if (action === 'all' || action === 'none' || action === 'toggle' || source.options[i].selected === true) {
if (source.options[i].disabled === false) {
source.options[i] = null;
}
}
}
}
// Add items to the 'FROM' list for toggle function
if (action === 'toggle') {
for (i = (maxTo - 1); i >= 0; i--) {
if (target.options[i].disabled === false) {
if (isIE) {
option = target.options[i].removeNode(true);
option.selected = QFAMS.env.persistantSelection;
source.appendChild(option);
} else {
option = target.options[i].cloneNode(true);
option.selected = QFAMS.env.persistantSelection;
source.options[source.options.length] = option;
}
}
}
if (!isIE) {
for (i = (maxTo - 1); i >= 0; i--) {
if (target.options[i].disabled === false) {
target.options[i] = null;
}
}
}
}
// updates unselected item count
c = document.getElementById(qfamsName + '_unselected');
s = document.getElementById(qfamsName + '-f');
QFAMS.updateCounter(c, s.length);
// updates selected item count
c = document.getElementById(qfamsName + '_selected');
s = document.getElementById(qfamsName + '-t');
QFAMS.updateCounter(c, s.length);
// Sort list if required
if (arrange !== 'none') {
QFAMS.sortList(target, QFAMS.compareText, arrange);
}
// Set the appropriate items as 'selected in the hidden select.
// These are the values that will actually be posted with the form.
QFAMS.updateHidden(selectHidden, selectRight);
// Order alphabetically
//var sourceId = $(source).attr('id');
var targetId = $(target).attr('id');
var options = $('#' + targetId +' option');
var arr = options.map(function(_, o) { return { t: $(o).text(), v: o.value }; }).get();
arr.sort(function (o1, o2) {
//return o1.t > o2.t ? 1 : o1.t < o2.t ? -1 : 0;
// Ignore case
var t1 = o1.t.toLowerCase(), t2 = o2.t.toLowerCase();
return t1 > t2 ? 1 : t1 < t2 ? -1 : 0;
});
options.each(function(i, o) {
o.value = arr[i].v;
$(o).text(arr[i].t);
});
};
/**
* Uses QFAMS.sortList to
* sort selection list if option is given in HTML_QuickForm_advmultiselect class constructor
*
* @param dom element list Selection data list
* @param prototype compareFunction to sort each element of a list
* @param string arrange Sort option (none, asc, desc)
*
* @method sortList
* @static
* @return void
* @private
* @since 1.5.0
*/
QFAMS.sortList = function (list, compareFunction, arrange)
{
var i;
var options = new Array(list.options.length);
for (i = 0; i < options.length; i++) {
options[i] = new Option(list.options[i].text,
list.options[i].value,
list.options[i].defaultSelected,
list.options[i].selected);
}
options.sort(compareFunction);
if (arrange === 'desc') {
options.reverse();
}
list.options.length = 0;
for (i = 0; i < options.length; i++) {
list.options[i] = options[i];
}
};
/**
* QFAMS.compareText
* is a callback function to sort each element of two lists A and B
*
* @param string option1 single element of list A
* @param string option2 single element of list B
*
* @method compareText
* @static
* @return integer -1 if option1 is less than option2,
* 0 if option1 is equal to option2
* 1 if option1 is greater than option2
* @private
* @since 1.5.0
*/
QFAMS.compareText = function (option1, option2) {
if (option1.text === option2.text) {
return 0;
}
return option1.text < option2.text ? -1 : 1;
};
/**
* QFAMS.updateHidden
* updates the private list that handle selection of all elements (selected and unselected)
*
* @param dom element h hidden list (contains all elements)
* @param dom element r selection list (contains only elements selected)
*
* @method updateHidden
* @static
* @return void
* @private
* @since 1.5.0
*/
QFAMS.updateHidden = function (h, r) {
var i;
for (i = 0; i < h.length; i++) {
h.options[i].selected = false;
}
for (i = 0; i < r.length; i++) {
h.options[h.length] = new Option(r.options[i].text, r.options[i].value);
h.options[h.length - 1].selected = true;
}
};
/**
* With QFAMS.moveUp
* end-user may arrange and element up to the selection list
*
* @param dom element l selection list (contains only elements selected)
* @param dom element h hidden list (contains all elements)
*
* @method moveUp
* @static
* @return void
* @public
* @since 1.5.0
*/
QFAMS.moveUp = function (l, h) {
var indice = l.selectedIndex;
if (indice < 0) {
return;
}
if (indice > 0) {
QFAMS.moveSwap(l, indice, indice - 1);
QFAMS.updateHidden(h, l);
}
};
/**
* With QFAMS.moveDown
* end-user may arrange and element down to the selection list
*
* @param dom element l selection list (contains only elements selected)
* @param dom element h hidden list (contains all elements)
*
* @method moveDown
* @static
* @return void
* @public
* @since 1.5.0
*/
QFAMS.moveDown = function (l, h) {
var indice = l.selectedIndex;
if (indice < 0) {
return;
}
if (indice < l.options.length - 1) {
QFAMS.moveSwap(l, indice, indice + 1);
QFAMS.updateHidden(h, l);
}
};
/**
* With QFAMS.moveTop
* end-user may arrange and element up to the top of selection list
*
* @param dom element l selection list (contains only elements selected)
* @param dom element h hidden list (contains all elements)
*
* @method moveTop
* @static
* @return void
* @public
* @since 1.5.0
*/
QFAMS.moveTop = function (l, h) {
var indice = l.selectedIndex;
if (indice < 0) {
return;
}
while (indice > 0) {
QFAMS.moveSwap(l, indice, indice - 1);
QFAMS.updateHidden(h, l);
indice--;
}
};
/**
* With QFAMS.moveBottom
* end-user may arrange and element down to the bottom of selection list
*
* @param dom element l selection list (contains only elements selected)
* @param dom element h hidden list (contains all elements)
*
* @method moveBottom
* @static
* @return void
* @public
* @since 1.5.0
*/
QFAMS.moveBottom = function (l, h) {
var indice = l.selectedIndex;
if (indice < 0) {
return;
}
while (indice < l.options.length - 1) {
QFAMS.moveSwap(l, indice, indice + 1);
QFAMS.updateHidden(h, l);
indice++;
}
};
/**
* With QFAMS.moveSwap
* end-user may invert two elements position in the selection list
*
* @param dom element l selection list (contains only elements selected)
* @param integer i element source indice
* @param integer j element target indice
*
* @method moveSwap
* @static
* @return void
* @public
* @since 1.5.0
*/
QFAMS.moveSwap = function (l, i, j) {
var node;
node = l.replaceChild(l.options[i], l.options[j]);
if (i > j) {
l.insertBefore(node, l.options[j].nextSibling);
} else {
l.insertBefore(node, l.options[i]);
}
if (QFAMS.env.persistantMove) {
l.selectedIndex = j;
} else {
l.selectedIndex = -1;
}
};
/**
* Uses QFAMS.init to
* initialize onclick event handler for all checkbox element
* of a QuickForm advmultiselect element with single select box.
*
* @method init
* @static
* @return void
* @public
* @since 1.5.0
*/
QFAMS.init = function (elm)
{
var e, i;
for (e = 0; e < elm.length; e++) {
var div = document.getElementById('qfams_' + elm[e]);
if (div !== null) {
var inputs = div.getElementsByTagName('input');
if (inputs !== null) {
for (i = 0; i < inputs.length; i++) {
inputs[i].onclick = QFAMS.updateLiveCounter;
}
}
}
}
};
$(function() {
$('.advmultiselect_checkbox').click(function() {
var id = $(this).attr('id');
var selectName = id + '-f';
var selectId = selectName.replace('_select_all', '');
var selectDestinationId = selectId.replace('-f', '-t');
$('#'+selectDestinationId).prop("disabled", false);
var checked = !$('#'+ id).is(':checked');
if (!checked) {
$('#users-f option').prop('selected', true);
QFAMS.moveSelection('users', this.form.elements['users-f[]'], this.form.elements['users-t[]'], this.form.elements['users[]'], 'add', 'none');
} else {
$('#users-t option').prop('selected', true);
QFAMS.moveSelection('users', this.form.elements['users-f[]'], this.form.elements['users-t[]'], this.form.elements['users[]'], 'remove', 'none');
}
});
});

@ -5468,7 +5468,7 @@ $StartToType = "Comece a digitar, em seguida, clique neste bar para validar tag"
$InstallChamilo = "Instalar Chamilo";
$ChamiloURL = "Chamilo URL";
$YouDoNotHaveAnySessionInItsHistory = "Você não tem sessão na sua história sessões";
$PortalHomepageDefaultIntroduction = "<h2>Parabéns! Você instalou com sucesso seu portal de e-learning!</h2> <p>Você agora pode terminar a instalação seguindo três etapas fáceis:<br /> <ol> <li>Configurar seu portal indo à seção de administração, e selecionando -> <a href=\"main/admin/settings.php\">Configurações gerais do Chamilo</a>.</li> <li>Adicione alguma vida a seu portal criando usuários e/ou cursos. Você pode convidar novas pessoas para criar seus cursos ou criar você mesmo através da seção de <a href=\"main/admin/\">adminitração</a> usuários e cursos.</li> <li>Edite a página inicial do portal através da opção de <a href=\"main/admin/configure_homepage.php\">Edição da Página Inicial</a>.</li> </ol> <p>Você pode sempre encontrar mais informação sobre este software em nosso Web site: <a href=\"http://www.chamilo.org\">http://www.chamilo.org</a>.</p> <p>Divirta-se, e não hesite em juntar-se à comunidade e dar-nos o feedback através de <a href=\"http://www.chamilo.org/forum\">nosso fórum</a>.</p>";
$PortalHomepageDefaultIntroduction = "<h2>Parabéns! Você instalou com sucesso seu portal de e-learning!</h2> <p>Você agora pode terminar a instalação seguindo três etapas fáceis:<br /> <ol> <li>Configurar seu portal indo à seção de administração, e selecionando -> <a href=\"main/admin/settings.php\">Configurações gerais do Chamilo</a>.</li> <li>Adicione alguma vida a seu portal criando usuários e/ou cursos. Você pode convidar novas pessoas para criar seus cursos ou criar você mesmo através da seção de <a href=\"main/admin/\">administração</a> usuários e cursos.</li> <li>Edite a página inicial do portal através da opção de <a href=\"main/admin/configure_homepage.php\">Edição da Página Inicial</a>.</li> </ol> <p>Você pode sempre encontrar mais informação sobre este software em nosso Web site: <a href=\"http://www.chamilo.org\">http://www.chamilo.org</a>.</p> <p>Divirta-se, e não hesite em juntar-se à comunidade e dar-nos o feedback através de <a href=\"http://www.chamilo.org/forum\">nosso fórum</a>.</p>";
$WithTheFollowingSettings = "Com as seguintes configurações:";
$ThePageHasBeenExportedToDocArea = "A página foi exportada para a ferramenta documento";
$TitleColumnGradebook = "Cabeçalho da coluna do relatório de habilidades";
@ -7990,4 +7990,130 @@ $ResetFieldX = "Redefinir %s";
$MyGeneralCertificate = "Meu certificado global";
$ScoreNote = "Pontuação";
$ScoreTest = "Teste";
$MessageTracking = "Rastreamento de mensagens";
$MessagesExchangeBetweenXAndY = "Troca de mensagens entre %s e %s";
$YouWillReceivedASecondEmail = "Você receberá outro e-mail com sua senha";
$YouReceivedAnEmailWithTheUsername = "Você deve ter recebido outro e-mail com seu nome de usuário.";
$TheScormPackageWillBeUpdatedYouMustUploadTheFileWithTheSameName = "Você deve fazer o upload de um arquivo zip com o mesmo nome do arquivo SCORM original.";
$YourChoice = "Sua escolha";
$YouNeedToCreateASkillProfile = "Você precisa criar um perfil de habilidade";
$SkillLevel = "Nível de habilidade";
$Portfolio = "Portfólio";
$AddPortfolioItem = "Adicionar item ao portfólio";
$NewDocumentAddedToCourseX = "Novo documento adicionado ao curso %s";
$DocumentXHasBeenAddedToDocumentInYourCourseXByUserX = "Um novo documento %s foi adicionado à ferramenta de documentos em seu curso %s por %s.";
$PendingSurveys = "Pesquisas pendentes";
$NoPendingSurveys = "Nenhuma pesquisa pendente";
$HottestSessions = "Sessões mais populares";
$LPItemCanBeAccessed = "Item pode ser visto - Pré-requisitos concluídos";
$ItemXBlocksThisElement = "Item %s bloqueia esta etapa";
$YourResultAtXBlocksThisElement = "Seu resultado em %s bloqueia esta etapa";
$RegistrationRoleWhatDoYouWantToDo = "O que você quer fazer?";
$RegistrationRoleFollowCourses = "Siga cursos";
$RegistrationRoleTeachCourses = "Ensine cursos";
$EditPortfolioItem = "Editar item do portfólio";
$PortfolioItemAdded = "Item de portfólio adicionado";
$ExploreMoreCourses = "Explore mais cursos";
$LinksOfInterest = "Links de interesse";
$ExportToChamiloFormat = "Exportar para o formato Chamilo";
$CoursesComingSoon = "Courses coming soon";
$SalePrice = "Preço de venda";
$BuyNow = "compre";
$DocumentGroupCollaborationMode = "Modo de colaboração";
$DocumentGroupReadOnlyMode = "Modo somente leitura";
$GroupDocumentAccess = "Acesso ao documento";
$DocumentGroupShareMode = "Modo de compartilhamento";
$SessionDurationXDaysTotal = "Esta sessão tem uma duração limitada de %s dias";
$LastMonth = "Mês passado";
$ThisMonth = "Este mês";
$PortalUserSessionStats = "Estatísticas da sessão do usuário do portal";
$AddCustomToolsIntro = "Você pode adicionar uma introdução a esta página de ferramentas como um texto auxiliar para seus alunos. Basta clicar no ícone de edição para adicionar algum texto. Este breve texto de informação aqui é invisível para os alunos e você pode deixar este bloco vazio, mas o que você digitará será visível para eles.";
$TheDocumentAutoLaunchSettingIsOnStudentsWillBeRedirectToTheDocumentTool = "A configuração do recurso de início automático do documento está ativada. Os alunos serão redirecionados automaticamente para a ferramenta de documentos.";
$DocumentAutoLaunch = "Lançamento automático para documentos";
$RedirectToTheDocumentList = "Redirecionar para a lista de documentos";
$TheExerciseAutoLaunchSettingIsONStudentsWillBeRedirectToTheExerciseList = "A configuração do recurso de início automático de exercícios está ativada. Os alunos serão automaticamente redirecionados para a lista de exercícios.";
$PostedExpirationDate = "Prazo publicado para envio do trabalho (visível ao aluno)";
$BossAlertMsgSentToUserXTitle = "Mensagem de acompanhamento sobre o aluno %s";
$BossAlertUserXSentMessageToUserYWithLinkZ = "Oi, o
usuário %s enviou uma mensagem de acompanhamento sobre o aluno %s.
A mensagem pode ser vista aqui %s";
$include_services = "Incluir serviços";
$culqi_enable = "Habilitar culqi";
$SelectedUsersDisabled = "Os usuários selecionados foram todos desativados";
$SomeUsersNotDisabled = "Alguns dos usuários selecionados não foram desativados. Recomendamos que você confirme qual, usando a pesquisa avançada.";
$SelectedUsersEnabled = "Os usuários selecionados foram todos habilitados.";
$SomeUsersNotEnabled = "Alguns dos usuários selecionados não foram ativados. Recomendamos que você confirme qual, usando a pesquisa avançada.";
$EncryptedData = "Dados criptografados";
$RandomData = "Dados aleatórios";
$PersonalDataReport = "Dados pessoais";
$ComplexDataNotShown = "Dados complexos (não mostrados)";
$PersonalDataIntroductionTitle = "Dados pessoais: introdução";
$PersonalDataKeptOnYou = "Dados pessoais que mantemos sobre você";
$PersonalDataPermissionsYouGaveUs = "Permissões que você nos deu";
$PersonalDataResponsibleOrganizationTitle = "Organização responsável pelo tratamento de dados";
$PersonalDataTreatmentTitle = "Tratamento de dados pessoais";
$PersonalDataCollectionTitle = "Coleta de dados pessoais";
$PersonalDataRecordingTitle = "Gravação de dados pessoais";
$PersonalDataOrganizationTitle = "Organização de dados pessoais";
$PersonalDataStructureTitle = "Estrutura de dados pessoais";
$PersonalDataConservationTitle = "Conservação de dados pessoais";
$PersonalDataAdaptationTitle = "Adaptação ou modificação de dados pessoais";
$PersonalDataExtractionTitle = "Extração de dados pessoais";
$PersonalDataConsultationTitle = "Consultas de dados pessoais";
$PersonalDataUsageTitle = "Uso de dados pessoais";
$PersonalDataCommunicationTitle = "Comunicação e compartilhamento de dados pessoais";
$PersonalDataInterconnectionTitle = "Interconexão de dados pessoais";
$PersonalDataLimitationTitle = "Limitação de dados pessoais";
$PersonalDataDeletionTitle = "Exclusão de dados pessoais";
$PersonalDataDestructionTitle = "Destruição de dados pessoais";
$PersonalDataProfilingTitle = "Perfil de dados pessoais";
$PersonalDataIntroductionText = "Nós respeitamos sua privacidade! Esta página reúne todos os aspectos dos dados pessoais que podemos estar mantendo em você, como os tratamos, o que você nos autorizou a fazer com eles e quem somos, em um esforço para cumprir a maioria das leis de privacidade de dados disponíveis. Por favor, leia atentamente esta informação e, se tiver alguma questão, verifique os dados de contacto abaixo para nos pedir mais detalhes.";
$YourDegreeOfCertainty = "Seu grau de certeza";
$DegreeOfCertaintyThatMyAnswerIsCorrect = "Grau de certeza de que minha resposta será considerada correta";
$IncorrectAnswersX = "Respostas incorretas: %s";
$KindRegards = "Atenciosamente,";
$DoNotReply = "Por favor, não responda";
$ResultAccomplishedTest = "Resultados para o teste realizado";
$YourResultsByDiscipline = "Seus resultados por disciplina";
$ForComparisonYourLastResultToThisTest = "Em comparação, seus resultados mais recentes para este teste";
$YourOverallResultForTheTest = "Seus resultados gerais para o teste";
$QuestionDegreeCertaintyHTMLMail = "Você encontrará seus resultados para o teste %s abaixo.
Para ver os detalhes destes resultados:
1. Conecte-se à plataforma (login/senha): Para a plataforma.
2. Clique neste link: veja os resultados detalhados.";
$DegreeOfCertaintyVerySure = "Muita certeza";
$DegreeOfCertaintyVerySureDescription = "Sua resposta estava correta e você tinha 80% de certeza sobre isso. Parabéns!";
$DegreeOfCertaintyPrettySure = "Com certeza";
$DegreeOfCertaintyPrettySureDescription = "Sua resposta estava correta, mas você não estava completamente certo (apenas 60% a 70% de certeza)";
$DegreeOfCertaintyDeclaredIgnorance = "Ignorância declarada";
$DegreeOfCertaintyDeclaredIgnoranceDescription = "Você não sabia a resposta - apenas 50% de certeza";
$DegreeOfCertaintyUnsure = "Inseguro";
$DegreeOfCertaintyUnsureDescription = "Sua resposta estava incorreta, mas você adivinhou que era (60% a 70% de certeza)";
$DegreeOfCertaintyVeryUnsure = "Muito inseguro";
$DegreeOfCertaintyVeryUnsureDescription = "Sua resposta estava incorreta, embora você tivesse cerca de 80% (ou mais) de que estava errada";
$DegreeOfCertaintyIDeclareMyIgnorance = "Eu não sei a resposta e escolhi aleatoriamente";
$DegreeOfCertaintyIAmVeryUnsure = "Estou muito inseguro";
$DegreeOfCertaintyIAmUnsure = "Não tenho certeza";
$DegreeOfCertaintyIAmPrettySure = "Eu tenho certeza";
$DegreeOfCertaintyIAmSure = "Tenho quase 100% de certeza";
$DegreeOfCertaintyIAmVerySure = "Tenho certeza absoluta";
$MultipleAnswerTrueFalseDegreeCertainty = "Resposta múltipla verdadeiro/falso/grau de certeza";
$IgnoranceAnswersX = "Ignorância: %s";
$CorrectAnswersX = "Respostas corretas: %s";
$TotalHours = "Total de horas";
$MinutesPerDay = "Minutos por dia";
$ClassroomActivity = "Atividade de sala de aula";
$OneDay = "1 dia";
$UserXAnonymized = "As informações do usuário %s são anonimizadas.";
$CannotAnonymizeUserX = "Não foi possível anonimizar as informações do usuário %s. Por favor, tente novamente ou verifique os registros.";
$NoPermissionToAnonymizeUserX = "Você não tem permissão para anonimizar o usuário %s. Você precisa das mesmas permissões para excluir usuários.";
$Anonymize = "Anonimizar";
$XQuestions = "%d perguntas";
$WebFolderRefreshSucceeded = "Os estilos e recursos na web/pasta foram atualizados.";
$WebFolderRefreshFailed = "Os estilos e recursos na web/pasta não puderam ser atualizados, provavelmente devido a um problema de permissão. Certifique-se de que a web/pasta é gravável pelo seu servidor web.";
$CopyTextToClipboard = "Copiar texto";
?>

@ -2329,7 +2329,7 @@ $GroupDescription = "Beschrijving groep";
$GroupMembers = "Deelnemer(s) van deze groep";
$EditGroup = "Deze groep wijzigen";
$GroupSettingsModified = "Parameters van deze groep zijn gewijzigd.";
$GroupTooMuchMembers = "Het aantal deelnemers overschrijdt het maximumaantal dat u bepaald had. De samenstelling van de groep werd niet gewijzigd. U kan het maximum aantal hieronder wijzigen.";
$GroupTooMuchMembers = "Het aantal deelnemers overschrijdt het maximumaantal dat u bepaald had. De samenstelling van de groep werd niet gewijzigd. U kan het maximum aantal in de groepsinstellingen wijzigen.";
$GroupTutor = "Groepsbegeleider";
$GroupNoTutor = "(geen)";
$GroupNone = "(geen)";

@ -104,7 +104,7 @@ $MultiplicationStar = "Multiplication:\t\t\t*";
$SubstractionMinus = "Substraction:\t\t\t-";
$SummationPlus = "Summation:\t\t\t+";
$NotationList = "Formula notation";
$SubscribeToSessionRequest = "Request for subscription to a session";
$SubscribeToSessionRequest = "Request subscription";
$PleaseSubscribeMeToSession = "Please consider subscribing me to session";
$SearchActiveSessions = "Search active sessions";
$UserNameHasDash = "The username cannot contain the '-' character";
@ -747,7 +747,7 @@ $ToolIntro = "Tool introduction";
$UploadError = "Upload failed, please check maximum file size limits and folder rights.";
$DocumentsWillBeAddedToo = "Documents will be added too";
$ToExportLearnpathWithQuizYouHaveToSelectQuiz = "If you want to export a course containing a test, you have to make sure the corresponding tests are included in the export, so you have to select them in the list of tests.";
$ArchivesDirectoryNotWriteableContactAdmin = "The archives directory, used by this tool, is not writeable. Please contact your platform administrator.";
$ArchivesDirectoryNotWriteableContactAdmin = "The app/cache/ directory, used by this tool, is not writeable. Please contact your platform administrator.";
$DestinationCourse = "Target course";
$ConvertToMultipleAnswer = "Convert to multiple answer";
$CasMainActivateComment = "Enabling CAS authentication will allow users to authenticate with their CAS credentials.<br/>Go to <a href='settings.php?category=CAS'>Plugin</a> to add a configurable 'CAS Login' button for your Chamilo campus.";
@ -793,7 +793,7 @@ $ChooseCam = "Choose Cam:";
$ChooseMic = "Choose Mic:";
$YouHaveToReconnectSoThatTheChangesTakeEffect = "You have to reconnect so that the changes take effect.";
$ChangeSettings = "Change settings";
$CourseLanguage = "Language:";
$CourseLanguage = "Course language";
$ConfirmClearWhiteboard = "Confirm Clear Whiteboard";
$ShouldWitheboardBeClearedBeforeNewImage = "Should the whiteboard be cleared before I add a new Image?";
$DontAskMeAgain = "Don't ask me again";
@ -1512,8 +1512,8 @@ $administratorNameTitle = "Portal Administrator: First Name";
$administratorNameComment = "The First Name of the Platform Administrator (appears in the footer on the left)";
$ShowAdministratorDataTitle = "Platform Administrator Information in footer";
$ShowAdministratorDataComment = "Show the Information of the Platform Administrator in the footer?";
$HomepageViewTitle = "Course homepage design";
$HomepageViewComment = "How would you like the homepage of a course to look?";
$HomepageViewTitle = "Course homepage layout";
$HomepageViewComment = "How would you like the homepage of a course to look (icons layout)?";
$HomepageViewDefault = "Two column layout. Inactive tools are hidden";
$HomepageViewFixed = "Three column layout. Inactive tools are greyed out (Icons stay on their place)";
$ShowToolShortcutsTitle = "Tools shortcuts";
@ -1776,7 +1776,7 @@ $UserLocked = "User locked";
$UserUnlocked = "User unlocked";
$CannotDeleteUser = "You cannot delete this user";
$SelectedUsersDeleted = "Selected users deleted";
$SomeUsersNotDeleted = "Some users has not been deleted";
$SomeUsersNotDeleted = "Some of the selected users have not been deleted. We recommend you confirm which, by using the advanced search.";
$ExternalAuthentication = "External authentification";
$RegistrationDate = "Registration date";
$UserUpdated = "User updated";
@ -2375,7 +2375,7 @@ $GroupDescription = "Group description";
$GroupMembers = "Group members";
$EditGroup = "Edit this group";
$GroupSettingsModified = "Group settings modified";
$GroupTooMuchMembers = "Number proposed exceeds max. that you allowed (you can modify it below). \t\t\t\tGroup composition has not been modified";
$GroupTooMuchMembers = "Number proposed exceeds max. that you allowed (you can modify in the group settings). Group composition has not been modified";
$GroupTutor = "Group tutor";
$GroupNoTutor = "(none)";
$GroupNone = "(none)";
@ -2547,7 +2547,7 @@ $WarningEditingDocument = "When you edit an existing document in Courses, the ne
$CreateTheExercise = "Adding a test to the course";
$MoveTheCurrentExercise = "Move the current test";
$EditCurrentExecice = "Edit the current test";
$UploadScorm = "Import SCORM course";
$UploadScorm = "Import AICC, SCORM and Chamilo learning path";
$PowerPointConvert = "Chamilo RAPID";
$LPCreatedToContinue = "To continue add a section or a learning object or activity to your course.";
$LPCreatedAddChapterStep = " <html><body><p><big><img height=\"250\" width=\"250\" align=\"right\" src=\"images/gallery/mr_dokeos/animated/practicerAnim.gif\" alt=\"practicerAnim.gif\" />Welcome to the Chamilo course authoring tool !</big></p> <ul> <li><b>Build</b> : Add learning objects and activities to your course</li> <li><b>Organize</b> : Add audio comments and order learning objects in the table of contents</li> <li><b>Display</b> : Watch the course from learner's viewpoint</li> <li><b>Add section</b> : Chapter 1, Chapter 2 or Week 1, Week 2...</li> <li><b>Add learning object or activity</b> : activities, tests, videos, multimedia pages</li> </ul></html></body>";
@ -4221,7 +4221,7 @@ $ToolName = "Import Blackboard courses";
$TrackingDisabled = "Reporting has been disabled by system administrator.";
$InactivesStudents = "Learners not connected for a week or more";
$AverageTimeSpentOnThePlatform = "Time spent on portal";
$AverageCoursePerStudent = "Courses by learner";
$AverageCoursePerStudent = "Average number of courses to which my learners are subscribed";
$AverageProgressInLearnpath = "Progress in courses";
$AverageResultsToTheExercices = "Tests score";
$SeeStudentList = "See the learners list";
@ -5163,7 +5163,7 @@ $MakeQualifiable = "Add to gradebook";
$QualificationNumberOver = "Score";
$WeightInTheGradebook = "Weight inside assessment";
$DatesAvailables = "Date limits";
$ExpiresAt = "Expires at";
$ExpiresAt = "Posted sending deadline";
$DirectoryCreated = "Directory created";
$Assignment = "Assignments";
$ExpiryDateToSendWorkIs = "Deadline for assignments";
@ -6613,7 +6613,7 @@ $BestScoredPages = "Best scores pages";
$MProgressPages = "Highest progress pages";
$MostDiscussUsers = "Most discussed users";
$RandomPage = "Random page";
$DateExpiredNotBeLessDeadLine = "The expiration date cannot be smaller than the deadline.";
$DateExpiredNotBeLessDeadLine = "The date of effective blocking of sending the work can not be before the displayed posting deadline.";
$NotRevised = "Not reviewed";
$DirExists = "The operation is impossible, a directory with this name already exists.";
$DocMv = "Document moved";
@ -6680,7 +6680,7 @@ $ReviewQuestions = "Review selected questions";
$YouTriedToResolveThisExerciseEarlier = "You have tried to resolve this exercise earlier";
$NoCookies = "You do not have cookies support enabled in your browser. Chamilo relies on the feature called \"cookies\" to store your connection details. This means you will not be able to login if cookies are not enabled. Please change your browser configuration (generally in the Edit -> Preferences menu) and reload this page.";
$NoJavascript = "Your do not have JavaScript support enabled in your browser. Chamilo relies heavily on JavaScript to provide you with a more dynamic interface. It is likely that most feature will work, but you might not benefit from the latest improvements in usability. We recommend you change your browser configuration (generally under the Edit -> Preferences menu) and reload this page.";
$NoFlash = "You do not seems to have Flash support enabled in your browser. Chamilo only relies on Flash for a few features and will not lock you out in any way if you don't have it, but if you want to benefit from the complete set of tools from Chamilo, we recommend you install the Flash Plugin and restart your browser.";
$NoFlash = "You do not seem to have Flash support enabled in your browser. Chamilo only relies on Flash for a few features and will not lock you out in any way if you don't have it, but if you want to benefit from the complete set of tools from Chamilo, we recommend you install the Flash Plugin and restart your browser.";
$ThereAreNoQuestionsForThisExercise = "There are no questions for this exercise";
$Attempt = "Attempt";
$SaveForNow = "Save and continue later";
@ -8068,7 +8068,7 @@ $ThisEmailWasSentViaCourseXInSessionX = "This e-mail was sent via course %s in s
$Diagram = "Diagram";
$CareerXDoesntHaveADiagram = "Career %s doesn't have a diagram.";
$ExerciseCategoryAllSessionsReport = "Exercise report by category for all sessions";
$MailConfirmation = "Activate account by confirmation email";
$MailConfirmation = "Require e-mail confirmation";
$RegistrationConfirmation = "Registration confirmation";
$AccountNotConfirmed = "Your account is inactive because you have not confirmed it yet. Check your email and follow the instructions or click the following link to resend the email";
$RegistrationConfirmationEmailMessage = "To complete your platform registration you need confirm your account by clicking the following link";
@ -8124,4 +8124,157 @@ $YourResultAtXBlocksThisElement = "Your result at %s blocks this step";
$RegistrationRoleWhatDoYouWantToDo = "What do you want to do?";
$RegistrationRoleFollowCourses = "Follow courses";
$RegistrationRoleTeachCourses = "Teach courses";
$EditPortfolioItem = "Edit portfolio item";
$PortfolioItemAdded = "Portfolio item added";
$ExploreMoreCourses = "Explore more courses";
$LinksOfInterest = "Links of interest";
$ExportToChamiloFormat = "Export to Chamilo format";
$CoursesComingSoon = "Courses coming soon";
$SalePrice = "Sale price";
$BuyNow = "Buy now";
$DocumentGroupCollaborationMode = "Collaboration mode";
$DocumentGroupReadOnlyMode = "Read only mode";
$GroupDocumentAccess = "Document access";
$DocumentGroupShareMode = "Share mode";
$SessionDurationXDaysTotal = "This session has a limited duration of %s days";
$LastMonth = "Last month";
$ThisMonth = "This month";
$PortalUserSessionStats = "Portal user session stats";
$AddCustomToolsIntro = "You may add an introduction to this tool page as a helper text for your students. Simply click the edit icon to add some text. This short info text here is invisible to students and you can just leave this block empty, but what you will type will be visible to them.";
$TheDocumentAutoLaunchSettingIsOnStudentsWillBeRedirectToTheDocumentTool = "The document auto-launch feature configuration is enabled. Learners will be automatically redirected to document tool.";
$DocumentAutoLaunch = "Auto-launch for documents";
$RedirectToTheDocumentList = "Redirect to the document list";
$TheExerciseAutoLaunchSettingIsONStudentsWillBeRedirectToTheExerciseList = "The exercises auto-launch feature configuration is enabled. Learners will be automatically redirected to exercise list.";
$PostedExpirationDate = "Posted deadline for sending the work (Visible to the learner)";
$BossAlertMsgSentToUserXTitle = "Follow up message about student %s";
$BossAlertUserXSentMessageToUserYWithLinkZ = "Hi,<br/><br/>
User %s sent a follow up message about student %s.<br/><br/>
The message can be seen here %s";
$include_services = "Include services";
$culqi_enable = "Enable culqi";
$SelectedUsersDisabled = "The selected users have all been disabled";
$SomeUsersNotDisabled = "Some of the selected users have not been disabled. We recommend you confirm which, by using the advanced search.";
$SelectedUsersEnabled = "The selected users were all enabled.";
$SomeUsersNotEnabled = "Some of the selected users have not been enabled. We recommend you confirm which, by using the advanced search.";
$EncryptedData = "Encrypted data";
$RandomData = "Random data";
$PersonalDataReport = "Personal data";
$ComplexDataNotShown = "Complex data (not shown)";
$PersonalDataIntroductionTitle = "Personal data: introduction";
$PersonalDataKeptOnYou = "Personal data we keep about you";
$PersonalDataPermissionsYouGaveUs = "Permissions you gave us";
$PersonalDataResponsibleOrganizationTitle = "Organization responsible for your data treatment";
$PersonalDataTreatmentTitle = "Personal data treatment";
$PersonalDataCollectionTitle = "Personal data collection";
$PersonalDataRecordingTitle = "Personal data recording";
$PersonalDataOrganizationTitle = "Personal data organization";
$PersonalDataStructureTitle = "Personal data structure";
$PersonalDataConservationTitle = "Personal data conservation";
$PersonalDataAdaptationTitle = "Personal data adaptation or modification";
$PersonalDataExtractionTitle = "Personal data extraction";
$PersonalDataConsultationTitle = "Personal data queries";
$PersonalDataUsageTitle = "Personal data use";
$PersonalDataCommunicationTitle = "Personal data communication and sharing";
$PersonalDataInterconnectionTitle = "Personal data interconnection";
$PersonalDataLimitationTitle = "Personal data limitation";
$PersonalDataDeletionTitle = "Personal data deletion";
$PersonalDataDestructionTitle = "Personal data destruction";
$PersonalDataProfilingTitle = "Personal data profiling";
$PersonalDataIntroductionText = "We respect your privacy!
This page unites all aspects of the personal data we might be keeping on you, how we treat it, what you have authorized us to do with it and who we are, in an effort to comply with most data privacy laws available.
Please read this information carefully and, if you have any question, check the contact details below to ask us for more details.";
$YourDegreeOfCertainty = "Your degree of certainty";
$DegreeOfCertaintyThatMyAnswerIsCorrect = "Degree of certainty that my answer will be considered correct";
$IncorrectAnswersX = "Incorrect answers: %s";
$KindRegards = "Kind regards,";
$DoNotReply = "Please do not reply";
$ResultAccomplishedTest = "Results for the accomplished test";
$YourResultsByDiscipline = "Your results by discipline";
$ForComparisonYourLastResultToThisTest = "In comparison, your latest results for this test";
$YourOverallResultForTheTest = "Your overall results for the test";
$QuestionDegreeCertaintyHTMLMail = "You will find your results for test %s below.<br />
To see the details of these results:
<br /><br />
1. Connect to the platform (login/password): <a href='%s'>To the platform</a>.
<br /><br />
2. Click this link: <a href='%s'>See detailed results</a>.";
$DegreeOfCertaintyVerySure = "Very sure";
$DegreeOfCertaintyVerySureDescription = "Your answer was correct and you were 80% sure about it. Congratulations!";
$DegreeOfCertaintyPrettySure = "Pretty sure";
$DegreeOfCertaintyPrettySureDescription = "Your answer was correct but you were not completely sure (only 60% to 70% sure)";
$DegreeOfCertaintyDeclaredIgnorance = "Declared ignorance";
$DegreeOfCertaintyDeclaredIgnoranceDescription = "You didn't know the answer - only 50% sure";
$DegreeOfCertaintyUnsure = "Unsure";
$DegreeOfCertaintyUnsureDescription = "Your answer was incorrect, but you guessed it was (60% to 70% sure)";
$DegreeOfCertaintyVeryUnsure = "Very unsure";
$DegreeOfCertaintyVeryUnsureDescription = "Your answer was incorrect although you were about 80% (or more) sure it was wrong";
$DegreeOfCertaintyIDeclareMyIgnorance = "I don't know the answer and I've picked at random";
$DegreeOfCertaintyIAmVeryUnsure = "I am very unsure";
$DegreeOfCertaintyIAmUnsure = "I am unsure";
$DegreeOfCertaintyIAmPrettySure = "I am pretty sure";
$DegreeOfCertaintyIAmSure = "I am almost 100% sure";
$DegreeOfCertaintyIAmVerySure = "I am totally sure";
$MultipleAnswerTrueFalseDegreeCertainty = "Multiple answer true/false/degree of certainty";
$IgnoranceAnswersX = "Ignorance: %s";
$CorrectAnswersX = "Correct answers: %s";
$TotalHours = "Total hours";
$MinutesPerDay = "Minutes per day";
$ClassroomActivity = "Classroom activity";
$OneDay = "1 day";
$UserXAnonymized = "User %s's information anonymized.";
$CannotAnonymizeUserX = "We could not anonymize user %s's information. Please try again or check the logs.";
$NoPermissionToAnonymizeUserX = "You don't have permissions to anonymize user %s. You need the same permissions as to delete users.";
$Anonymize = "Anonymize";
$XQuestions = "%d questions";
$WebFolderRefreshSucceeded = "The styles and assets in the web/ folder have been refreshed.";
$WebFolderRefreshFailed = "The styles and assets in the web/ folder could not be refreshed, probably due to a permissions problem. Make sure the web/ folder is writeable by your web server.";
$CopyTextToClipboard = "Copy text";
$WeNeedYouToAcceptOurTreatmentOfYourData = "We need you to accept our treatment of your data in order to provide you with this service. If you want to register an account, please accept the terms and click Submit. If you don't accept, no personal data will be treated by us about you.";
$NoTermsAndConditionsAvailable = "No terms and conditions available";
$Skype = "Skype";
$PersonalDataOfficerName = "Personal data officer's name";
$PersonalDataOfficerRole = "Personal data officer's role";
$Assets = "Assets";
$TotalLPTime = "Total learnpath time";
$AddStatus = "Add status";
$AddProject = "Add project";
$AddPriority = "Add priority";
$NotAccepted = "Rejected";
$UserPermissions = "User permissions";
$ExportToPdf = "Export to PDF";
$GoToThread = "Go to thread";
$TimeDifference = "Time difference";
$SessionAdministrator = "Session administrator";
$ThereIsASequenceResourceLinkedToThisSessionYouNeedToDeleteItFirst = "There is a sequence resource linked to this session. You must delete this link first.";
$AddAnnotationText = "Add annotation text";
$AddAnnotationPath = "Add annotation path";
$Driver = "Driver";
$UploadTmpDirInfo = "The temporary upload directory is a space on the server where files are uploaded before being filtered and treated by PHP.";
$GenerateCustomReport = "Generate custom report";
$ToDo = "To do";
$PleaseEnterURL = "Please enter the URL";
$IfYouWantToGetTheCertificateAndOrSkillsAsociatedToThisCourseYouNeedToBuyTheCertificateServiceYouCanGoToServiceCatalogClickingHere = "If you want to get the certificate and/or skills associated with this course, you need to buy the certificate service. You can go to the services catalog by clicking this link: %s";
$SubSkill = "Sub-skill";
$AddMultipleUsersToCalendar = "Add multiple users to calendar";
$UpdateCalendar = "Update calendar";
$ControlPoint = "Control point";
$MessageQuestionCertainty = "Please follow the instructions below to check your results for test %s.<br /><br />
1. Connect to the platform (username/password) at: %s<br />
2. Click the following link: %s<br />";
$SessionMinDuration = "Session min duration";
$CanNotTranslate = "Could not translate";
$AddSkills = "Add skills";
$Dictionary = "Dictionary";
$CategoryExists = "Category exists";
$MinimumGradebookToValidate = "Minimum to validate";
$NumberOfGradebookToValidateInDependence = "Number of gradebooks to validate in dependencies";
$DependsOnGradebook = "Depends on gradebook";
$ThisGradebookDoesntHaveDependencies = "This gradebook has no dependency";
$CourseIntroductionsAllImportedSuccessfully = "Course introductions all imported successfully.";
$FilterSessions = "Filter sessions";
$ScoreModel = "Score model";
$SyncDatabaseWithSchema = "Synchronize the database with the schema";
$SkillRelCourses = "Courses-Skills associations";
?>

@ -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 appris par vos utilisateurs, les récompensent 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 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>.";
$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";
@ -39,7 +39,7 @@ $TemplateCertificateComment = "Exemple de certificat";
$TemplateCertificateTitle = "Certificat";
$ResultsVisibility = "Visibilité des résultats";
$DownloadCertificate = "Télécharger certificat";
$PortalActiveCoursesLimitReached = "Désolé, cette installation dispose d'une limite de cours qui a été atteinte à présent. Vous pouvez toujours créer de nouveaux cours, mais uniquement si vous cachez/désactivez au moins un cours actif actuellement. Afin d'utiliser cette méthode, éditez un cours depuis la liste des cours de la page d'administration et changez sa visibilité à 'caché', puis essayer de nouveau de créer ce cours. Afin d'augmenter le nombre maximum de cours actifs autorisés sur cette installation, veuillez contacter votre fournisseur d'hébergement ou, si cette méthode est disponible, passez à un plan d'hébergement supérieur.";
$PortalActiveCoursesLimitReached = "Désolé, la limite de cours a été atteinte pour cette installation. Vous pouvez toujours créer de nouveaux cours, mais uniquement si vous cachez/désactivez au moins un cours actif actuellement. Afin d'utiliser cette méthode, éditez un cours depuis la liste des cours de la page d'administration et changez sa visibilité à 'caché', puis essayez de nouveau de créer ce cours. Afin d'augmenter le nombre maximum de cours actifs autorisés sur cette installation, veuillez contacter votre fournisseur d'hébergement ou, si cette méthode est disponible, passez à un plan d'hébergement supérieur.";
$WelcomeToInstitution = "Bienvenu(e) sur le campus de %s";
$WelcomeToSiteName = "Bienvenue à %s";
$RequestAccess = "Demande d'accès";
@ -104,7 +104,7 @@ $MultiplicationStar = "Multiplication:\t\t\t*";
$SubstractionMinus = "Soustraction:\t\t\t-";
$SummationPlus = "Somme:\t\t\t\t+";
$NotationList = "Syntaxe de formules";
$SubscribeToSessionRequest = "Requête d'inscription à une session";
$SubscribeToSessionRequest = "Solliciter inscription";
$PleaseSubscribeMeToSession = "Merci de bien vouloir considérer mon inscription à la session";
$SearchActiveSessions = "Recherche sessions actives";
$UserNameHasDash = "Le nom d'utilisateur ne peut pas contenir de tirets (-)";
@ -383,7 +383,7 @@ $AnsweredZ = "(%s) Répondu";
$CurrentQuestionZ = "(%s) question actuelle";
$ToReviewZ = "(% s) Examiner";
$ReturnToExerciseList = "Retour à la liste des exercices";
$ExerciseAutoLaunch = "Auto-lancement pour les exercices";
$ExerciseAutoLaunch = "Auto-démarrage pour les exercices";
$AllowFastExerciseEdition = "Activer le mode d'édition rapide d'exercices";
$Username = "Nom d'utilisateur";
$SignIn = "Connectez-vous";
@ -740,7 +740,7 @@ $ToolIntro = "Introduction";
$UploadError = "l'upload n'a pas fonctionné, veuillez vérifier les limites de taille de fichiers autorisée et les permissions de vos répertoires.";
$DocumentsWillBeAddedToo = "Les documents seront également ajoutés";
$ToExportLearnpathWithQuizYouHaveToSelectQuiz = "Si vous désirez exporter un cours contenant des tests, il est nécessaire d'inclure ces tests dans l'export en les sélectionnant dans la liste des tests.";
$ArchivesDirectoryNotWriteableContactAdmin = "Le répertoire d'archives, utilisé par cet outil, ne dispose pas des accès en écriture attendus. Veuillez contacter l'administrateur de la plateforme à ce sujet.";
$ArchivesDirectoryNotWriteableContactAdmin = "Le répertoire app/cache/, utilisé par cet outil, ne dispose pas des accès en écriture. Veuillez contacter l'administrateur de la plateforme à ce sujet.";
$DestinationCourse = "Cours de destination";
$ConvertToMultipleAnswer = "Convertir en question à réponses multiples (QRM)";
$CasMainActivateComment = "Activer l'authentification CAS permettra aux utilisateurs de s'identifier à l'aide de leur compte CAS<br/>Vous trouverez dans les <a href='settings.php?category=CAS'>Plugin</a> un bouton 'Login CAS', paramétrable, qui s'ajoutera sur la page d'accueil de votre campus Chamilo.";
@ -781,13 +781,13 @@ $AlreadyIn = "Déjà connectés";
$CheckIn = "Déjà connectés";
$TheModeratorHasLeft = "Le modérateur a quitté la conférence.";
$SystemMessage = "Message système";
$ChooseDevices = "Sélectionnez les périphériques";
$ChooseDevices = "Sélectionner les périphériques";
$ChooseCam = "Sélection de la caméra:";
$ChooseMic = "Sélection du micro:";
$YouHaveToReconnectSoThatTheChangesTakeEffect = "Vous devez vous reconnecter pour activer les modifications.";
$ChangeSettings = "Modifier les valeurs";
$CourseLanguage = "Langue:";
$ConfirmClearWhiteboard = "Confirmez l'effacement du tableau";
$CourseLanguage = "Langue du cours";
$ConfirmClearWhiteboard = "Confirmer l'effacement du tableau";
$ShouldWitheboardBeClearedBeforeNewImage = "Le tableau doit-il être effacé avant ajout d'une dia?";
$DontAskMeAgain = "Ne plus me demander";
$ShowConfirmationBeforeClearingWhiteboard = "Demander confirmation avant d'effacer le tableau";
@ -911,7 +911,7 @@ $ExampleForumCategory = "Exemple de catégorie";
$ExampleForum = "Exemple de forum";
$ExampleThread = "Exemple de sujet";
$ExampleThreadContent = "Exemple de contenu";
$IntroductionWiki = "Le mot \"Wiki\" est un raccourci pour WikiWikiWeb. Wikiwiki est un mot hawaïen signifiant rapide ou vitesse. Dans un wiki, les gens écrivent des pages ensemble. Si une personne fait une erreur, la personne suivante peut la corriger. La personne suivante peut également ajouter quelque chose de neuf à la page. Grâce à cela, la page s'améliore à chaque fois que quelqu'un la modifie.";
$IntroductionWiki = "Le mot \"Wiki\" est un raccourci pour WikiWikiWeb. Wikiwiki est un mot hawaïen signifiant rapide ou vitesse. Dans un wiki, les gens écrivent des pages ensemble. Si une personne fait une erreur, la personne suivante peut la corriger. La personne suivante peut également ajouter quelque chose de neuf à la page. Grâce à cela, la page s'améliore à chaque fois que quelqu'un la modifie. Optimise l'apprentissage par le travail collaboratif.";
$CreateCourseArea = "Créer ce cours";
$CreateCourse = "Créer cours";
$TitleNotification = "Depuis votre dernière visite";
@ -1505,8 +1505,8 @@ $administratorNameTitle = "Administrateur de la plateforme: prénom";
$administratorNameComment = "Le prénom de l'administrateur de la plateforme (apparaît dans le pied de page, du côté gauche)";
$ShowAdministratorDataTitle = "Informations de l'administrateur de la plateforme dans le pied de page";
$ShowAdministratorDataComment = "Afficher les informations sur l'administrateur de la plateforme dans le pied de page ?";
$HomepageViewTitle = "Vue page d'accueil";
$HomepageViewComment = "Comment se présente la page d'accueil d'un cours?";
$HomepageViewTitle = "Présentation page principale des cours";
$HomepageViewComment = "Comment sont disposés les icônes d'outils sur la page d'accueil des cours?";
$HomepageViewDefault = "Affichage en 2 colonnes. Les outils inactifs sont cachés";
$HomepageViewFixed = "Affichage en trois colonnes. Les outils inactifs sont grisés (les icônes restent à leur place)";
$ShowToolShortcutsTitle = "Raccourcis vers les outils";
@ -1639,7 +1639,7 @@ $ShowNavigationMenuComment = "Afficher un menu de navigation qui facilite l'acc
$LoginAs = "Identifié en tant que";
$ImportClassListCSV = "Importer une liste de classe (format CSV)";
$ShowOnlineWorld = "Afficher le nombre d'utilisateurs connectés sur la page d'accueil (visible par tous)";
$ShowOnlineUsers = "Montrer le nombre d'utilisateurs en ligne toutes les pages (visible pour les personnes qui sont entrées)";
$ShowOnlineUsers = "Montrer le nombre d'utilisateurs en ligne sur toutes les pages (visible pour les personnes authentifiées)";
$ShowOnlineCourse = "Afficher le nombre d'utilisateurs connectés à ce cours";
$ShowIconsInNavigationsMenuTitle = "Afficher les images dans le menu de navigation";
$SeeAllRightsAllRolesForSpecificLocation = "Endroit :";
@ -2144,19 +2144,19 @@ $SearchNetworkTimeoutError = "La connexion a expiré lors de la communication av
$SearchOtherXapianError = "Erreur dans le moteur de recherche";
$SearchXapianModuleNotInstalled = "Le module de recherche Xapian n'est pas installé";
$FieldRemoved = "Champ supprimé";
$TheNewSubLanguageHasBeenAdded = "Le nouveau sous-langage a été ajouté";
$DeleteSubLanguage = "Supprimer le sous-langage";
$CreateSubLanguageForLanguage = "Créer un sous-langage pour ce langage";
$TheNewSubLanguageHasBeenAdded = "Le nouveau jargon a été ajouté";
$DeleteSubLanguage = "Supprimer le jargon";
$CreateSubLanguageForLanguage = "Créer un jargon sur base de cette langue";
$DeleteSubLanguageFromLanguage = "Supprimer ce sous-langage";
$CreateSubLanguage = "Créer sous-langage";
$RegisterTermsOfSubLanguageForLanguage = "Définir de nouveaux termes pour ce sous-langage";
$AddTermsOfThisSubLanguage = "Termes du sous-langage";
$CreateSubLanguage = "Créer jargon (sous-langage)";
$RegisterTermsOfSubLanguageForLanguage = "Définir de nouveaux termes pour ce jargon";
$AddTermsOfThisSubLanguage = "Termes du jargon";
$LoadLanguageFile = "Charger fichier de langue";
$AllowUseSubLanguageTitle = "Autoriser la définition et l'usage de sous-langages";
$AllowUseSubLanguageTitle = "Autoriser la définition et l'usage de jargons";
$AllowUseSubLanguageComment = "En activant cette option, vous rendrez possible la définition de variations pour chacun des termes de langage utilisé dans l'interface de la plateforme, sous la forme d'un langage basé sur et étendant un langage existant. Vous trouverez cette option dans la <a href=\"languages.php\">section des langues du panneau d'administration</a>, sous la forme d'une icône d'ajout.";
$AddWordForTheSubLanguage = "Ajouter des termes au sous-langage";
$AddWordForTheSubLanguage = "Ajouter des termes au jargon";
$TemplateEdited = "Modèle mis à jour";
$SubLanguage = "Sous-langage";
$SubLanguage = "Jargon";
$LanguageIsNowVisible = "Le langage a été rendu visible et peut désormais être utilisé au sein de la plateforme.";
$LanguageIsNowHidden = "Le langage a été caché. Il ne sera plus possible de l'utiliser jusqu'à ce qu'il soit rendu visible à nouveau.";
$LanguageDirectoryNotWriteableContactAdmin = "Le répertoire /main/lang, utilisé sur cette plateforme pour stocker les langages, n'est pas accessible en écriture. Veuillez contacter l'administrateur de la plateforme et lui rapporter ce message.";
@ -2181,7 +2181,7 @@ $AllVersions = "Toutes les versions";
$EditTermsAndConditions = "Éditer les termes et conditions";
$ExplainChanges = "Expliquer les modifications";
$TermAndConditionNotSaved = "Termes et conditions non sauvegardés";
$TheSubLanguageHasBeenRemoved = "Le sous-langage a été supprimé";
$TheSubLanguageHasBeenRemoved = "Le jargon a été supprimé";
$AddTermsAndConditions = "Ajouter des termes et conditions";
$TermAndConditionSaved = "Termes et conditions sauvés";
$ListSessionCategory = "Liste des catégories de sessions";
@ -2368,7 +2368,7 @@ $GroupDescription = "Description du groupe";
$GroupMembers = "Membres du groupe";
$EditGroup = "Éditer ce groupe";
$GroupSettingsModified = "Paramètres de ce groupe modifiés.";
$GroupTooMuchMembers = "Le nombre de membres proposé excède le nombre maximum que vous avez fixé. La composition du groupe n'a pas été modifiée. Vous pouvez modifer le nombre maximum ci-dessous.";
$GroupTooMuchMembers = "Le nombre de membres proposé excède le nombre maximum que vous avez fixé. La composition du groupe n'a pas été modifiée. Vous pouvez modifier le nombre maximum dans la configuration du groupe.";
$GroupTutor = "Modérateur du groupe";
$GroupNoTutor = "(aucun)";
$GroupNone = "(aucune)";
@ -2540,7 +2540,7 @@ $WarningEditingDocument = "Quand vous éditez un document existant dans un parco
$CreateTheExercise = "Créer l'exercice";
$MoveTheCurrentExercise = "Déplacer l'excercice courant";
$EditCurrentExecice = "Éditer l'excercice courant";
$UploadScorm = "Import AICC et SCORM";
$UploadScorm = "Import AICC, SCORM et PARCOURS";
$PowerPointConvert = "Conversion PowerPoint";
$LPCreatedToContinue = "Pour continuer, vous pouvez ajouter un chapitre ou une étape à votre parcours depuis le menu de gauche";
$LPCreatedAddChapterStep = "Vous pouvez ajouter un chapitre ou une étape à votre parcours depuis le menu de gauche";
@ -2851,8 +2851,8 @@ $StudentEmail = "Courriel de l'apprenant";
$OpenQuestionsAttemptedAre = "La question ouverte tentée est";
$UploadJpgPicture = "Envoyer une image au format JPG";
$HotspotDescription = "Description de la zone";
$ExamSheetVCC = "Exercice vu/corrigé/commenté par un prof";
$AttemptVCC = "Votre tentative détaillée ci-dessous a été vue/corrigée/commentée par un prof";
$ExamSheetVCC = "Exercice vu/corrigé/commenté par un professeur";
$AttemptVCC = "Votre tentative détaillée ci-dessous a été vue/corrigée/commentée par un professeur";
$ClickLinkToViewComment = "Cliquez sur le lien ci-dessous pour accéder à votre compte et voir votre feuille d'examen corrigée.";
$Regards = "Cordialement";
$AttemptVCCLong = "Votre tentative pour l'exercice %s a été vue/commentée/corrigée par un responsable. Cliquez sur le ien suivant pour accéder à votre compte et voir la feuille d'examen.";
@ -4212,7 +4212,7 @@ $ToolName = "Importer des cours Blackboard";
$TrackingDisabled = "Le système de suivi a été désactivé par l'administrateur système.";
$InactivesStudents = "Apprenants non connectés depuis une semaine ou plus";
$AverageTimeSpentOnThePlatform = "Temps moyen passé sur la plateforme";
$AverageCoursePerStudent = "Nombre de cours moyen par apprenant";
$AverageCoursePerStudent = "Nombre moyen de cours auxquels mes apprenants sont inscrits";
$AverageProgressInLearnpath = "Progression moyenne dans les parcours";
$AverageResultsToTheExercices = "Score moyen aux tests";
$SeeStudentList = "Voir la liste des apprenants";
@ -5154,7 +5154,7 @@ $MakeQualifiable = "Activer dans le cahier de notes";
$QualificationNumberOver = "Évaluation sur...";
$WeightInTheGradebook = "Pondération dans le cahier de notes";
$DatesAvailables = "Dates disponibles";
$ExpiresAt = "Expire le";
$ExpiresAt = "Date limite d'envoi affichée";
$DirectoryCreated = "Dossier créé";
$Assignment = "Tâche";
$ExpiryDateToSendWorkIs = "Expiration pour la remise des travaux";
@ -5515,7 +5515,7 @@ $ReminderMessage = "Envoyer un rappel";
$DateSent = "Date de réception";
$ViewUsersWithoutTask = "Travaux manquants";
$AsciiSvgTitle = "Activer AsciiSVG";
$SuggestionOnlyToEnableSubLanguageFeatureOrUpgradeProcess = "Suggestion, uniquement nécessaire pour activer la fonctionnalité de sous-langage";
$SuggestionOnlyToEnableSubLanguageFeatureOrUpgradeProcess = "Optionnel: uniquement nécessaire pour activer la fonctionnalité de jargon (sous-langage)";
$ThematicAdvance = "Progression du cours";
$EditProfile = "Éditer le profil";
$TabsDashboard = "Panneau de contrôle";
@ -5696,7 +5696,7 @@ $ToolCourseMaintenance = "Maintenance";
$AreYouSureToDeleteAllDates = "Êtes-vous certain de vouloir supprimer toutes les dates?";
$ImportQtiQuiz = "Importer exercices QTI2";
$ISOCode = "Code ISO";
$TheSubLanguageForThisLanguageHasBeenAdded = "Le sous-langage de ce langage a été ajouté";
$TheSubLanguageForThisLanguageHasBeenAdded = "Le jargon a été ajouté à cette langue";
$ReturnToLanguagesList = "Retourner à la liste des langues";
$AddADateTime = "Ajouter une date/heure";
$ActivityCoach = "Le coach de la session a tous les droits et privilèges pour tous les cours appartenant à la session.";
@ -6370,7 +6370,7 @@ $OnlyLettersAndNumbers = "Seulement lettres (a-z) et chiffres (0-9)";
$HideCoursesInSessionsTitle = "Cacher les cours dans les sessions";
$HideCoursesInSessionsComment = "Lorsque les sessions apparaîssent sur la page des cours, cacher la liste des cours au sein des sessions (seulement montrer les cours au sein de l'écran spécifique aux sessions).";
$ShowGroupsToUsersTitle = "Montrer les classes aux apprenants";
$ShowGroupsToUsersComment = "Montrer les classes aux utilisateurs. La fonctionnalité de classes permet d'inscrire/désinscrir des goupes d'utilisateurs à une session ou un cours directement, réduisant ainsi la charge administrative pour les inscriptions. Lorsque cette fonctionnalité est sélectionnée, les utilisateurs peuvent voir à quelle classe ils appartiennent à partir de leur interface de réseau social.";
$ShowGroupsToUsersComment = "Montrer les classes aux utilisateurs. La fonctionnalité de classes permet d'inscrire/désinscrire des groupes d'utilisateurs à une session ou un cours directement, réduisant ainsi la charge administrative pour les inscriptions. Lorsque cette fonctionnalité est sélectionnée, les utilisateurs peuvent voir à quelle classe ils appartiennent à partir de leur interface de réseau social.";
$ExerciseWillBeActivatedFromXToY = "L'exercice sera disponible du %s au %s";
$ExerciseAvailableFromX = "Exercice disponible à partir du %s";
$ExerciseAvailableUntilX = "Exercice disponible jusqu'au %s";
@ -6442,7 +6442,7 @@ $UnderMin = "En-dessous du minimum";
$SelectOptionExport = "Sélectionnez une option d'export";
$FieldEdited = "Champ ajouté.";
$LanguageParentNotExist = "Le langage parent n'existe pas.";
$TheSubLanguageHasNotBeenRemoved = "Le sous-langage n'a pas été éliminé.";
$TheSubLanguageHasNotBeenRemoved = "Le jargon n'a pas été éliminé.";
$ShowOrHide = "Montrer/Cacher";
$StatusCanNotBeChangedToHumanResourcesManager = "Le statut de cet utilisateur ne peut pas être modifié à directeur des ressources humaines.";
$FieldTaken = "Champ pris";
@ -6601,7 +6601,7 @@ $BestScoredPages = "Pages au score le plus haut";
$MProgressPages = "Pages au progrès le plus élevé";
$MostDiscussUsers = "Utilisateurs les plus discutés";
$RandomPage = "Page au hasard";
$DateExpiredNotBeLessDeadLine = "La date d'expiration ne peut pas être antérieure à la date de fin.";
$DateExpiredNotBeLessDeadLine = "La date de blocage effectif de l'envoi du travail ne peut pas être antérieur à la date limite d'envoi affichée";
$NotRevised = "Non coté";
$DirExists = "Opération impossible, un répertoire du même nom existe déjà (peut-être dans une autre session).";
$DocMv = "Document déplacé.";
@ -7417,7 +7417,7 @@ $ShowProgress = "Montrer le progrès";
$XPercent = "%s %%";
$CheckRequirements = "Vérifier les pré-requis";
$ParentLanguageX = "Langue parente: %s";
$RegisterTermsOfSubLanguageForX = "Définissez de nouveaux termes pour le sous-langage %s en cherchant un terme spécifique puis en sauvegardant chacune des traductions en cliquant sur le bouton correspondant. Pour visualiser les nouveaux termes, il faudra alors changer votre langue d'utilisateur dans votre profil.";
$RegisterTermsOfSubLanguageForX = "Définissez de nouveaux termes pour le jardon (sous-langage) %s en cherchant un terme spécifique puis en sauvegardant chacune des traductions en cliquant sur le bouton adjacent correspondant. Pour visualiser les nouveaux termes, il faudra alors changer votre langue d'utilisateur dans votre profil.";
$SeeSequences = "Voir les séquences";
$SessionRequirements = "Pré-requis pour la session";
$IsRequirement = "Obligatoire pour compléter le cours";
@ -7609,7 +7609,7 @@ $TeacherCanSelectCourseTemplateTitle = "L'enseignant peut choisir un cours comme
$TeacherCanSelectCourseTemplateComment = "Permettre le choix d'un cours comme modèle lors de la création d'un nouveau cours par l'enseignant. Dans ce cas, les ressources du cours modèle seront copiées automatiquement comme base du nouveau cours.";
$TheForumAutoLaunchSettingIsOnStudentsWillBeRedirectToTheForumTool = "La fonctionnalité auto-démarrage du forum est activée. Les apprenants seront redirigés vers la liste de forums automatiquement lorsqu'ils entreront dans ce cours.";
$RedirectToForumList = "Rediriger ver la liste de forums";
$EnableForumAutoLaunch = "Activar l'auto-démarrage des forums";
$EnableForumAutoLaunch = "Activer l'auto-démarrage des forums";
$NowDownloadYourCertificateClickHere = "Télécharge ton certificat en cliquant ici";
$AdditionallyYouHaveObtainedTheFollowingSkills = "En plus, tu as acquis les compétences suivantes";
$IHaveObtainedSkillXOnY = "J'ai acquis la compétence %s sur %s";
@ -7680,7 +7680,7 @@ $GlossaryTermAlreadyExists = "Ce terme existe déjà";
$LinkedInUrl = "URL de profil LinkedIn";
$SaveTheCorrectAnswersForTheNextAttempt = "Garder les réponses correctes pour l'essai suivant";
$TranslateThisTerm = "Traduire ce terme";
$OnlyActiveSubLanguagesAreListed = "Seules les sous-langues actives sont listées ici";
$OnlyActiveSubLanguagesAreListed = "Seuls les jargons actifs sont listés ici";
$Translation = "Traduction";
$IfThisTranslationExistsThisWillReplaceTheTerm = "Si ce terme a déjà été traduit, cette opération remplacera la traduction existante pour ce sous-langage.";
$LastConnection = "Dernière connexion";
@ -8005,7 +8005,7 @@ $ThisEmailWasSentViaCourseXInSessionX = "Cet e-mail a été envoyé via le cours
$Diagram = "Diagramme";
$CareerXDoesntHaveADiagram = "La carrière %s n'a pas de diagramme.";
$ExerciseCategoryAllSessionsReport = "Rapport d'exercice par catégorie dans toutes les sessions";
$MailConfirmation = "Activer le compte après confirmation de l'e-mail";
$MailConfirmation = "Exiger confirmation par e-mail";
$RegistrationConfirmation = "Confirmation d'inscription";
$AccountNotConfirmed = "Votre compte n'est pas encore actif parce que vous ne l'avez pas encore confirmé par e-mail. Vérifiez votre boîte mail et suivez les instructions, ou cliquez sur le lien suivant pour renvoyer un e-mail de confirmation.";
$RegistrationConfirmationEmailMessage = "Pour compléter votre inscription sur la plateforme, vous devez confirmer votre compte en cliquant sur le lien suivant";
@ -8061,4 +8061,150 @@ $YourResultAtXBlocksThisElement = "Votre score à l'étape \"%s\" ne vous permet
$RegistrationRoleWhatDoYouWantToDo = "Que souhaitez-vous faire?";
$RegistrationRoleFollowCourses = "Suivre des cours";
$RegistrationRoleTeachCourses = "Enseigner";
$EditPortfolioItem = "Éditer élément du portfolio";
$PortfolioItemAdded = "Élément du portfolio enregistré";
$ExploreMoreCourses = "Explorer plus de cours";
$LinksOfInterest = "Liens d'intérêt";
$ExportToChamiloFormat = "Exportation du parcours";
$CoursesComingSoon = "Cours à paraître";
$SalePrice = "Prix de vente";
$BuyNow = "Acheter";
$DocumentGroupCollaborationMode = "Mode collaboratif";
$DocumentGroupReadOnlyMode = "Mode lecture seule";
$GroupDocumentAccess = "Type d'usage";
$DocumentGroupShareMode = "Mode partagé";
$SessionDurationXDaysTotal = "Cette session a une durée limitée à %s jours";
$LastMonth = "Mois passé";
$ThisMonth = "Mois actuel";
$PortalUserSessionStats = "Nombre d'apprenants par session et par portail";
$AddCustomToolsIntro = "Ce texte est invisible pour vos apprenants tant qu'elle n'est pas modifiée, mais cette section vous permet de rajouter votre propre texte d'introduction à cet outil pour fournir une guidance localisée à vos apprenants. Pour introduire ce texte pour vos apprenants, cliquez sur l'icône d'édition.";
$TheDocumentAutoLaunchSettingIsOnStudentsWillBeRedirectToTheDocumentTool = "La fonctionnalité d'auto-démarrage des documents est activée. Les apprenants seront automatiquement redirigés vers l'outil documents.";
$DocumentAutoLaunch = "Auto-démarrage vers l'outil documents";
$RedirectToTheDocumentList = "Rediriger vers la liste des documents";
$TheExerciseAutoLaunchSettingIsONStudentsWillBeRedirectToTheExerciseList = "La fonctionnalité d'auto-démarrage des exercices est activée. Les apprenants seront automatiquement redirigés vers la liste des exercices.";
$PostedExpirationDate = "Date limite affichée d'envoi du travail (visible par l'apprenant)";
$BossAlertMsgSentToUserXTitle = "Message de suivi concernant l'apprenant %s";
$BossAlertUserXSentMessageToUserYWithLinkZ = "Bonjour,<br/><br/>
L'utilisateur %s a envoyé un message de suivi concernant l'apprenant %s.<br/><br/>
Le message est visible sur %s";
$include_services = "Inclure les services";
$culqi_enable = "Activé culqi";
$SelectedUsersDisabled = "Les utilisateurs sélectionnés ont tous été désactivés.";
$SomeUsersNotDisabled = "Certains des utilisateurs sélectionnés n'ont pas été supprimés. Nous vous recommandons de confirmer lesquels en utilisant la recherche avancée.";
$SelectedUsersEnabled = "Tous les utilisateurs sélectionnés ont été activés.";
$SomeUsersNotEnabled = "Certains des utilisateurs sélectionnés n'ont pas été activés. Nous vous recommandons de confirmer lesquels en utilisant la recherche avancée.";
$EncryptedData = "Données encryptées";
$RandomData = "Données aléatoires";
$PersonalDataReport = "Données personnelles";
$ComplexDataNotShown = "Données complexes non affichées";
$PersonalDataIntroductionTitle = "Introduction à vos données personnelles";
$PersonalDataKeptOnYou = "Données personnelles que nous conservons à votre sujet";
$PersonalDataPermissionsYouGaveUs = "Permissions que vous nous avez données";
$PersonalDataResponsibleOrganizationTitle = "Organisation responsable du traitement";
$PersonalDataTreatmentTitle = "Traitement des données";
$PersonalDataCollectionTitle = "Collecte des données personnelles";
$PersonalDataRecordingTitle = "Enregistrement des données personnelles";
$PersonalDataOrganizationTitle = "Organisation des données personnelles";
$PersonalDataStructureTitle = "Structuration des données personnelles";
$PersonalDataConservationTitle = "Conservation des données personnelles";
$PersonalDataAdaptationTitle = "Adaptation ou modification des données personnelles";
$PersonalDataExtractionTitle = "Extraction des données personnelles";
$PersonalDataConsultationTitle = "Consultation des données personnelles";
$PersonalDataUsageTitle = "Utilisation des données personnelles";
$PersonalDataCommunicationTitle = "Communication et diffusion des données personnelles";
$PersonalDataInterconnectionTitle = "Interconnexion des données personnelles";
$PersonalDataLimitationTitle = "Limitation des données personnelles";
$PersonalDataDeletionTitle = "Effacement des donnée personnelles";
$PersonalDataDestructionTitle = "Destruction des donnée personnelles";
$PersonalDataProfilingTitle = "Profilage des donnée personnelles";
$PersonalDataIntroductionText = "Nous respectons vos données personnelles! Cette page unit tous les aspects correspondants aux données personnelles que nous pourrions conserver à votre sujet, comment nous les traitons et ce que vous nous avez autorisé de faire avec, ainsi que qui nous sommes, dans un effort de correspondance à la majorité des lois de protection des données disponibles et applicables. Merci de llire l'information à votre disposition avec attention. Si vous avez des questions, merci de localiser nos données de contact ci-dessous et de nous y envoyer vos questions.";
$YourDegreeOfCertainty = "Votre degré de certitude";
$DegreeOfCertaintyThatMyAnswerIsCorrect = "Degré de certitude que la réponse soit jugée correcte";
$IncorrectAnswersX = "Réponses incorrectes: %s";
$KindRegards = "Cordialement,";
$DoNotReply = "Ne pas répondre";
$ResultAccomplishedTest = "Résultats du test réalisé";
$YourResultsByDiscipline = "Vos résultats discipline par discipline";
$ForComparisonYourLastResultToThisTest = "Pour comparaison, votre dernier résultat à ce test";
$YourOverallResultForTheTest = "Votre résultat sur l'ensemble du test";
$QuestionDegreeCertaintyHTMLMail = "Voici, ci-dessous vos résultats pour le test %s.<br />Pour consulter le détail des résultats <br /><br />1. Connectez-vous sur la plateforme Chamilo (identifiant/mot de passe universitaire): <a href='%s'>se connecter à Chamilo</a>.<br /><br />2. Puis cliquez sur ce lien: <a href='%s'>voir mes résultats détaillés</a>.<br /><br />";
$DegreeOfCertaintyVerySure = "Savoir certain";
$DegreeOfCertaintyVerySureDescription = "Votre réponse a été correcte et vous étiez sûr à 80% ou plus. Félicitations.";
$DegreeOfCertaintyPrettySure = "Savoir fragile";
$DegreeOfCertaintyPrettySureDescription = "Votre réponse était correcte mais vous étiez peu sûr (certitude 60% ou 70%)";
$DegreeOfCertaintyDeclaredIgnorance = "Ignorance déclarée";
$DegreeOfCertaintyDeclaredIgnoranceDescription = "Vous ne connaissiez pas la réponse - degré de certitude 50%";
$DegreeOfCertaintyUnsure = "Erreur présumée";
$DegreeOfCertaintyUnsureDescription = "Votre réponse était incorrecte, mais vous vous en doutiez (certitude 60% ou 70%)";
$DegreeOfCertaintyVeryUnsure = "Erreur dangereuse";
$DegreeOfCertaintyVeryUnsureDescription = "Votre réponse était incorrecte, mais vous en étiez sûr à 80% ou plus";
$DegreeOfCertaintyIDeclareMyIgnorance = "J’ignore la bonne réponse et j’ai choisi au hasard";
$DegreeOfCertaintyIAmVeryUnsure = "Je suis très peu sûr";
$DegreeOfCertaintyIAmUnsure = "Je suis peu sûr";
$DegreeOfCertaintyIAmPrettySure = "Je suis assez sûr";
$DegreeOfCertaintyIAmSure = "Je suis quasiment sûr";
$DegreeOfCertaintyIAmVerySure = "Je suis tout à fait sûr";
$MultipleAnswerTrueFalseDegreeCertainty = "Rép. multiples vrai/faux/degré de certitude";
$IgnoranceAnswersX = "Ignorance: %s";
$CorrectAnswersX = "Réponses correctes: %s";
$TotalHours = "Heures totales";
$MinutesPerDay = "Minutes par jour";
$ClassroomActivity = "Activité de classe";
$OneDay = "1 jour";
$UserXAnonymized = "Les données de l'utilisateur %s ont été anonymisées.";
$CannotAnonymizeUserX = "Impossible d'anonymiser les données de l'utilisateur %s. Merci d'essayer à nouveau ou de vérifier les logs.";
$NoPermissionToAnonymizeUserX = "Vous n'avez pas les permissions pour anonymiser l'utilisateur %s. Il s'agit des mêmes permissions que pour la suppression d'utilisateurs.";
$Anonymize = "Anonymiser";
$XQuestions = "%d questions";
$WebFolderRefreshSucceeded = "Les styles et fichiers statiques du répertoire web/ on été mis à jour.";
$WebFolderRefreshFailed = "Les styles et fichiers statiques du répertoire web/ n'ont pas pu être mis à jour, probablement à cause de problèmes de permissions. Assurez-vous que l'utilisateur système de votre serveur web puisse écrire dans le répertoire web/.";
$CopyTextToClipboard = "Copier le texte";
$WeNeedYouToAcceptOurTreatmentOfYourData = "Nous avons besoin que vous acceptiez notre traitement de vos données afin de vous fournir ce service. Si vous souhaitez créer un compte, veuillez en accepter les termes et cliquer sur Envoyer. Si vous n'acceptez pas, aucune donnée personnelle ne sera traitée par nous à votre sujet.";
$NoTermsAndConditionsAvailable = "Aucune condition d'utilisation disponible";
$Skype = "Skype";
$PersonalDataOfficerName = "Nom du délégué à la protection des données personnelles";
$PersonalDataOfficerRole = "Rôle du délégué à la protection des données personnelles";
$Assets = "Éléments extra (assets)";
$TotalLPTime = "Temps total parcours";
$AddStatus = "Ajouter un état";
$AddProject = "Ajouter un projet";
$AddPriority = "Ajouter une priorité";
$NotAccepted = "Rejeté";
$UserPermissions = "Permissions utilisateur";
$ExportToPdf = "Exporter en PDF";
$GoToThread = "Aller au fil de discussion";
$TimeDifference = "Différence de temps";
$SessionAdministrator = "Administrateur de sessions";
$ThereIsASequenceResourceLinkedToThisSessionYouNeedToDeleteItFirst = "Une ressource de séquence est liée à cette session. Vous devez d'abord supprimer ce lien.";
$AddAnnotationText = "Ajouter texte d'annotation";
$AddAnnotationPath = "Ajouter tracé d'annotation";
$Driver = "Pilote";
$UploadTmpDirInfo = "Le répertoire d'upload temporaire est un espace sur le serveur où les fichiers sont déposés temporairement avant d'être traités par PHP.";
$GenerateCustomReport = "Générer un rapport personnalisé";
$ToDo = "À faire";
$PleaseEnterURL = "Veuillez introduire l'URL";
$IfYouWantToGetTheCertificateAndOrSkillsAsociatedToThisCourseYouNeedToBuyTheCertificateServiceYouCanGoToServiceCatalogClickingHere = "Si vous souhaitez obtenir le certificat et/ou les compétences associés à ce cours, il est nécessaire d'acquérir le droit au certificat. Vous pouvez visualiser le catalogue de services ici: %s";
$SubSkill = "Sous-compétence";
$AddMultipleUsersToCalendar = "Ajouter plusieurs utilisateurs au calendrier";
$UpdateCalendar = "Mettre le calendrier à jour";
$ControlPoint = "Point de contrôle";
$MessageQuestionCertainty = "Suivez les instructions ci-dessous pour visualiser vos résultats pour le test %s:<br /><br />
1. Connectez-vous à la plateforme (utilisateur/mot de passe) sur: %s<br />
2. Suivez le lien suivant: %s<br />";
$SessionMinDuration = "Durée minimum de session";
$CanNotTranslate = "Impossible de traduire";
$AddSkills = "Ajouter compétences";
$Dictionary = "Dictionnaire";
$CategoryExists = "La catégorie existe";
$MinimumGradebookToValidate = "Minimum pour valider";
$NumberOfGradebookToValidateInDependence = "Nombre de cahiers de notes à valider dans les dépendances";
$DependsOnGradebook = "Dépend du cahier de note";
$ThisGradebookDoesntHaveDependencies = "Ce cahier de notes n'a aucune dépendance";
$CourseIntroductionsAllImportedSuccessfully = "Les introductions ont toutes été importées avec succès";
$FilterSessions = "Filtrer sessions";
$ScoreModel = "Modèle d'évaluation";
$SyncDatabaseWithSchema = "Synchroniser la base de données avec le schéma";
$SkillRelCourses = "Associations cours-compétences";
?>

@ -2822,8 +2822,8 @@ $OpenQuestionsAttemptedAre = "Die versuchte offene Frage ist";
$UploadJpgPicture = "Ein JPG Bild hochladen";
$HotspotDescription = "Hotspot Beschreibung";
$ExamSheetVCC = "Testergebnnis wurde vom Kursleiter angesehen / korrigiert / kommentiert.";
$AttemptVCC = "Ihr nachfolgende Einsendung wurde vom Kursleiter angesehen / kommentiert / korrigiert.";
$ClickLinkToViewComment = "Klicken Sie nachfolgenden Link, um zu Ihrem Zugang zu gelangen und Ihr kommentiertes testergebnis anzusehen";
$AttemptVCC = "Ihre nachfolgende Einsendung wurde vom Kursleiter angesehen / kommentiert / korrigiert.";
$ClickLinkToViewComment = "Klicken Sie auf den nachfolgenden Link, um zu Ihrem Zugang zu gelangen und Ihr kommentiertes testergebnis anzusehen";
$Regards = "Mit freundlichen Grüßen";
$AttemptVCCLong = "Ihre Einsendung von Test %s wurde vom Kursleiter angesehen / kommentiert / korrigiert. Klicken Sie den nachfolgenden Link, um zu Ihrem Zugang zu gelangen und Ihre Auswertung anzusehen.<br/n>/n";
$DearStudentEmailIntroduction = "Sehr geehrte(r) Teilnehmer(in),";
@ -7975,5 +7975,12 @@ $SendEmailToTeacherWhenStudentEndQuizOnlyIfOpenQuestion = "E-Mail an den Tutor s
$SendEmailToTeacherWhenStudentEndQuizOnlyIfOralQuestion = "E-Mail an den Tutor senden, wenn der Lernende eine Übung beendet hat, aber nur wenn er eine mündliche Frage beantwortet hat";
$TempScoreXQuestionsNotCorrectedYet = "Temporäre Auswertung: %s offene Frage(n) noch nicht korrigiert.";
$GoToSurvey = "Zur Umfrage";
$OralExpressionHelpText = "Du kannst während der Aufnahme auf « Aufnahme anhalten » klicken. Wenn du nicht zufrieden bist, nimm dich erneut auf. Dies wird die vorherige Aufnahme überschreiben. Zufrieden? Um deine Aufnahme zu senden, klick einfach auf « Übung beenden ».";
$MyGeneralCertificate = "Mein Zertifikat";
$BossAlertMsgSentToUserXTitle = "Follow-up Nachricht über Lernende %s";
$BossAlertUserXSentMessageToUserYWithLinkZ = "Hallo,<br/><br/>
Benutzer %s hat eine Follow-up-Nachricht zum Lernenden %s gesendet.<br/><br/>
Die Nachricht ist an %s sichtbar";
?>

@ -7656,4 +7656,5 @@ $LastXDays = "Ultimi %s giorni";
$ExportBadges = "Esporta i badge";
$LanguagesDisableAllExceptDefault = "Abilita solo la lingua d default della piattaforma";
$ThereAreUsersUsingThisLanguagesDisableItManually = "Alcuni utenti usano questa lingua: è necessario disabilitarla manualmente";
$ExportToChamiloFormat = "Esporta un Modulo didattico";
?>

@ -104,7 +104,7 @@ $MultiplicationStar = "Multiplicación:\t\t\t*";
$SubstractionMinus = "Resta:\t\t\t\t-";
$SummationPlus = "Suma:\t\t\t\t+";
$NotationList = "Notación para fórmula";
$SubscribeToSessionRequest = "Solicitud de inscripción a una sesión";
$SubscribeToSessionRequest = "Solicitar inscripción";
$PleaseSubscribeMeToSession = "Por favor suscribirme a la sesión";
$SearchActiveSessions = "Buscar sesiones activas";
$UserNameHasDash = "El nombre de usuario no puede contener el caracter '-'";
@ -115,7 +115,7 @@ $GiveFormula = "Por favor, escriba la fórmula";
$SignatureFormula = "Cordialmente";
$FormulaExample = "Ejemplo de fórmula: sqrt( [x] / [y] ) * ( e ^ ( ln(pi) ) )";
$VariableRanges = "Rangos de las variables";
$ExampleValue = "Valor del rango";
$ExampleValue = "Ejemplo de valor en el rango";
$CalculatedAnswer = "Pregunta calculada";
$UserIsCurrentlySubscribed = "El usuario está actualmente suscrito";
$OnlyBestAttempts = "Solo los mejores intentos";
@ -751,7 +751,7 @@ $ToolIntro = "Textos de introducción";
$UploadError = "Error de envío, revise tamaño máximo del archivo y los permisos del directorio.";
$DocumentsWillBeAddedToo = "Los documentos también serán añadidos";
$ToExportLearnpathWithQuizYouHaveToSelectQuiz = "Si quiere exportar una lección que contenga ejercicios, tendrá que asegurarse de que estos ejercicios han sido incluidos en la exportación; para eso tendrá que haberlos seleccionado en la lista de ejercicios.";
$ArchivesDirectoryNotWriteableContactAdmin = "El directorio \"archive\" utilizado por esta herramienta no tiene habilitado los permisos de escritura. Contacte al administrador de la plataforma.";
$ArchivesDirectoryNotWriteableContactAdmin = "El directorio \"app/cache/\" utilizado por esta herramienta no tiene habilitado los permisos de escritura. Contacte al administrador de la plataforma.";
$DestinationCourse = "Curso de destino";
$ConvertToMultipleAnswer = "Convertir a respuesta múltiple";
$CasMainActivateComment = "Activar la autentificación CAS permitirá a usuarios autentificarse con sus credenciales CAS";
@ -1513,7 +1513,7 @@ $administratorNameComment = "El nombre del administrador de la plataforma (apare
$ShowAdministratorDataTitle = "Información del administrador de la plataforma en el pie";
$ShowAdministratorDataComment = "¿ Mostrar la información del administrador de la plataforma en el pie ?";
$HomepageViewTitle = "Vista de la página principal";
$HomepageViewComment = "¿ Cómo quiere que se presente la página principal del curso ?";
$HomepageViewComment = "¿Cómo quiere que se presente la página principal del curso (disposición de iconos)?";
$HomepageViewDefault = "Presentación en dos columnas. Las herramientas desactivadas quedan escondidas";
$HomepageViewFixed = "Presentación en tres columnas. Las herramientas desactivadas aparecen en gris (los iconos se mantienen en su lugar).";
$ShowToolShortcutsTitle = "Barra de acceso rápido a las herramientas";
@ -1717,9 +1717,9 @@ $AccountValidDurationTitle = "Validez de la cuenta";
$AccountValidDurationComment = "Una cuenta de usuario es válida durante este número de días a partir de su creación";
$UseSessionModeTitle = "Usar sesiones de formación";
$UseSessionModeComment = "Las sesiones ofrecen una forma diferente de tratar los cursos, donde el curso tiene un creador, un tutor y unos estudiantes. Cada tutor imparte un curso por un perido de tiempo, llamado *sesión*, a un conjunto de estudiantes";
$HomepageViewActivity = "Ver la actividad";
$HomepageView2column = "Visualización en dos columnas";
$HomepageView3column = "Visualización en tres columnas";
$HomepageViewActivity = "Vista tipo Actividad";
$HomepageView2column = "Vista en dos columnas";
$HomepageView3column = "Vista en tres columnas";
$AllowUserHeadings = "Permitir encabezados de usuarios";
$IconsOnly = "Sólo iconos";
$TextOnly = "Sólo texto";
@ -2375,7 +2375,7 @@ $GroupDescription = "Descripción del grupo";
$GroupMembers = "Miembros del grupo";
$EditGroup = "Modificar este grupo";
$GroupSettingsModified = "Configuración del grupo modificada";
$GroupTooMuchMembers = "El número propuesto excede el máximo que Ud. autoriza (puede modificarlo debajo). \t\t\t\tLa composición del grupo no se ha modificado";
$GroupTooMuchMembers = "El número propuesto excede el máximo que Ud. autoriza (puede modificarlo en los parámetros del grupo). La composición del grupo no se ha modificado";
$GroupTutor = "Tutor del grupo";
$GroupNoTutor = "(ninguno)";
$GroupNone = "(ninguno)";
@ -2547,7 +2547,7 @@ $WarningEditingDocument = "Cuando edita un documento existente en la lección, l
$CreateTheExercise = "Crear el ejercicio";
$MoveTheCurrentExercise = "Mover el ejercicio actual";
$EditCurrentExecice = "Editar el ejercicio actual";
$UploadScorm = "Importación SCORM y AICC";
$UploadScorm = "Importación SCORM, AICC y Lección";
$PowerPointConvert = "Conversión PowerPoint";
$LPCreatedToContinue = "Para continuar, añada a su lección una sección o un objeto de aprendizaje";
$LPCreatedAddChapterStep = "<html><body><p><big><img height=\"250\" width=\"250\" align=\"right\" src=\"images/gallery/mr_dokeos/animated/practicerAnim.gif\" alt=\"practicerAnim.gif\" />¡ Bienvenido a la herramienta de autor de Chamilo !</big></p> <ul> <li><b>Construir</b> : Añada objetos de aprendizaje a su lección</li> <li><b>Organizar</b> : Añada comentarios de audio y ordene sus objetos de aprendizaje en la tabla de contenidos</li> <li><b>Mostrar</b> : Vea la lección como la vería un estudiante</li> <li><b>Añadir una sección</b> : Capítulo 1, Capítulo 2 o Semana 1, Semana 2...</li> <li><b>Añadir un objeto de aprendizaje</b> : construya su lección paso a paso con documentos, ejercicios y actividades, contando con la ayuda de plantillas, mascotas y galerías multimedia</li> </ul> </html></body>";
@ -4221,7 +4221,7 @@ $ToolName = "Importar cursos de Blackboard";
$TrackingDisabled = "El seguimiento ha sido deshabilitado por el administrador del sistema.";
$InactivesStudents = "Estudiantes que no se han conectado al menos durante una semana";
$AverageTimeSpentOnThePlatform = "Tiempo medio de conexión a la plataforma";
$AverageCoursePerStudent = "Media de cursos por usuario";
$AverageCoursePerStudent = "Media de cursos en los cuales mis alumnos están inscritos";
$AverageProgressInLearnpath = "Progreso medio en las lecciones";
$AverageResultsToTheExercices = "Puntuación en los ejercicios";
$SeeStudentList = "Ver la lista de usuarios";
@ -5163,7 +5163,7 @@ $MakeQualifiable = "Permitir calificar en la herramienta de evaluaciones";
$QualificationNumberOver = "Calificación sobre";
$WeightInTheGradebook = "Ponderación en el promedio de la evaluación";
$DatesAvailables = "Fechas disponibles";
$ExpiresAt = "Expira en";
$ExpiresAt = "Fecha límite publicada del envio";
$DirectoryCreated = "La tarea ha sido creada";
$Assignment = "Tarea";
$ExpiryDateToSendWorkIs = "Fecha de vencimiento para enviar tareas";
@ -5795,7 +5795,7 @@ $AssignUsersToPlatformAdministrator = "Asignar usuarios al administrador de la p
$AssignedUsersListToPlatformAdministrator = "Lista de usuarios asignados al administrador de la plataforma";
$AssignedCoursesListToHumanResourcesManager = "Lista de cursos asignados al administrador de recursos humanos";
$ThereAreNotCreatedCourses = "No hay cursos creados";
$HomepageViewVerticalActivity = "Ver la actividad en forma vertical";
$HomepageViewVerticalActivity = "Vista tipo actividad en forma vertical";
$GenerateSurveyAccessLink = "Generar enlace de acceso a encuesta";
$CoursesInformation = "Información de cursos";
$LearnpathVisible = "Lección hecha visible";
@ -6389,7 +6389,7 @@ $ShowGroupsToUsersComment = "Mostrar las clases a los usuarios. Las clases son u
$ExerciseWillBeActivatedFromXToY = "El ejercicio estará visible del %s al %s";
$ExerciseAvailableFromX = "Ejercicio disponible desde el %s";
$ExerciseAvailableUntilX = "Ejercicio disponible hasta el %s";
$HomepageViewActivityBig = "Vista grandes iconos";
$HomepageViewActivityBig = "Vista actividad con grandes iconos";
$CheckFilePermissions = "Verificar permisos de ficheros";
$AddedToALP = "Añadido a una lección";
$NotAvailable = "No disponible";
@ -6616,7 +6616,7 @@ $BestScoredPages = "Páginas con mejor puntuación";
$MProgressPages = "Páginas con mayor progreso";
$MostDiscussUsers = "Usuarios más discutidos";
$RandomPage = "Página aleatoria";
$DateExpiredNotBeLessDeadLine = "La fecha de caducidad no puede ser menor que la fecha límite";
$DateExpiredNotBeLessDeadLine = "La fecha de bloqueo efectivo del envío del trabajo no puede ser antes de la fecha límite de publicación mostrada";
$NotRevised = "No se ha revisado";
$DirExists = "Operación imposible, ya existe un directorio con el mismo nombre.";
$DocMv = "Documento movido";
@ -8092,7 +8092,7 @@ $ThisEmailWasSentViaCourseXInSessionX = "Este correo electrónico fue enviado a
$Diagram = "Diagrama";
$CareerXDoesntHaveADiagram = "La carrera %s no tiene un diagrama.";
$ExerciseCategoryAllSessionsReport = "Informe de ejercicio por categoria en todas las sesiones";
$MailConfirmation = "Activar cuenta por correo electrónico de confirmación";
$MailConfirmation = "Requerir confirmación por correo electrónico";
$RegistrationConfirmation = "Confirmación de registro";
$AccountNotConfirmed = "Su cuenta está inactiva porque aún no la ha confirmado. Revise su correo electrónico y siga las instrucciones o haga click en el siguiente enlace para volver a enviar el correo electrónico de confirmación.";
$RegistrationConfirmationEmailMessage = "Para completar su registro en la plataforma, necesita confirmar su cuenta haciendo click en el siguiente enlace";
@ -8148,4 +8148,155 @@ $YourResultAtXBlocksThisElement = "El resultado en el item \"%s\" bloquea esta e
$RegistrationRoleWhatDoYouWantToDo = "¿Qué deseas hacer?";
$RegistrationRoleFollowCourses = "Seguir cursos";
$RegistrationRoleTeachCourses = "Dictar cursos";
$EditPortfolioItem = "Editar elemento del portafolio";
$PortfolioItemAdded = "Elemento del portafolio editado";
$ExploreMoreCourses = "Explorar más cursos";
$LinksOfInterest = "Enlaces de interés";
$ExportToChamiloFormat = "Exportación de la lección";
$CoursesComingSoon = "Cursos disponibles próximamente";
$SalePrice = "Precio de venta";
$BuyNow = "Comprar ahora";
$DocumentGroupCollaborationMode = "Modo colaboración";
$DocumentGroupReadOnlyMode = "Modo lectura sola";
$GroupDocumentAccess = "Acceso a documento";
$DocumentGroupShareMode = "Modo compartido";
$SessionDurationXDaysTotal = "Esta sesión tiene una duración limitada a %s días";
$LastMonth = "Mes pasado";
$ThisMonth = "Este mes";
$PortalUserSessionStats = "Número de alumnos por sesión y portal";
$AddCustomToolsIntro = "Esta sección es invisible para los estudiantes hasta que la modifique. Puede añadir una introducción a la herramienta, como un texto de ayuda para sus estudiantes, dando clic en el icono de edición.";
$TheDocumentAutoLaunchSettingIsOnStudentsWillBeRedirectToTheDocumentTool = "La funcionalidad de lanzamiento automático de documentos está activada. Los estudiantes serán redirigidos automáticamente a la herramienta de documentos.";
$DocumentAutoLaunch = "Lanzamiento automático para documentos";
$RedirectToTheDocumentList = "Redirigir a la lista de documentos";
$TheExerciseAutoLaunchSettingIsONStudentsWillBeRedirectToTheExerciseList = "La funcionalidad de lanzamiento automático de ejercicios está activada. Los estudiantes serán automáticamente redirigidos a la lista de ejercicios.";
$PostedExpirationDate = "Fecha límite publicada para enviar el trabajo (visible para el alumno)";
$BossAlertMsgSentToUserXTitle = "Mensaje de seguimiento sobre alumno %s";
$BossAlertUserXSentMessageToUserYWithLinkZ = "Hola,<br/><br/>
El usuario %s ha enviado un mensaje de seguimiento sobre el alumno %s.<br/><br/>
El mensaje se puede ver en %s";
$include_services = "Incluir los servicios";
$culqi_enable = "Activar Culqi";
$SelectedUsersDisabled = "Todos los usuarios seleccionados han sido desactivado.";
$SomeUsersNotDisabled = "Algunos de los usuarios seleccionados no han sido desactivado. Le recomendamos una verificación adicional a través de la búsqueda avanzada.";
$SelectedUsersEnabled = "Todos los usuarios seleccionados han sido activado.";
$SomeUsersNotEnabled = "Algunos de los usuarios seleccionados no han sido activado. Le recomendamos una verificación adicional a través de la búsqueda avanzada.";
$EncryptedData = "Datos cifrados";
$RandomData = "Datos aleatorios";
$PersonalDataReport = "Datos personales";
$ComplexDataNotShown = "Datos complejos (no representados)";
$PersonalDataIntroductionTitle = "Datos personales: introducción";
$PersonalDataKeptOnYou = "Datos personales que guardamos sobre Usted";
$PersonalDataPermissionsYouGaveUs = "Permisos que nos dió";
$PersonalDataResponsibleOrganizationTitle = "Organización responsable por el tratamiento de sus datos personales";
$PersonalDataTreatmentTitle = "Tratamiento de sus datos personales";
$PersonalDataCollectionTitle = "Colección de sus datos personales";
$PersonalDataRecordingTitle = "Registro de sus datos personales";
$PersonalDataOrganizationTitle = "Organización de sus datos personales";
$PersonalDataStructureTitle = "Estructuración de sus datos personales";
$PersonalDataConservationTitle = "Conservación de sus datos personales";
$PersonalDataAdaptationTitle = "Adaptación o modificación de sus datos personales";
$PersonalDataExtractionTitle = "Extracción de sus datos personales";
$PersonalDataConsultationTitle = "Consultación de sus datos personales";
$PersonalDataUsageTitle = "Uso de sus datos personales";
$PersonalDataCommunicationTitle = "Comunicación y difusión de sus datos personales";
$PersonalDataInterconnectionTitle = "Interconexión de sus datos personales";
$PersonalDataLimitationTitle = "Limitación de sus datos personales";
$PersonalDataDeletionTitle = "Eliminación de sus datos personales";
$PersonalDataDestructionTitle = "Destrucción de sus datos personales";
$PersonalDataProfilingTitle = "Perfilado de sus datos personales";
$PersonalDataIntroductionText = "Respetamos sus datos personales! Esta página une todos los aspectos de los datos personales que podríamos conservar sobre Usted, como los tratamos, lo que nos permitió hacer con ellos y quienes somos, en un esfuerzo para cumplir con todas las normativas sobre los datos personales existentes y aplicables. Gracias por leer con mucha atención la información puesta a su disposición a continuación. Si le quedan dudas, revise los datos de contactos más a bajo y envíenos sus consultas.";
$YourDegreeOfCertainty = "Su grado de certeza";
$DegreeOfCertaintyThatMyAnswerIsCorrect = "Grado de certeza que mi respuesta será considerada correcta";
$IncorrectAnswersX = "Respuestas incorrectas: %s";
$KindRegards = "Cordialmente,";
$DoNotReply = "No responder";
$ResultAccomplishedTest = "Resultados de la prueba dada";
$YourResultsByDiscipline = "Sus notas, disciplina por disciplina";
$ForComparisonYourLastResultToThisTest = "En comparación, su última nota para esta prueba";
$YourOverallResultForTheTest = "Su nota para la prueba en general";
$QuestionDegreeCertaintyHTMLMail = "Encontrará su nota a continuación para la prueba %s.<br />
Para ver más detalles:
<br /><br />
1. Conectarse a la plataforma (usuario/contraseña usual): <a href='%s'>Hacia la plataforma</a>.
<br /><br />
2. Seguir este enlace: <a href='%s'>Ver resultados más detallados</a>.";
$DegreeOfCertaintyVerySure = "Muy seguro";
$DegreeOfCertaintyVerySureDescription = "Dió la respuesta correcta y estaba seguro de ella al 80% ¡Felicitaciones!";
$DegreeOfCertaintyPrettySure = "Bastante seguro";
$DegreeOfCertaintyPrettySureDescription = "Dió la respuesta correcta pero no estaba completamente seguro (entre 60% y 70% seguro)";
$DegreeOfCertaintyDeclaredIgnorance = "Ignorancia declarada";
$DegreeOfCertaintyDeclaredIgnoranceDescription = "No sabía la respuesta - solo 50% de certeza";
$DegreeOfCertaintyUnsure = "Inseguro";
$DegreeOfCertaintyUnsureDescription = "Dió la respuesta incorrecta, pero intuía que no era correcta (60% a 70% de certeza)";
$DegreeOfCertaintyVeryUnsure = "Muy inseguro";
$DegreeOfCertaintyVeryUnsureDescription = "Dió la respuesta incorrecta a pesar de tener 80% de certeza de que no era la correcta";
$DegreeOfCertaintyIDeclareMyIgnorance = "No conozco la respuesta y he seleccionado al azar";
$DegreeOfCertaintyIAmVeryUnsure = "Estoy muy inseguro";
$DegreeOfCertaintyIAmUnsure = "Estoy inseguro";
$DegreeOfCertaintyIAmPrettySure = "Estoy más o menos seguro";
$DegreeOfCertaintyIAmSure = "Estoy bastante seguro";
$DegreeOfCertaintyIAmVerySure = "Estoy muy seguro";
$MultipleAnswerTrueFalseDegreeCertainty = "Respuestas múltiples v/f/grado de certeza";
$IgnoranceAnswersX = "Ignorancia: %s";
$CorrectAnswersX = "Respuestas correctas: %s";
$TotalHours = "Horas totales";
$MinutesPerDay = "Minutos por día";
$ClassroomActivity = "Actividad de la clase";
$OneDay = "1 día";
$UserXAnonymized = "Los datos del usuario %s fueron anonimizados.";
$CannotAnonymizeUserX = "No se han podido anonimizar los datos del usuario %s. Por favor intente nuevamente o verifique los registros de error del servidor.";
$NoPermissionToAnonymizeUserX = "No tiene los permisos necesarios para anonimizar el usuario %s. Se tratan de los mismos permisos necesarios para eliminar usuarios.";
$Anonymize = "Anonimizar";
$XQuestions = "%d preguntas";
$WebFolderRefreshSucceeded = "Los estilos y archivos estáticos de la carpeta web/ han sido actualizados.";
$WebFolderRefreshFailed = "Los estilos y archivos estáticos de la carpeta web/ no han podido ser actualizados, probablemente debido a un problema de permisos. Asegúrese que el usuario sistema de su servidor web tenga los permisos suficientes para escribir en esta carpeta.";
$CopyTextToClipboard = "Copiar Texto";
$WeNeedYouToAcceptOurTreatmentOfYourData = "Necesitamos que acepte nuestro tratamiento de sus datos para poder brindarle este servicio. Si desea registrar una cuenta, acepte los términos y haga clic en Enviar. Si no acepta, no trataremos datos personales sobre usted.";
$NoTermsAndConditionsAvailable = "Ninguna condición de uso disponible";
$Skype = "Skype";
$PersonalDataOfficerName = "Nombre del oficial de protección de datos";
$PersonalDataOfficerRole = "Rol del oficial de protección de datos";
$Assets = "Elementos extra (assets)";
$TotalLPTime = "Tiempo total lecciones";
$AddStatus = "Agregar estado";
$AddProject = "Agregar proyecto";
$AddPriority = "Agregar prioridad";
$NotAccepted = "Rechazado";
$UserPermissions = "Permisos usuario";
$ExportToPdf = "Exportar en PDF";
$GoToThread = "Ir al hilo de discusión";
$TimeDifference = "Diferencia de tiempo";
$SessionAdministrator = "Administrador de sesiones";
$ThereIsASequenceResourceLinkedToThisSessionYouNeedToDeleteItFirst = "Existe un recurso de sequencia vinculado a esta sesión. Tiene que borrar el vínculo primero.";
$AddAnnotationText = "Agregar texto de anotación";
$AddAnnotationPath = "Agregar trazado de anotación";
$Driver = "Piloto";
$UploadTmpDirInfo = "La carpeta de subida temporal es un espacio en el servidor donde los archivos son subidos antes de ser filtrados y tratados por PHP.";
$GenerateCustomReport = "Generar reporte personalizado";
$ToDo = "Por hacer";
$PleaseEnterURL = "Ingrese la URL";
$IfYouWantToGetTheCertificateAndOrSkillsAsociatedToThisCourseYouNeedToBuyTheCertificateServiceYouCanGoToServiceCatalogClickingHere = "Si desea obtener el certificado y/o la competencia de este curso, necesita adquirir el derecho a certificado. Puede visitar el catálogo de servicios aquí: %s";
$SubSkill = "Sub-competencia";
$AddMultipleUsersToCalendar = "Agregar múltiples usuarios al calendario";
$UpdateCalendar = "Actualizar calendario";
$ControlPoint = "Punto de control";
$MessageQuestionCertainty = "Siga las instrucciones a continuación para ver sus resultados de la prueba '%s' a detalle:<br /><br />
1. Conéctese a la plataforma (con login/constraseña) en: %s<br />
2. De click en el enlace siguiente: Ms<br />";
$SessionMinDuration = "Duración mín de sesión";
$CanNotTranslate = "No se pudo traducir";
$AddSkills = "Agregar competencias";
$Dictionary = "Diccionario";
$CategoryExists = "La categoría existe";
$MinimumGradebookToValidate = "Mínimo para validar";
$NumberOfGradebookToValidateInDependence = "Número de evaluaciones por validar en las dependencias";
$DependsOnGradebook = "Depende de la evaluación";
$ThisGradebookDoesntHaveDependencies = "Esta evaluación no tiene dependencia";
$CourseIntroductionsAllImportedSuccessfully = "Todas las introducciones de cursos fueron importadas exitosamente.";
$FilterSessions = "Filtrar sesiones";
$ScoreModel = "Modelo de evaluación";
$SyncDatabaseWithSchema = "Sincronizar la base de datos con el esquema";
$SkillRelCourses = "Asociaciones cursos-competencias";
?>

@ -0,0 +1,397 @@
<?php
/* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Entity\Repository\LegalRepository;
/**
* @package chamilo.messages
*/
$cidReset = true;
require_once __DIR__.'/../inc/global.inc.php';
api_block_anonymous_users();
if (!api_get_configuration_value('enable_gdpr')) {
api_not_allowed(true);
}
$userId = api_get_user_id();
$userInfo = api_get_user_info();
$substitutionTerms = [
'password' => get_lang('EncryptedData'),
'salt' => get_lang('RandomData'),
'empty' => get_lang('NoData'),
];
$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : '';
$formToString = '';
if (api_get_setting('allow_terms_conditions') === 'true') {
$form = new FormValidator('delete_term', 'post', api_get_self().'?action=delete_legal&user_id='.$userId);
$form->addHtml(Display::return_message(get_lang('WhyYouWantToDeleteYourLegalAgreement')));
$form->addTextarea('explanation', get_lang('ExplanationDeleteLegal'), [], true);
$form->addHidden('action', 'delete_legal');
$form->addButtonSave(get_lang('DeleteLegal'));
$formToString = $form->returnForm();
$formDelete = new FormValidator('delete_account', 'post', api_get_self().'?action=delete_account&user_id='.$userId);
$formDelete->addTextarea('explanation', get_lang('ExplanationDeleteAccount'), [], true);
$formDelete->addHidden('action', 'delete_account');
$formDelete->addButtonDelete(get_lang('DeleteAccount'));
$formToString .= $formDelete->returnForm();
}
switch ($action) {
case 'send_legal':
$language = api_get_interface_language();
$language = api_get_language_id($language);
$terms = LegalManager::get_last_condition($language);
if (!$terms) {
//look for the default language
$language = api_get_setting('platformLanguage');
$language = api_get_language_id($language);
$terms = LegalManager::get_last_condition($language);
}
$legalAcceptType = $terms['version'].':'.$terms['language_id'].':'.time();
UserManager::update_extra_field_value(
$userId,
'legal_accept',
$legalAcceptType
);
Event::addEvent(
LOG_TERM_CONDITION_ACCEPTED,
LOG_USER_OBJECT,
api_get_user_info($userId),
api_get_utc_datetime()
);
$bossList = UserManager::getStudentBossList($userId);
if (!empty($bossList)) {
$bossList = array_column($bossList, 'boss_id');
$currentUserInfo = api_get_user_info($userId);
foreach ($bossList as $bossId) {
$subjectEmail = sprintf(
get_lang('UserXSignedTheAgreement'),
$currentUserInfo['complete_name']
);
$contentEmail = sprintf(
get_lang('UserXSignedTheAgreementTheDateY'),
$currentUserInfo['complete_name'],
api_get_local_time($time)
);
MessageManager::send_message_simple(
$bossId,
$subjectEmail,
$contentEmail,
$user_id
);
}
}
Display::addFlash(Display::return_message(get_lang('Saved')));
break;
case 'delete_account':
if ($formDelete->validate()) {
$explanation = $formDelete->getSubmitValue('explanation');
UserManager::createDataPrivacyExtraFields();
// Remove delete agreement if it was sent:
UserManager::update_extra_field_value(
$userId,
'request_for_legal_agreement_consent_removal',
''
);
UserManager::update_extra_field_value(
$userId,
'request_for_legal_agreement_consent_removal_justification',
''
);
UserManager::update_extra_field_value(
$userId,
'request_for_delete_account',
1
);
UserManager::update_extra_field_value(
$userId,
'request_for_delete_account_justification',
$explanation
);
Display::addFlash(Display::return_message(get_lang('Saved')));
Event::addEvent(
LOG_USER_DELETE_ACCOUNT_REQUEST,
LOG_USER_OBJECT,
$userInfo
);
$url = api_get_path(WEB_CODE_PATH).'admin/';
$link = Display::url($url, $url);
$subject = get_lang('RequestForDeleteAccount');
$content = sprintf(
get_lang('TheUserXAskDeleteAccountWithJustifactionXGoHereX'),
$userInfo['complete_name'],
$explanation,
$link
);
$email = api_get_configuration_value('data_protection_officer_email');
if (!empty($email)) {
api_mail_html('', $email, $subject, $content);
} else {
MessageManager::sendMessageToAllAdminUsers(api_get_user_id(), $subject, $content);
}
}
break;
case 'delete_legal':
if ($form->validate()) {
$explanation = $form->getSubmitValue('explanation');
UserManager::createDataPrivacyExtraFields();
UserManager::update_extra_field_value(
$userId,
'request_for_legal_agreement_consent_removal',
1
);
UserManager::update_extra_field_value(
$userId,
'request_for_legal_agreement_consent_removal_justification',
$explanation
);
/*$extraFieldValue = new ExtraFieldValue('user');
$value = $extraFieldValue->get_values_by_handler_and_field_variable(
$userId,
'legal_accept'
);
$result = $extraFieldValue->delete($value['id']);*/
Display::addFlash(Display::return_message(get_lang('Sent')));
Event::addEvent(
LOG_USER_REMOVED_LEGAL_ACCEPT,
LOG_USER_OBJECT,
$userInfo
);
$url = api_get_path(WEB_CODE_PATH).'admin/';
$link = Display::url($url, $url);
$subject = get_lang('RequestForLegalConsentRemoval');
$content = sprintf(
get_lang('TheUserXAskRemovalWithJustifactionXGoHereX'),
$userInfo['complete_name'],
$explanation,
$link
);
$email = api_get_configuration_value('data_protection_officer_email');
if (!empty($email)) {
api_mail_html('', $email, $subject, $content);
} else {
MessageManager::sendMessageToAllAdminUsers(api_get_user_id(), $subject, $content);
}
}
break;
}
$propertiesToJson = UserManager::getRepository()->getPersonalDataToJson($userId, $substitutionTerms);
if (!empty($_GET['export'])) {
$filename = md5(mt_rand(0, 1000000)).'.json';
$path = api_get_path(SYS_ARCHIVE_PATH).$filename;
$writeResult = file_put_contents($path, $propertiesToJson);
if ($writeResult !== false) {
DocumentManager::file_send_for_download($path, true, $filename);
exit;
}
}
$allowSocial = api_get_setting('allow_social_tool') === 'true';
$nameTools = get_lang('PersonalDataReport');
$show_message = null;
if ($allowSocial) {
$this_section = SECTION_SOCIAL;
$interbreadcrumb[] = [
'url' => api_get_path(WEB_PATH).'main/social/home.php',
'name' => get_lang('SocialNetwork'),
];
} else {
$this_section = SECTION_MYPROFILE;
$interbreadcrumb[] = [
'url' => api_get_path(WEB_PATH).'main/auth/profile.php',
'name' => get_lang('Profile'),
];
}
$interbreadcrumb[] = ['url' => '#', 'name' => get_lang('PersonalDataReport')];
// LEFT CONTENT
$socialMenuBlock = '';
if ($allowSocial) {
// Block Social Menu
$socialMenuBlock = SocialManager::show_social_menu('personal-data');
}
// MAIN CONTENT
$personalDataContent = '<ul>';
$properties = json_decode($propertiesToJson);
foreach ($properties as $key => $value) {
if (is_array($value) || is_object($value)) {
switch ($key) {
case 'extraFields':
$personalDataContent .= '<li>'.$key.': </li><ul>';
foreach ($value as $subValue) {
$personalDataContent .= '<li>'.$subValue->variable.': '.$subValue->value.'</li>';
}
$personalDataContent .= '</ul>';
break;
case 'portals':
case 'roles':
case 'achievedSkills':
case 'sessionAsGeneralCoach':
case 'classes':
case 'courses':
case 'groupNames':
case 'groups':
$personalDataContent .= '<li>'.$key.': </li><ul>';
foreach ($value as $subValue) {
$personalDataContent .= '<li>'.$subValue.'</li>';
}
$personalDataContent .= '</ul>';
break;
case 'sessionCourseSubscriptions':
$personalDataContent .= '<li>'.$key.': </li><ul>';
foreach ($value as $session => $courseList) {
$personalDataContent .= '<li>'.$session.'<ul>';
foreach ($courseList as $course) {
$personalDataContent .= '<li>'.$course.'</li>';
}
$personalDataContent .= '</ul>';
}
$personalDataContent .= '</ul>';
break;
default:
//var_dump($key);
break;
}
/*foreach ($value as $subValue) {
foreach ($subValue as $subSubValue) {
var_dump($subSubValue);
//$personalDataContent .= '<li>'.$subSubValue.'</li>';
}
}*/
//skip in some cases
/*sif (!empty($value['date'])) {
$personalDataContent .= '<li>'.$key.': '.$value['date'].'</li>';
} else {
$personalDataContent .= '<li>'.$key.': '.get_lang('ComplexDataNotShown').'</li>';
}*/
} else {
$personalDataContent .= '<li>'.$key.': '.$value.'</li>';
}
}
$personalDataContent .= '</ul>';
// Check terms acceptation
$permitionBlock = '';
if (api_get_setting('allow_terms_conditions') === 'true') {
$extraFieldValue = new ExtraFieldValue('user');
$value = $extraFieldValue->get_values_by_handler_and_field_variable(
$userId,
'legal_accept'
);
$permitionBlock .= Display::return_icon('accept_na.png', get_lang('NotAccepted'));
if (isset($value['value']) && !empty($value['value'])) {
list($legalId, $legalLanguageId, $legalTime) = explode(':', $value['value']);
$permitionBlock = get_lang('CurrentStatus').': '.
Display::return_icon('accept.png', get_lang('LegalAgreementAccepted')).get_lang('LegalAgreementAccepted').
'<br />';
$permitionBlock .= get_lang('Date').': '.api_get_local_time($legalTime).'<br />';
$permitionBlock .= $formToString;
/*$permitionBlock .= Display::url(
get_lang('DeleteLegal'),
api_get_self().'?action=delete_legal&user_id='.$userId,
['class' => 'btn btn-danger btn-xs']
);*/
} else {
// @TODO add action handling for button
$permitionBlock .= Display::url(
get_lang('SendLegal'),
api_get_self().'?action=send_legal&user_id='.$userId,
['class' => 'btn btn-primary btn-xs']
);
}
} else {
$permitionBlock .= get_lang('NoTermsAndConditionsAvailable');
}
//Build the final array to pass to template
$personalData = [];
$personalData['data'] = $personalDataContent;
//$personalData['responsible'] = api_get_setting('personal_data_responsible_org');
$em = Database::getManager();
/** @var LegalRepository $legalTermsRepo */
$legalTermsRepo = $em->getRepository('ChamiloCoreBundle:Legal');
// Get data about the treatment of data
$treatmentTypes = LegalManager::getTreatmentTypeList();
foreach ($treatmentTypes as $id => $item) {
$personalData['treatment'][$item]['title'] = get_lang('PersonalData'.ucfirst($item).'Title');
$legalTerm = $legalTermsRepo->findOneByTypeAndLanguage($id, api_get_language_id($user_language));
$legalTermContent = '';
if (!empty($legalTerm[0]) && is_array($legalTerm[0])) {
$legalTermContent = $legalTerm[0]['content'];
}
$personalData['treatment'][$item]['content'] = $legalTermContent;
}
$officerName = api_get_configuration_value('data_protection_officer_name');
$officerRole = api_get_configuration_value('data_protection_officer_role');
$officerEmail = api_get_configuration_value('data_protection_officer_email');
if (!empty($officerName)) {
$personalData['officer_name'] = $officerName;
$personalData['officer_role'] = $officerRole;
$personalData['officer_email'] = $officerEmail;
}
$tpl = new Template(null);
$actions = Display::url(
Display::return_icon('excel.png', get_lang('Export'), [], ICON_SIZE_MEDIUM),
api_get_path(WEB_CODE_PATH).'social/personal_data.php?export=1'
);
$tpl->assign('actions', Display::toolbarAction('toolbar', [$actions]));
$termLink = '';
if (api_get_setting('allow_terms_conditions') === 'true') {
$url = api_get_path(WEB_CODE_PATH).'social/terms.php';
$termLink = Display::url($url, $url);
}
// Block Social Avatar
SocialManager::setSocialUserBlock($tpl, api_get_user_id(), 'messages');
if (api_get_setting('allow_social_tool') === 'true') {
$tpl->assign('social_menu_block', $socialMenuBlock);
$tpl->assign('personal_data', $personalData);
} else {
$tpl->assign('social_menu_block', '');
$tpl->assign('personal_data_block', $personalDataContent);
}
$tpl->assign('permission', $permitionBlock);
$tpl->assign('term_link', $termLink);
$socialLayout = $tpl->get_template('social/personal_data.tpl');
$tpl->display($socialLayout);

@ -0,0 +1,52 @@
<?php
/* For licensing terms, see /license.txt */
$cidReset = true;
require_once __DIR__.'/../inc/global.inc.php';
if (api_get_setting('allow_terms_conditions') !== 'true') {
api_not_allowed(true);
}
api_block_anonymous_users();
$language = api_get_interface_language();
$language = api_get_language_id($language);
$term = LegalManager::get_last_condition($language);
if (!$term) {
// look for the default language
$language = api_get_setting('platformLanguage');
$language = api_get_language_id($language);
$term = LegalManager::get_last_condition($language);
}
$socialMenuBlock = '';
$allowSocial = api_get_setting('allow_social_tool') === 'true';
if ($allowSocial) {
// Block Social Menu
$socialMenuBlock = SocialManager::show_social_menu('personal-data');
}
$tpl = new Template(null);
$actions = Display::url(
Display::return_icon('back.png', get_lang('Back'), [], ICON_SIZE_MEDIUM),
api_get_path(WEB_CODE_PATH).'social/personal_data.php'
);
$tpl->assign('actions', Display::toolbarAction('toolbar', [$actions]));
// Block Social Avatar
SocialManager::setSocialUserBlock($tpl, api_get_user_id(), 'messages');
if (api_get_setting('allow_social_tool') === 'true') {
$tpl->assign('social_menu_block', $socialMenuBlock);
} else {
$tpl->assign('social_menu_block', '');
}
$tpl->assign('term', $term);
$socialLayout = $tpl->get_template('social/terms.tpl');
$tpl->display($socialLayout);
Loading…
Cancel
Save