Actualización

This commit is contained in:
Xes
2025-04-10 12:49:05 +02:00
parent 4aff98e77b
commit 1cdd00920f
9151 changed files with 1800913 additions and 0 deletions

View File

@@ -0,0 +1,690 @@
<?php
/* For licensing terms, see /license.txt */
/**
* @package chamilo.admin
*/
$cidReset = true;
// including some necessary files
require_once __DIR__.'/../inc/global.inc.php';
require_once '../inc/lib/xajax/xajax.inc.php';
$xajax = new xajax();
$xajax->registerFunction('search_users');
// setting the section (for the tabs)
$this_section = SECTION_PLATFORM_ADMIN;
$id_session = intval($_GET['id_session']);
SessionManager::protect_teacher_session_edit($id_session);
// setting breadcrumbs
if (api_is_platform_admin()) {
$interbreadcrumb[] = [
'url' => 'index.php',
'name' => get_lang('PlatformAdmin'),
];
$interbreadcrumb[] = [
'url' => 'session_list.php',
'name' => get_lang('SessionList'),
];
$interbreadcrumb[] = [
'url' => "resume_session.php?id_session=".$id_session,
"name" => get_lang('SessionOverview'),
];
}
$allowTutors = api_get_setting('allow_tutors_to_assign_students_to_session');
$extra_field_list = [];
if ($allowTutors == 'true') {
// Database Table Definitions
$tbl_session = Database::get_main_table(TABLE_MAIN_SESSION);
$tbl_course = Database::get_main_table(TABLE_MAIN_COURSE);
$tbl_user = Database::get_main_table(TABLE_MAIN_USER);
$tbl_session_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_USER);
// setting the name of the tool
$tool_name = get_lang('SubscribeUsersToSession');
$add_type = 'unique';
if (isset($_REQUEST['add_type']) && $_REQUEST['add_type'] != '') {
$add_type = Security::remove_XSS($_REQUEST['add_type']);
}
$page = isset($_GET['page']) ? Security::remove_XSS($_GET['page']) : null;
// Checking for extra field with filter on
$extra_field_list = UserManager::get_extra_fields();
$new_field_list = [];
if (is_array($extra_field_list)) {
foreach ($extra_field_list as $extra_field) {
//if is enabled to filter and is a "<select>" field type
if ($extra_field[8] == 1 && $extra_field[2] == 4) {
$new_field_list[] = [
'name' => $extra_field[3],
'variable' => $extra_field[1],
'data' => $extra_field[9],
];
}
}
}
function search_users($needle, $type)
{
global $id_session;
$tbl_user = Database::get_main_table(TABLE_MAIN_USER);
$tbl_session_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_USER);
$xajax_response = new xajaxResponse();
$return = '';
if (!empty($needle) && !empty($type)) {
//normal behaviour
if ($type == 'any_session' && $needle == 'false') {
$type = 'multiple';
$needle = '';
}
// xajax send utf8 datas... datas in db can be non-utf8 datas
$charset = api_get_system_encoding();
$needle = Database::escape_string($needle);
$needle = api_convert_encoding($needle, $charset, 'utf-8');
$order_clause = api_sort_by_first_name() ? ' ORDER BY firstname, lastname, username' : ' ORDER BY lastname, firstname, username';
$cond_user_id = '';
//Only for single & multiple
if (in_array($type, ['single', 'multiple'])) {
if (!empty($id_session)) {
$id_session = intval($id_session);
// check id_user from session_rel_user table
$sql = 'SELECT user_id FROM '.$tbl_session_rel_user.'
WHERE session_id ="'.$id_session.'" AND relation_type<>'.SESSION_RELATION_TYPE_RRHH.' ';
$res = Database::query($sql);
$user_ids = [];
if (Database::num_rows($res) > 0) {
while ($row = Database::fetch_row($res)) {
$user_ids[] = (int) $row[0];
}
}
if (count($user_ids) > 0) {
$cond_user_id = ' AND user.user_id NOT IN('.implode(",", $user_ids).')';
}
}
}
switch ($type) {
case 'single':
// search users where username or firstname or lastname begins likes $needle
$sql = 'SELECT user.user_id, username, lastname, firstname
FROM '.$tbl_user.' user
WHERE (username LIKE "'.$needle.'%" OR firstname LIKE "'.$needle.'%"
OR lastname LIKE "'.$needle.'%") AND user.status<>6 AND user.status<>'.DRH.''.
$order_clause.
' LIMIT 11';
break;
case 'multiple':
$sql = 'SELECT user.user_id, username, lastname, firstname
FROM '.$tbl_user.' user
WHERE '.(api_sort_by_first_name() ? 'firstname' : 'lastname').'
LIKE "'.$needle.'%" AND
user.status<>'.DRH.' AND
user.status<>6 '.$cond_user_id.
$order_clause;
break;
case 'any_session':
$sql = 'SELECT DISTINCT user.user_id, username, lastname, firstname
FROM '.$tbl_user.' user
LEFT OUTER JOIN '.$tbl_session_rel_user.' s ON (s.user_id = user.user_id)
WHERE
s.user_id IS NULL AND
user.status <>'.DRH.' AND
user.status <> 6 '.$cond_user_id.
$order_clause;
break;
}
if (api_is_multiple_url_enabled()) {
$tbl_user_rel_access_url = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER);
$access_url_id = api_get_current_access_url_id();
if ($access_url_id != -1) {
switch ($type) {
case 'single':
$sql = 'SELECT user.user_id, username, lastname, firstname
FROM '.$tbl_user.' user
INNER JOIN '.$tbl_user_rel_access_url.' url_user
ON (url_user.user_id=user.user_id)
WHERE
access_url_id = '.$access_url_id.' AND
(username LIKE "'.$needle.'%" OR firstname LIKE "'.$needle.'%" OR lastname LIKE "'.$needle.'%") AND
user.status<>6 AND
user.status<>'.DRH.' '.
$order_clause.
' LIMIT 11';
break;
case 'multiple':
$sql = 'SELECT user.user_id, username, lastname, firstname
FROM '.$tbl_user.' user
INNER JOIN '.$tbl_user_rel_access_url.' url_user
ON (url_user.user_id=user.user_id)
WHERE access_url_id = '.$access_url_id.' AND
'.(api_sort_by_first_name() ? 'firstname' : 'lastname').' LIKE "'.$needle.'%" AND user.status<>'.DRH.' AND user.status<>6 '.$cond_user_id.
$order_clause;
break;
case 'any_session':
$sql = 'SELECT DISTINCT user.user_id, username, lastname, firstname
FROM '.$tbl_user.' user
LEFT OUTER JOIN '.$tbl_session_rel_user.' s
ON (s.user_id = user.user_id)
INNER JOIN '.$tbl_user_rel_access_url.' url_user
ON (url_user.user_id=user.user_id)
WHERE
access_url_id = '.$access_url_id.' AND
s.user_id IS null AND
user.status<>'.DRH.' AND
user.status<>6 '.$cond_user_id.
$order_clause;
break;
}
}
}
$rs = Database::query($sql);
$i = 0;
if ($type == 'single') {
while ($user = Database::fetch_array($rs)) {
$i++;
if ($i <= 10) {
$person_name = api_get_person_name($user['firstname'], $user['lastname']);
$return .= '<a href="javascript: void(0);" onclick="javascript: add_user_to_session(\''.$user['user_id'].'\',\''.$person_name.' ('.$user['username'].')'.'\')">'.$person_name.' ('.$user['username'].')</a><br />';
} else {
$return .= '...<br />';
}
}
$xajax_response->addAssign('ajax_list_users_single', 'innerHTML', api_utf8_encode($return));
} else {
$return .= '<select id="origin_users" name="nosessionUsersList[]" multiple="multiple" size="15" style="width:360px;">';
while ($user = Database::fetch_array($rs)) {
$person_name = api_get_person_name($user['firstname'], $user['lastname']);
$return .= '<option value="'.$user['user_id'].'">'.$person_name.' ('.$user['username'].')</option>';
}
$return .= '</select>';
$xajax_response->addAssign('ajax_list_users_multiple', 'innerHTML', api_utf8_encode($return));
}
}
return $xajax_response;
}
$xajax->processRequests();
$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("destination_users");
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);
}
function remove_item(origin) {
for(var i = 0 ; i<origin.options.length ; i++) {
if(origin.options[i].selected) {
origin.options[i]=null;
i = i-1;
}
}
}
function validate_filter() {
document.formulaire.add_type.value = \''.$add_type.'\';
document.formulaire.form_sent.value=0;
document.formulaire.submit();
}
function checked_in_no_session(checked) {
$("#first_letter_user")
.find("option")
.attr("selected", false);
xajax_search_users(checked, "any_session");
}
function change_select(val) {
$("#user_with_any_session_id").attr("checked", false);
xajax_search_users(val,"multiple");
}
</script>';
$form_sent = 0;
$firstLetterUser = $firstLetterSession = '';
$UserList = $SessionList = [];
$sessions = [];
if (isset($_POST['form_sent']) && $_POST['form_sent']) {
$form_sent = $_POST['form_sent'];
$firstLetterUser = $_POST['firstLetterUser'];
$firstLetterSession = $_POST['firstLetterSession'];
$UserList = $_POST['sessionUsersList'];
if (!is_array($UserList)) {
$UserList = [];
}
if ($form_sent == 1) {
//added a parameter to send emails when registering a user
SessionManager::subscribeUsersToSession($id_session, $UserList, null, true);
header('Location: resume_session.php?id_session='.$id_session);
exit;
}
}
$session_info = SessionManager::fetch($id_session);
Display::display_header($tool_name);
$nosessionUsersList = $sessionUsersList = [];
$ajax_search = $add_type === 'unique' ? true : false;
$order_clause = api_sort_by_first_name() ? ' ORDER BY firstname, lastname, username' : ' ORDER BY lastname, firstname, username';
if ($ajax_search) {
$sql = "SELECT u.user_id, lastname, firstname, username, session_id
FROM $tbl_user u
INNER JOIN $tbl_session_rel_user
ON
$tbl_session_rel_user.user_id = u.user_id AND
$tbl_session_rel_user.relation_type<>".SESSION_RELATION_TYPE_RRHH." AND
$tbl_session_rel_user.session_id = ".intval($id_session)."
WHERE u.status <> ".DRH." AND u.status<>6 $order_clause";
if (api_is_multiple_url_enabled()) {
$tbl_user_rel_access_url = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER);
$access_url_id = api_get_current_access_url_id();
if ($access_url_id != -1) {
$sql = "SELECT u.user_id, lastname, firstname, username, session_id
FROM $tbl_user u
INNER JOIN $tbl_session_rel_user
ON
$tbl_session_rel_user.user_id = u.user_id AND
$tbl_session_rel_user.relation_type<>".SESSION_RELATION_TYPE_RRHH." AND
$tbl_session_rel_user.session_id = ".intval($id_session)."
INNER JOIN $tbl_user_rel_access_url url_user
ON (url_user.user_id=u.user_id)
WHERE access_url_id = $access_url_id AND u.status<>".DRH." AND u.status<>6
$order_clause";
}
}
$result = Database::query($sql);
$users = Database::store_result($result);
foreach ($users as $user) {
$sessionUsersList[$user['user_id']] = $user;
}
unset($users); //clean to free memory
} else {
//Filter by Extra Fields
$use_extra_fields = false;
if (is_array($extra_field_list)) {
if (is_array($new_field_list) && count($new_field_list) > 0) {
$result_list = [];
foreach ($new_field_list as $new_field) {
$varname = 'field_'.$new_field['variable'];
if (UserManager::is_extra_field_available($new_field['variable'])) {
if (isset($_POST[$varname]) && $_POST[$varname] != '0') {
$use_extra_fields = true;
$extra_field_result[] = UserManager::get_extra_user_data_by_value(
$new_field['variable'],
$_POST[$varname]
);
}
}
}
}
}
if ($use_extra_fields) {
$final_result = [];
if (count($extra_field_result) > 1) {
for ($i = 0; $i < count($extra_field_result) - 1; $i++) {
if (is_array($extra_field_result[$i + 1])) {
$final_result = array_intersect(
$extra_field_result[$i],
$extra_field_result[$i + 1]
);
}
}
} else {
$final_result = $extra_field_result[0];
}
$where_filter = '';
if (api_is_multiple_url_enabled()) {
if (is_array($final_result) && count($final_result) > 0) {
$where_filter = " AND u.user_id IN ('".implode("','", $final_result)."') ";
} else {
//no results
$where_filter = " AND u.user_id = -1";
}
} else {
if (is_array($final_result) && count($final_result) > 0) {
$where_filter = " WHERE u.user_id IN ('".implode("','", $final_result)."') ";
} else {
//no results
$where_filter = " WHERE u.user_id = -1";
}
}
}
if ($use_extra_fields) {
$sql = "SELECT u.user_id, lastname, firstname, username, session_id
FROM $tbl_user u
LEFT JOIN $tbl_session_rel_user
ON $tbl_session_rel_user.user_id = u.user_id AND
$tbl_session_rel_user.session_id = '$id_session' AND
$tbl_session_rel_user.relation_type<>".SESSION_RELATION_TYPE_RRHH."
$where_filter AND u.status<>".DRH." AND u.status<>6
$order_clause";
} else {
$sql = "SELECT user_id, lastname, firstname, username, session_id
FROM $tbl_user u
LEFT JOIN $tbl_session_rel_user
ON $tbl_session_rel_user.user_id = u.user_id AND
$tbl_session_rel_user.session_id = '$id_session' AND
$tbl_session_rel_user.relation_type<>".SESSION_RELATION_TYPE_RRHH."
WHERE u.status <> ".DRH." AND u.status<>6
$order_clause";
}
if (api_is_multiple_url_enabled()) {
$tbl_user_rel_access_url = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER);
$access_url_id = api_get_current_access_url_id();
if ($access_url_id != -1) {
$sql = "SELECT u.user_id, lastname, firstname, username, session_id
FROM $tbl_user u
LEFT JOIN $tbl_session_rel_user
ON
$tbl_session_rel_user.user_id = u.user_id AND
$tbl_session_rel_user.session_id = '$id_session' AND
$tbl_session_rel_user.relation_type<>".SESSION_RELATION_TYPE_RRHH."
INNER JOIN $tbl_user_rel_access_url url_user ON (url_user.user_id=u.user_id)
WHERE access_url_id = $access_url_id $where_filter AND u.status<>".DRH." AND u.status<>6
$order_clause";
}
}
$result = Database::query($sql);
$users = Database::store_result($result, 'ASSOC');
foreach ($users as $uid => $user) {
if ($user['session_id'] != $id_session) {
$nosessionUsersList[$user['user_id']] = [
'fn' => $user['firstname'],
'ln' => $user['lastname'],
'un' => $user['username'],
];
unset($users[$uid]);
}
}
unset($users); //clean to free memory
//filling the correct users in list
$sql = "SELECT user_id, lastname, firstname, username, session_id
FROM $tbl_user u
LEFT JOIN $tbl_session_rel_user
ON
$tbl_session_rel_user.user_id = u.id AND
$tbl_session_rel_user.session_id = '$id_session' AND
$tbl_session_rel_user.relation_type<>".SESSION_RELATION_TYPE_RRHH."
WHERE u.status <> ".DRH." AND u.status<>6 $order_clause";
if (api_is_multiple_url_enabled()) {
$tbl_user_rel_access_url = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER);
$access_url_id = api_get_current_access_url_id();
if ($access_url_id != -1) {
$sql = "SELECT u.user_id, lastname, firstname, username, session_id
FROM $tbl_user u
LEFT JOIN $tbl_session_rel_user
ON
$tbl_session_rel_user.user_id = u.user_id AND
$tbl_session_rel_user.session_id = '$id_session' AND
$tbl_session_rel_user.relation_type<>".SESSION_RELATION_TYPE_RRHH."
INNER JOIN $tbl_user_rel_access_url url_user ON (url_user.user_id=u.user_id)
WHERE access_url_id = $access_url_id AND u.status<>".DRH." AND u.status<>6
$order_clause";
}
}
$result = Database::query($sql);
$users = Database::store_result($result, 'ASSOC');
foreach ($users as $uid => $user) {
if ($user['session_id'] == $id_session) {
$sessionUsersList[$user['user_id']] = $user;
if (array_key_exists($user['user_id'], $nosessionUsersList)) {
unset($nosessionUsersList[$user['user_id']]);
}
}
unset($users[$uid]);
}
unset($users); //clean to free memory
}
if ($add_type === 'multiple') {
$link_add_type_unique = '<a href="'.api_get_self().'?id_session='.$id_session.'&add='.Security::remove_XSS($_GET['add']).'&add_type=unique">'.
Display::return_icon('single.gif').get_lang('SessionAddTypeUnique').'</a>';
$link_add_type_multiple = Display::return_icon('multiple.gif').get_lang('SessionAddTypeMultiple');
} else {
$link_add_type_unique = Display::return_icon('single.gif').get_lang('SessionAddTypeUnique');
$link_add_type_multiple = '<a href="'.api_get_self().'?id_session='.$id_session.'&add='.Security::remove_XSS($_GET['add']).'&add_type=multiple">'.
Display::return_icon('multiple.gif').get_lang('SessionAddTypeMultiple').'</a>';
}
$link_add_group = '<a href="usergroups.php">'.
Display::return_icon('multiple.gif', get_lang('RegistrationByUsersGroups')).get_lang('RegistrationByUsersGroups').'</a>'; ?>
<div class="actions">
<?php echo $link_add_type_unique; ?>&nbsp;|&nbsp;<?php echo $link_add_type_multiple; ?>&nbsp;|&nbsp;<?php echo $link_add_group; ?>
</div>
<form name="formulaire" method="post"
action="<?php echo api_get_self(); ?>?page=<?php echo $page; ?>&id_session=<?php echo $id_session; ?><?php if (!empty($_GET['add'])) {
echo '&add=true';
} ?>" style="margin:0px;" <?php if ($ajax_search) {
echo ' onsubmit="valide();"';
} ?>>
<?php echo '<legend>'.$tool_name.' ('.$session->getName().') </legend>'; ?>
<?php
if ($add_type === 'multiple') {
if (is_array($extra_field_list)) {
if (is_array($new_field_list) && count($new_field_list) > 0) {
echo '<h3>'.get_lang('FilterUsers').'</h3>';
foreach ($new_field_list as $new_field) {
echo $new_field['name'];
$varname = 'field_'.$new_field['variable'];
echo '&nbsp;<select name="'.$varname.'">';
echo '<option value="0">--'.get_lang('Select').'--</option>';
foreach ($new_field['data'] as $option) {
$checked = '';
if (isset($_POST[$varname])) {
if ($_POST[$varname] == $option[1]) {
$checked = 'selected="true"';
}
}
echo '<option value="'.$option[1].'" '.$checked.'>'.$option[1].'</option>';
}
echo '</select>';
echo '&nbsp;&nbsp;';
}
echo '<input type="button" value="'.get_lang('Filter').'" onclick="validate_filter()" />';
echo '<br /><br />';
}
}
} ?>
<input type="hidden" name="form_sent" value="1" />
<input type="hidden" name="add_type" />
<div class="row">
<div class="span5">
<div class="multiple_select_header">
<b><?php echo get_lang('UserListInPlatform'); ?> :</b>
<?php if ($add_type == 'multiple') {
?>
<?php echo get_lang('FirstLetterUser'); ?> :
<select id="first_letter_user" name="firstLetterUser" onchange = "change_select(this.value);" >
<option value = "%">--</option>
<?php
echo Display::get_alphabet_options(); ?>
</select>
<?php
} ?>
</div>
<div id="content_source">
<?php
if (!($add_type == 'multiple')) {
?>
<input type="text" id="user_to_add" onkeyup="xajax_search_users(this.value,'single')" />
<div id="ajax_list_users_single"></div>
<?php
} else {
?>
<div id="ajax_list_users_multiple">
<select id="origin_users" name="nosessionUsersList[]" multiple="multiple" size="15" class="span5">
<?php
foreach ($nosessionUsersList as $uid => $enreg) {
?>
<option value="<?php echo $uid; ?>" <?php if (in_array($uid, $UserList)) {
echo 'selected="selected"';
} ?>><?php echo api_get_person_name($enreg['fn'], $enreg['ln']).' ('.$enreg['un'].')'; ?></option>
<?php
} ?>
</select>
</div>
<input type="checkbox" onchange="checked_in_no_session(this.checked);" name="user_with_any_session" id="user_with_any_session_id">
<label for="user_with_any_session_id"><?php echo get_lang('UsersRegisteredInNoSession'); ?></label>
<?php
}
unset($nosessionUsersList); ?>
</div>
</div>
<div class="span2">
<div style="padding-top:54px;width:auto;text-align: center;">
<?php
if ($ajax_search) {
?>
<button class="btn btn-default" type="button" onclick="remove_item(document.getElementById('destination_users'))" ><em class="fa fa-arrow-left"></em></button>
<?php
} else {
?>
<button class="btn btn-default" type="button" onclick="moveItem(document.getElementById('origin_users'), document.getElementById('destination_users'))" onclick="moveItem(document.getElementById('origin_users'), document.getElementById('destination_users'))">
<em class="fa fa-arrow-right"></em>
</button>
<br /><br />
<button class="btn btn-default" type="button" onclick="moveItem(document.getElementById('destination_users'), document.getElementById('origin_users'))" onclick="moveItem(document.getElementById('destination_users'), document.getElementById('origin_users'))">
<em class="fa fa-arrow-left"></em>
</button>
<?php
} ?>
</div>
<br />
<br />
<?php
if (isset($_GET['add'])) {
echo '<button class="btn btn-primary" type="button" value="" onclick="valide()" >'.get_lang('FinishSessionCreation').'</button>';
} else {
//@todo see that the call to "valide()" doesn't duplicate the onsubmit of the form (necessary to avoid delete on "enter" key pressed)
echo '<button class="save" type="button" value="" onclick="valide()" >'.get_lang('SubscribeUsersToSession').'</button>';
} ?>
</div>
<div class="span5">
<div class="multiple_select_header">
<b><?php echo get_lang('UserListInSession'); ?> :</b>
</div>
<select id="destination_users" name="sessionUsersList[]" multiple="multiple" size="15" class="span5">
<?php
foreach ($sessionUsersList as $enreg) {
?>
<option value="<?php echo $enreg['user_id']; ?>"><?php echo api_get_person_name($enreg['firstname'], $enreg['lastname']).' ('.$enreg['username'].')'; ?></option>
<?php
}
unset($sessionUsersList); ?>
</select>
</div>
</div>
</form>
<script>
function moveItem(origin , destination) {
for (var i = 0 ; i<origin.options.length ; i++) {
if (origin.options[i].selected) {
destination.options[destination.length] = new Option(origin.options[i].text,origin.options[i].value);
origin.options[i]=null;
i = i-1;
}
}
destination.selectedIndex = -1;
sortOptions(destination.options);
}
function sortOptions(options)
{
newOptions = new Array();
for (i = 0 ; i<options.length ; i++)
newOptions[i] = options[i];
newOptions = newOptions.sort(mysort);
options.length = 0;
for (i = 0 ; i < newOptions.length ; i++)
options[i] = newOptions[i];
}
function mysort(a, b)
{
if (a.text.toLowerCase() > b.text.toLowerCase()) {
return 1;
}
if (a.text.toLowerCase() < b.text.toLowerCase()) {
return -1;
}
return 0;
}
function valide()
{
var options = document.getElementById('destination_users').options;
for (i = 0 ; i<options.length ; i++)
options[i].selected = true;
document.forms.formulaire.submit();
}
function loadUsersInSelect(select)
{
var xhr_object = null;
if(window.XMLHttpRequest) // Firefox
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // Internet Explorer
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
//xhr_object.open("GET", "loadUsersInSelect.ajax.php?id_session=<?php echo $id_session; ?>&letter="+select.options[select.selectedIndex].text, false);
xhr_object.open("POST", "loadUsersInSelect.ajax.php");
xhr_object.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
nosessionUsers = makepost(document.getElementById('origin_users'));
sessionUsers = makepost(document.getElementById('destination_users'));
nosessionClasses = makepost(document.getElementById('origin_classes'));
sessionClasses = makepost(document.getElementById('destination_classes'));
xhr_object.send("nosessionusers="+nosessionUsers+"&sessionusers="+sessionUsers+"&nosessionclasses="+nosessionClasses+"&sessionclasses="+sessionClasses);
xhr_object.onreadystatechange = function() {
if (xhr_object.readyState == 4) {
document.getElementById('content_source').innerHTML = result = xhr_object.responseText;
//alert(xhr_object.responseText);
}
}
}
function makepost(select)
{
var options = select.options;
var ret = "";
for (i = 0 ; i<options.length ; i++)
ret = ret + options[i].value +'::'+options[i].text+";;";
return ret;
}
</script>
<?php
} else {
api_not_allowed();
}
Display::display_footer();

View File

@@ -0,0 +1,107 @@
<?php
/* For licensing terms, see /license.txt */
/*
*
* Requires extra_field_values.value to be longtext to save diagram:
*
UPDATE extra_field_values SET created_at = NULL WHERE CAST(created_at AS CHAR(20)) = '0000-00-00 00:00:00';
UPDATE extra_field_values SET updated_at = NULL WHERE CAST(updated_at AS CHAR(20)) = '0000-00-00 00:00:00';
ALTER TABLE extra_field_values modify column value longtext null;
*/
require_once __DIR__.'/../inc/global.inc.php';
if (false === api_get_configuration_value('allow_career_diagram')) {
api_not_allowed(true);
}
api_block_anonymous_users();
$this_section = SECTION_COURSES;
$careerId = $_GET['career_id'] ?? null;
$userId = isset($_GET['user_id']) ? $_GET['user_id'] : api_get_user_id();
if (empty($careerId)) {
api_not_allowed(true);
}
$career = new Career();
$careerInfo = $career->getCareerFromId($careerId);
if (empty($careerInfo)) {
api_not_allowed(true);
}
$careerId = $careerInfo['id'];
/*$allow = UserManager::userHasCareer($userId, $careerId) || api_is_platform_admin() || api_is_drh();
if (false === $allow) {
api_not_allowed(true);
}*/
$htmlHeadXtra[] = api_get_js('jsplumb2.js');
$htmlHeadXtra[] = api_get_asset('qtip2/jquery.qtip.min.js');
$htmlHeadXtra[] = api_get_css_asset('qtip2/jquery.qtip.min.css');
$interbreadcrumb[] = [
'url' => api_get_path(WEB_CODE_PATH).'auth/my_progress.php',
'name' => get_lang('Progress'),
];
$interbreadcrumb[] = [
'url' => '#',
'name' => get_lang('Careers'),
];
$extraFieldValue = new ExtraFieldValue('career');
// Check urls
$itemUrls = $extraFieldValue->get_values_by_handler_and_field_variable(
$careerId,
'career_urls',
false,
false,
false
);
$urlToString = '';
if (!empty($itemUrls) && !empty($itemUrls['value'])) {
$urls = explode(',', $itemUrls['value']);
$urlToString = '&nbsp;&nbsp;';
if (!empty($urls)) {
foreach ($urls as $urlData) {
$urlData = explode('@', $urlData);
if (isset($urlData[1])) {
$urlToString .= Display::url($urlData[0], $urlData[1]).'&nbsp;';
} else {
$urlToString .= $urlData[0].'&nbsp;';
}
}
}
}
$showFullPage = isset($_REQUEST['iframe']) && 1 === (int) $_REQUEST['iframe'] ? false : true;
$tpl = new Template(get_lang('Diagram'), $showFullPage, $showFullPage, !$showFullPage);
$html = Display::page_subheader2($careerInfo['name'].$urlToString);
$diagram = Career::renderDiagramByColumn($careerInfo, $tpl, $userId, $showFullPage);
if (!empty($diagram)) {
$html .= $diagram;
} else {
Display::addFlash(
Display::return_message(
sprintf(get_lang('CareerXDoesntHaveADiagram'), $careerInfo['name']),
'warning'
)
);
}
$tpl->assign('content', $html);
if ($showFullPage) {
$layout = $tpl->get_template('career/diagram_full.tpl');
} else {
$layout = $tpl->get_template('career/diagram_iframe.tpl');
}
$tpl->display($layout);

198
main/user/class.php Normal file
View File

@@ -0,0 +1,198 @@
<?php
/* For licensing terms, see /license.txt */
require_once __DIR__.'/../inc/global.inc.php';
$this_section = SECTION_COURSES;
$sessionId = api_get_session_id();
api_protect_course_script(true, false, 'user');
if ('false' === api_get_setting('allow_user_course_subscription_by_course_admin')) {
if (!api_is_platform_admin()) {
api_not_allowed(true);
}
}
if (api_get_configuration_value('session_classes_tab_disable') && !api_is_platform_admin() && $sessionId) {
api_not_allowed(true);
}
$tool_name = get_lang('Classes');
$htmlHeadXtra[] = api_get_jqgrid_js();
$interbreadcrumb[] = [
'url' => 'user.php?'.api_get_cidreq(),
'name' => get_lang('ToolUser'),
];
$type = isset($_GET['type']) ? Security::remove_XSS($_GET['type']) : 'registered';
$groupFilter = isset($_GET['group_filter']) ? (int) $_GET['group_filter'] : 0;
$keyword = isset($_GET['keyword']) ? Security::remove_XSS($_GET['keyword']) : '';
$htmlHeadXtra[] = '
<script>
$(function() {
$("#group_filter").change(function() {
window.location = "class.php?'.api_get_cidreq().'&type='.$type.'" +"&group_filter=" + $(this).val();
});
});
</script>';
$actionsLeft = '';
$actionsRight = '';
$usergroup = new UserGroup();
$actions = '';
if (api_is_allowed_to_edit()) {
if ($type === 'registered') {
$actionsLeft .= '<a href="class.php?'.api_get_cidreq().'&type=not_registered">'.
Display::return_icon('add-class.png', get_lang('AddClassesToACourse'), [], ICON_SIZE_MEDIUM).'</a>';
} else {
$actionsLeft .= '<a href="class.php?'.api_get_cidreq().'&type=registered">'.
Display::return_icon('back.png', get_lang('Classes'), [], ICON_SIZE_MEDIUM).'</a>';
$form = new FormValidator(
'groups',
'get',
api_get_self().'?type='.$type,
'',
[],
FormValidator::LAYOUT_INLINE
);
$options = [
-1 => get_lang('All'),
1 => get_lang('SocialGroups'),
0 => get_lang('Classes'),
];
$form->addSelect(
'group_filter',
get_lang('Groups'),
$options,
['id' => 'group_filter', 'disable_js' => 'disable_js']
);
$form->addHidden('type', $type);
$form->addText('keyword', '', false);
$form->setDefaults(['group_filter' => $groupFilter]);
$form->addCourseHiddenParams();
$form->addButtonSearch(get_lang('SearchButton'));
$actionsRight .= $form->returnForm();
}
$actions = Display::toolbarAction('actions-class', [$actionsLeft, $actionsRight]);
$action = isset($_GET['action']) ? $_GET['action'] : null;
switch ($action) {
case 'add_class_to_course':
$id = $_GET['id'];
if (!empty($id) && $sessionId == 0) {
/* To suscribe Groups*/
$usergroup->subscribe_courses_to_usergroup(
$id,
[api_get_course_int_id()],
false
);
Display::addFlash(Display::return_message(get_lang('Added')));
header('Location: class.php?'.api_get_cidreq().'&type=registered');
exit;
} elseif ($sessionId != 0) {
/* To suscribe session*/
$usergroup->subscribe_sessions_to_usergroup($id, [$sessionId]);
Display::addFlash(Display::return_message(get_lang('Added')));
header('Location: class.php?'.api_get_cidreq().'&type=registered');
exit;
}
break;
case 'remove_class_from_course':
$id = $_GET['id'];
if (!empty($id)) {
$usergroup->unsubscribe_courses_from_usergroup(
$id,
[api_get_course_int_id()]
);
Display::addFlash(Display::return_message(get_lang('Deleted')));
}
break;
}
}
// jqgrid will use this URL to do the selects
$url = api_get_path(WEB_AJAX_PATH).
'model.ajax.php?a=get_usergroups_teacher&type='.$type.'&group_filter='.$groupFilter.'&keyword='.$keyword;
// The order is important you need to check the the $column variable in the model.ajax.php file
$columns = [
get_lang('Name'),
get_lang('Users'),
get_lang('Status'),
get_lang('Type'),
get_lang('Actions'),
];
// Column config
$columnModel = [
[
'name' => 'name',
'index' => 'name',
'width' => '35',
'align' => 'left',
],
[
'name' => 'users',
'index' => 'users',
'width' => '15',
'align' => 'left',
],
[
'name' => 'status',
'index' => 'status',
'width' => '15',
'align' => 'left',
],
[
'name' => 'group_type',
'index' => 'group_type',
'width' => '15',
'align' => 'center',
],
[
'name' => 'actions',
'index' => 'actions',
'width' => '10',
'align' => 'center',
'sortable' => 'false',
],
];
// Autowidth
$extraParams['autowidth'] = 'true';
// height auto
$extraParams['height'] = 'auto';
Display::display_header($tool_name, 'User');
?>
<script>
$(function() {
<?php
// grid definition see the $usergroup>display() function
echo Display::grid_js(
'usergroups',
$url,
$columns,
$columnModel,
$extraParams,
[],
'',
true
);
?>
});
</script>
<?php
echo $actions;
echo UserManager::getUserSubscriptionTab(4);
echo Display::return_message(get_lang('UserClassExplanation'));
$usergroup->display_teacher_view();
Display::display_footer();

51
main/user/classes.php Normal file
View File

@@ -0,0 +1,51 @@
<?php
/* For licensing terms, see /license.txt */
/**
* @author Julio Montoya <gugli100@gmail.com>
*/
$cidReset = true;
require_once __DIR__.'/../inc/global.inc.php';
api_block_anonymous_users();
$this_section = SECTION_COURSES;
$interbreadcrumb[] = ['url' => 'classes.php', 'name' => get_lang('Classes')];
if (isset($_GET['id'])) {
$interbreadcrumb[] = ['url' => '#', 'name' => get_lang('Groups')];
}
$content = '';
$usergroup = new UserGroup();
$usergroup_list = $usergroup->get_usergroup_by_user(api_get_user_id());
if (!empty($usergroup_list)) {
$content .= Display::tag('h1', get_lang('MyClasses'));
foreach ($usergroup_list as $group_id) {
if (isset($_GET['id']) && $_GET['id'] != $group_id) {
continue;
}
$data = $usergroup->get($group_id);
$content .= Display::tag('h2', $data['name']);
$content .= Display::div($data['description']);
}
} else {
if (api_is_platform_admin()) {
Display::addFlash(
Display::return_message(
Display::url(
get_lang('AddClasses'),
api_get_path(WEB_CODE_PATH).'admin/usergroups.php?action=add'
),
'normal',
false
)
);
}
}
Display::display_header('', 'Classes');
echo $content;
Display::display_footer();

7
main/user/index.html Normal file
View File

@@ -0,0 +1,7 @@
<html>
<head>
<meta http-equiv="refresh" content="0; url=user.php">
</head>
<body>
</body>
</html>

View File

@@ -0,0 +1,376 @@
<?php
/* For licensing terms, see /license.txt */
/**
* @author Bart Mollet, Julio Montoya lot of fixes
*
* @package chamilo.admin
*/
$cidReset = true;
require_once __DIR__.'/../inc/global.inc.php';
// setting the section (for the tabs)
$this_section = SECTION_PLATFORM_ADMIN;
$id_session = (int) $_GET['id_session'];
SessionManager::protect_teacher_session_edit($id_session);
$tool_name = get_lang('SessionOverview');
$allowTutors = api_get_setting('allow_tutors_to_assign_students_to_session');
if ($allowTutors === 'true') {
// Database Table Definitions
$tbl_session = Database::get_main_table(TABLE_MAIN_SESSION);
$tbl_session_rel_class = Database::get_main_table(TABLE_MAIN_SESSION_CLASS);
$tbl_session_rel_course = Database::get_main_table(TABLE_MAIN_SESSION_COURSE);
$tbl_course = Database::get_main_table(TABLE_MAIN_COURSE);
$tbl_user = Database::get_main_table(TABLE_MAIN_USER);
$tbl_session_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_USER);
$tbl_session_rel_course_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
$tbl_session_category = Database::get_main_table(TABLE_MAIN_SESSION_CATEGORY);
$table_access_url_user = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER);
$sql = 'SELECT
name,
nbr_courses,
nbr_users,
nbr_classes,
DATE_FORMAT(access_start_date,"%d-%m-%Y") as access_start_date,
DATE_FORMAT(access_end_date,"%d-%m-%Y") as access_end_date,
lastname,
firstname,
username,
session_admin_id,
coach_access_start_date,
coach_access_end_date,
session_category_id,
visibility
FROM '.$tbl_session.'
LEFT JOIN '.$tbl_user.'
ON id_coach = user_id
WHERE '.$tbl_session.'.id='.$id_session;
$rs = Database::query($sql);
$session = Database::store_result($rs);
$session = $session[0];
$sql = 'SELECT name
FROM '.$tbl_session_category.'
WHERE id = '.intval($session['session_category_id']);
$rs = Database::query($sql);
$session_category = '';
if (Database::num_rows($rs) > 0) {
$rows_session_category = Database::store_result($rs);
$rows_session_category = $rows_session_category[0];
$session_category = $rows_session_category['name'];
}
$action = isset($_GET['action']) ? $_GET['action'] : null;
$url_id = api_get_current_access_url_id();
switch ($action) {
case 'add_user_to_url':
$user_id = $_REQUEST['user_id'];
$result = UrlManager::add_user_to_url($user_id, $url_id);
$user_info = api_get_user_info($user_id);
if ($result) {
Display::addFlash(
Display::return_message(
get_lang('UserAdded').' '.api_get_person_name(
$user_info['firstname'],
$user_info['lastname']
),
'confirm'
)
);
}
break;
case 'delete':
$idChecked = $_GET['idChecked'];
if (is_array($idChecked)) {
$my_temp = [];
foreach ($idChecked as $id) {
$courseInfo = api_get_course_info($id);
$my_temp[] = $courseInfo['real_id']; // forcing the escape_string
}
$idChecked = $my_temp;
$idChecked = "'".implode("','", $idChecked)."'";
$result = Database::query("DELETE FROM $tbl_session_rel_course WHERE session_id='$id_session' AND c_id IN($idChecked)");
$nbr_affected_rows = Database::affected_rows($result);
Database::query("DELETE FROM $tbl_session_rel_course_rel_user WHERE session_id='$id_session' AND c_id IN($idChecked)");
Database::query("UPDATE $tbl_session SET nbr_courses=nbr_courses-$nbr_affected_rows WHERE id='$id_session'");
}
if (!empty($_GET['class'])) {
$result = Database::query("DELETE FROM $tbl_session_rel_class WHERE session_id='$id_session' AND class_id=".intval($_GET['class']));
$nbr_affected_rows = Database::affected_rows($result);
Database::query("UPDATE $tbl_session SET nbr_classes=nbr_classes-$nbr_affected_rows WHERE id='$id_session'");
}
if (!empty($_GET['user'])) {
$result = Database::query("DELETE FROM $tbl_session_rel_user WHERE relation_type<>".SESSION_RELATION_TYPE_RRHH." AND session_id ='$id_session' AND user_id=".intval($_GET['user']));
$nbr_affected_rows = Database::affected_rows($result);
Database::query("UPDATE $tbl_session SET nbr_users=nbr_users-$nbr_affected_rows WHERE id='$id_session'");
$result = Database::query("DELETE FROM $tbl_session_rel_course_rel_user WHERE session_id ='$id_session' AND user_id=".intval($_GET['user']));
$nbr_affected_rows = Database::affected_rows($result);
Database::query("UPDATE $tbl_session_rel_course SET nbr_users=nbr_users-$nbr_affected_rows WHERE session_id ='$id_session'");
}
break;
}
Display::display_header($tool_name);
echo Display::page_header(
Display::return_icon(
'session.png',
get_lang('Session')
).' '.$session['name']
);
echo Display::page_subheader(get_lang('GeneralProperties').$url); ?>
<!-- General properties -->
<table class="table table-hover table-striped data_table">
<tr>
<td><?php echo get_lang('GeneralCoach'); ?> :</td>
<td><?php echo api_get_person_name($session['firstname'], $session['lastname']).' ('.$session['username'].')'; ?></td>
</tr>
<?php if (!empty($session_category)) {
?>
<tr>
<td><?php echo get_lang('SessionCategory'); ?></td>
<td><?php echo $session_category; ?></td>
</tr>
<?php
} ?>
<tr>
<td><?php echo get_lang('Date'); ?> :</td>
<td>
<?php
if ($session['access_start_date'] == '00-00-0000' && $session['access_end_date'] == '00-00-0000') {
echo get_lang('NoTimeLimits');
} else {
if ($session['access_start_date'] != '00-00-0000') {
//$session['date_start'] = Display::tag('i', get_lang('NoTimeLimits'));
$session['access_start_date'] = get_lang('From').' '.$session['access_start_date'];
} else {
$session['access_start_date'] = '';
}
if ($session['access_end_date'] == '00-00-0000') {
$session['access_end_date'] = '';
} else {
$session['access_end_date'] = get_lang('Until').' '.$session['access_end_date'];
}
echo $session['access_start_date'].' '.$session['access_end_date'];
} ?>
</td>
</tr>
<!-- show nb_days_before and nb_days_after only if they are different from 0 -->
<tr>
<td>
<?php echo api_ucfirst(get_lang('SessionCoachStartDate')); ?> :
</td>
<td>
<?php echo intval($session['coach_access_start_date']); ?>
</td>
</tr>
<tr>
<td>
<?php echo api_ucfirst(get_lang('SessionCoachEndDate')); ?> :
</td>
<td>
<?php echo intval($session['coach_session_access_end_date']); ?>
</td>
</tr>
<tr>
<td>
<?php echo api_ucfirst(get_lang('SessionVisibility')); ?> :
</td>
<td>
<?php if ($session['visibility'] == 1) {
echo get_lang('ReadOnly');
} elseif ($session['visibility'] == 2) {
echo get_lang('Visible');
} elseif ($session['visibility'] == 3) {
echo api_ucfirst(get_lang('Invisible'));
} ?>
</td>
</tr>
<?php
$multiple_url_is_on = api_get_multiple_access_url();
if ($multiple_url_is_on) {
echo '<tr><td>';
echo 'URL';
echo '</td>';
echo '<td>';
$url_list = UrlManager::get_access_url_from_session($id_session);
foreach ($url_list as $url_data) {
echo $url_data['url'].'<br />';
}
echo '</td></tr>';
} ?>
</table>
<br />
<?php
echo Display::page_subheader(get_lang('CourseList').$url); ?>
<!--List of courses -->
<table class="table table-hover table-striped data_table">
<tr>
<th width="35%"><?php echo get_lang('CourseTitle'); ?></th>
<th width="30%"><?php echo get_lang('CourseCoach'); ?></th>
<th width="20%"><?php echo get_lang('UsersNumber'); ?></th>
</tr>
<?php
if ($session['nbr_courses'] == 0) {
echo '<tr>
<td colspan="4">'.get_lang('NoCoursesForThisSession').'</td>
</tr>';
} else {
// select the courses
$sql = "SELECT c.id, code,title,visual_code, nbr_users
FROM $tbl_course c,$tbl_session_rel_course sc
WHERE c.id = sc.c_id
AND session_id='$id_session'
ORDER BY title";
$result = Database::query($sql);
$courses = Database::store_result($result);
foreach ($courses as $course) {
// Select the number of users
$sql = "SELECT count(*) FROM $tbl_session_rel_user sru, $tbl_session_rel_course_rel_user srcru
WHERE
srcru.user_id = sru.user_id AND
srcru.session_id = sru.session_id AND
srcru.c_id = '".Database::escape_string($course['id'])."'AND
sru.relation_type<>".SESSION_RELATION_TYPE_RRHH." AND
srcru.session_id = '".intval($id_session)."'";
$rs = Database::query($sql);
$course['nbr_users'] = Database::result($rs, 0, 0);
// Get coachs of the courses in session
$sql = "SELECT user.lastname,user.firstname,user.username
FROM $tbl_session_rel_course_rel_user session_rcru, $tbl_user user
WHERE
session_rcru.user_id = user.id AND
session_rcru.session_id = '".intval($id_session)."' AND
session_rcru.c_id ='".Database::escape_string($course['id'])."' AND
session_rcru.status=2";
$rs = Database::query($sql);
$coachs = [];
if (Database::num_rows($rs) > 0) {
while ($info_coach = Database::fetch_array($rs)) {
$coachs[] = api_get_person_name(
$info_coach['firstname'],
$info_coach['lastname']
).' ('.$info_coach['username'].')';
}
} else {
$coach = get_lang('None');
}
if (count($coachs) > 0) {
$coach = implode('<br />', $coachs);
} else {
$coach = get_lang('None');
}
$orig_param = '&origin=resume_session';
//hide_course_breadcrumb the parameter has been added to hide the
// name of the course, that appeared in the default $interbreadcrumb
echo '
<tr>
<td>'.Display::url($course['title'].' ('.$course['visual_code'].')', api_get_path(WEB_COURSE_PATH).$course['code'].'/?id_session='.$id_session), '</td>
<td>'.$coach.'</td>
<td>'.$course['nbr_users'].'</td>
</tr>';
}
} ?>
</table>
<br />
<?php
echo Display::page_subheader(get_lang('UserList').$url); ?>
<!--List of users -->
<table class="table table-hover table-striped data_table">
<tr>
<th>
<?php echo get_lang('User'); ?>
</th>
<th>
<?php echo get_lang('Actions'); ?>
</th>
</tr>
<?php
if ($session['nbr_users'] == 0) {
echo '<tr>
<td colspan="2">'.get_lang('NoUsersForThisSession').'</td>
</tr>';
} else {
$order_clause = api_sort_by_first_name() ? ' ORDER BY firstname, lastname' : ' ORDER BY lastname, firstname';
if ($multiple_url_is_on) {
$sql = "SELECT u.user_id, lastname, firstname, username, access_url_id
FROM $tbl_user u
INNER JOIN $tbl_session_rel_user su
ON u.user_id = su.user_id AND su.relation_type<>".SESSION_RELATION_TYPE_RRHH."
LEFT OUTER JOIN $table_access_url_user uu ON (uu.user_id = u.user_id)
WHERE su.session_id = $id_session AND (access_url_id = $url_id OR access_url_id is null )
$order_clause";
} else {
$sql = "SELECT u.user_id, lastname, firstname, username
FROM $tbl_user u
INNER JOIN $tbl_session_rel_user su
ON u.user_id = su.user_id AND su.relation_type<>".SESSION_RELATION_TYPE_RRHH."
AND su.session_id = ".$id_session.$order_clause;
}
$result = Database::query($sql);
$users = Database::store_result($result);
// change breadcrumb in destination page
$orig_param = '&origin=resume_session&id_session='.$id_session;
foreach ($users as $user) {
$user_link = '';
if (!empty($user['user_id'])) {
$user_link = '<a href="'.api_get_path(WEB_CODE_PATH).'admin/user_information.php?user_id='.intval($user['user_id']).'">'.
api_htmlentities(api_get_person_name($user['firstname'], $user['lastname']), ENT_QUOTES, $charset).' ('.$user['username'].')</a>';
}
$link_to_add_user_in_url = '';
if ($multiple_url_is_on) {
if ($user['access_url_id'] != $url_id) {
$user_link .= ' '.Display::return_icon('warning.png', get_lang('UserNotAddedInURL'), [], ICON_SIZE_SMALL);
$add = Display::return_icon('add.png', get_lang('AddUsersToURL'), [], ICON_SIZE_SMALL);
$link_to_add_user_in_url = '<a href="resume_session.php?action=add_user_to_url&id_session='.$id_session.'&user_id='.$user['user_id'].'">'.$add.'</a>';
}
}
echo '<tr>
<td width="90%">
'.$user_link.'
</td>
<td>
<a href="../mySpace/myStudents.php?student='.$user['user_id'].''.$orig_param.'">'.
Display::return_icon('statistics.gif', get_lang('Reporting')).'</a>&nbsp;
<a href="session_course_user.php?id_user='.$user['user_id'].'&id_session='.$id_session.'">'.
Display::return_icon('course.png', get_lang('BlockCoursesForThisUser')).'</a>&nbsp;
<a href="'.api_get_self().'?id_session='.$id_session.'&action=delete&user='.$user['user_id'].'" onclick="javascript:if(!confirm(\''.get_lang('ConfirmYourChoice').'\')) return false;">'.
Display::return_icon('delete.png', get_lang('Delete')).'</a>
'.$link_to_add_user_in_url.'
</td>
</tr>';
}
} ?>
</table>
<?php
} else {
api_not_allowed();
}
// footer
Display::display_footer();

149
main/user/session_list.php Normal file
View File

@@ -0,0 +1,149 @@
<?php
/* For licensing terms, see /license.txt */
/**
* List sessions in an efficient and usable way.
*/
$cidReset = true;
require_once __DIR__.'/../inc/global.inc.php';
$this_section = SECTION_PLATFORM_ADMIN;
api_protect_teacher_script(true);
// Add the JS needed to use the jqgrid
$htmlHeadXtra[] = api_get_jqgrid_js();
$tool_name = get_lang('SessionList');
$allowTutors = api_get_setting('allow_tutors_to_assign_students_to_session');
if ($allowTutors !== 'true') {
api_not_allowed(true);
}
Display::display_header($tool_name);
// jqgrid will use this URL to do the selects
$url = api_get_path(WEB_AJAX_PATH).'model.ajax.php?a=get_sessions&from_course_session=1';
if (isset($_REQUEST['keyword'])) {
//Begin with see the searchOper param
$url = api_get_path(WEB_AJAX_PATH).'model.ajax.php?a=get_sessions&from_course_session=1&_search=true&rows=20&page=1&sidx=&sord=asc&filters=&searchField=name&searchString='.Security::remove_XSS($_REQUEST['keyword']).'&searchOper=bw';
}
//The order is important you need to check the the $column variable in the model.ajax.php file
$columns = [
get_lang('Name'),
get_lang('NumberOfCourses'),
get_lang('NumberOfUsers'),
get_lang('SessionCategoryName'),
get_lang('StartDate'),
get_lang('EndDate'),
get_lang('Coach'),
get_lang('Status'),
get_lang('Visibility'),
get_lang('Actions'),
];
//Column config
$column_model = [
['name' => 'name', 'index' => 'name', 'width' => '160', 'align' => 'left', 'search' => 'true', 'wrap_cell' => "true"],
['name' => 'nbr_courses', 'index' => 'nbr_courses', 'width' => '30', 'align' => 'left', 'search' => 'true'],
['name' => 'nbr_users', 'index' => 'nbr_users', 'width' => '30', 'align' => 'left', 'search' => 'true'],
['name' => 'category_name', 'index' => 'category_name', 'width' => '70', 'align' => 'left', 'search' => 'true'],
['name' => 'access_start_date', 'index' => 'access_start_date', 'width' => '40', 'align' => 'left', 'search' => 'true'],
['name' => 'access_end_date', 'index' => 'access_end_date', 'width' => '40', 'align' => 'left', 'search' => 'true'],
['name' => 'coach_name', 'index' => 'coach_name', 'width' => '80', 'align' => 'left', 'search' => 'false'],
['name' => 'status', 'index' => 'session_active', 'width' => '40', 'align' => 'left', 'search' => 'true', 'stype' => 'select',
//for the bottom bar
'searchoptions' => [
'defaultValue' => '1',
'value' => '1:'.get_lang('Active').';0:'.get_lang('Inactive'),
],
//for the top bar
'editoptions' => ['value' => ':'.get_lang('All').';1:'.get_lang('Active').';0:'.get_lang('Inactive')], ],
['name' => 'visibility', 'index' => 'visibility', 'width' => '40', 'align' => 'left', 'search' => 'false'],
['name' => 'actions', 'index' => 'actions', 'width' => '100', 'align' => 'left', 'formatter' => 'action_formatter', 'sortable' => 'false', 'search' => 'false'],
];
//Autowidth
$extra_params['autowidth'] = 'true';
//height auto
$extra_params['height'] = 'auto';
//$extra_params['excel'] = 'excel';
//$extra_params['rowList'] = array(10, 20 ,30);
//With this function we can add actions to the jgrid (edit, delete, etc)
$action_links = 'function action_formatter(cellvalue, options, rowObject) {
return \'&nbsp;<a href="add_users_to_session.php?page=session_list.php&id_session=\'+options.rowId+\'">'.Display::return_icon('user_subscribe_session.png', get_lang('SubscribeUsersToSession'), '', ICON_SIZE_SMALL).'</a>'.
'\';
}';
?>
<script>
function setSearchSelect(columnName) {
$("#sessions").jqGrid('setColProp', columnName,
{
searchoptions:{
dataInit:function(el){
$("option[value='2']",el).attr("selected", "selected");
setTimeout(function(){
$(el).trigger('change');
},1000);
}
}
});
}
$(function() {
<?php
echo Display::grid_js('sessions', $url, $columns, $column_model, $extra_params, [], $action_links, true);
?>
setSearchSelect("status");
$("#sessions").jqGrid('navGrid','#sessions_pager', {edit:false,add:false,del:false},
{height:280,reloadAfterSubmit:false}, // edit options
{height:280,reloadAfterSubmit:false}, // add options
{reloadAfterSubmit:false}, // del options
{width:500} // search options
);
/*
// add custom button to export the data to excel
jQuery("#sessions").jqGrid('navButtonAdd','#sessions_pager',{
caption:"",
onClickButton : function () {
jQuery("#sessions").excelExport();
}
});
jQuery('#sessions').jqGrid('navButtonAdd','#sessions_pager',{id:'pager_csv',caption:'',title:'Export To CSV',onClickButton : function(e)
{
try {
jQuery("#sessions").jqGrid('excelExport',{tag:'csv', url:'grid.php'});
} catch (e) {
window.location= 'grid.php?oper=csv';
}
},buttonicon:'ui-icon-document'})
*/
//Adding search options
var options = {
'stringResult': true,
'autosearch' : true,
'searchOnEnter':false
}
jQuery("#sessions").jqGrid('filterToolbar',options);
var sgrid = $("#sessions")[0];
sgrid.triggerToolbar();
});
</script>
<?php
if (api_is_platform_admin()) {
echo '<div class="actions">';
echo '<a href="'.api_get_path(WEB_CODE_PATH).'session/session_add.php">'.
Display::return_icon('new_session.png', get_lang('AddSession'), '', ICON_SIZE_MEDIUM).'</a>';
echo '<a href="'.api_get_path(WEB_CODE_PATH).'session/add_many_session_to_category.php">'.
Display::return_icon('session_to_category.png', get_lang('AddSessionsInCategories'), '', ICON_SIZE_MEDIUM).'</a>';
echo '<a href="'.api_get_path(WEB_CODE_PATH).'session/session_category_list.php">'.
Display::return_icon('folder.png', get_lang('ListSessionCategory'), '', ICON_SIZE_MEDIUM).'</a>';
echo '</div>';
}
echo Display::grid_html('sessions');
Display::display_footer();

1064
main/user/subscribe_user.php Normal file

File diff suppressed because it is too large Load Diff

1080
main/user/user.php Normal file

File diff suppressed because it is too large Load Diff

187
main/user/user_export.php Normal file
View File

@@ -0,0 +1,187 @@
<?php
/* For licensing terms, see /license.txt */
require_once __DIR__.'/../inc/global.inc.php';
$this_section = SECTION_COURSES;
api_protect_admin_script(true, true, null, true);
$export = [];
$export['file_type'] = isset($_REQUEST['file_type']) ? $_REQUEST['file_type'] : null;
$export['course_code'] = isset($_REQUEST['course_code']) ? $_REQUEST['course_code'] : null;
$export['course_session'] = isset($_REQUEST['course_session']) ? $_REQUEST['course_session'] : null;
$export['addcsvheader'] = isset($_REQUEST['addcsvheader']) ? $_REQUEST['addcsvheader'] : null;
$export['session'] = isset($_REQUEST['session']) ? $_REQUEST['session'] : null;
// Database table definitions
$course_table = Database::get_main_table(TABLE_MAIN_COURSE);
$userTable = Database::get_main_table(TABLE_MAIN_USER);
$course_user_table = Database::get_main_table(TABLE_MAIN_COURSE_USER);
$session_course_user_table = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
$session_user_table = Database::get_main_table(TABLE_MAIN_SESSION_USER);
$fileType = $export['file_type'];
$course_code = Database::escape_string($export['course_code']);
$courseInfo = api_get_course_info($course_code);
$courseId = isset($courseInfo['real_id']) ? $courseInfo['real_id'] : 0;
$courseSessionValue = explode(':', $export['course_session']);
$courseSessionCode = '';
$sessionId = 0;
$courseSessionId = 0;
$sessionInfo = [];
if (!empty($export['session'])) {
$sessionInfo = api_get_session_info($export['session']);
$sessionId = isset($sessionInfo['id']) ? $sessionInfo['id'] : 0;
}
if (is_array($courseSessionValue) && isset($courseSessionValue[1])) {
$courseSessionCode = $courseSessionValue[0];
$sessionId = $courseSessionValue[1];
$courseSessionInfo = api_get_course_info($courseSessionCode);
$courseSessionId = $courseSessionInfo['real_id'];
$sessionInfo = api_get_session_info($sessionId);
}
$extraUrlJoin = '';
$extraUrlCondition = '';
if (api_is_multiple_url_enabled()) {
$tbl_user_rel_access_url = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER);
$access_url_id = api_get_current_access_url_id();
if ($access_url_id != -1) {
$extraUrlJoin .= " INNER JOIN $tbl_user_rel_access_url as user_rel_url
ON (u.id = user_rel_url.user_id) ";
$extraUrlCondition = " AND access_url_id = $access_url_id";
}
}
$sql = "SELECT
u.id AS UserId,
u.lastname AS LastName,
u.firstname AS FirstName,
u.email AS Email,
u.username AS UserName,
".(($_configuration['password_encryption'] != 'none') ? " " : "u.password AS Password, ")."
u.auth_source AS AuthSource,
u.status AS Status,
u.official_code AS OfficialCode,
u.phone AS Phone,
u.registration_date AS RegistrationDate";
if (strlen($course_code) > 0) {
$sql .= " FROM $userTable u
INNER JOIN $course_user_table cu
ON (u.id = cu.user_id)
$extraUrlJoin
WHERE
cu.c_id = $courseId AND
cu.relation_type <> ".COURSE_RELATION_TYPE_RRHH."
$extraUrlCondition
ORDER BY lastname,firstname";
$filename = 'export_users_'.$course_code.'_'.api_get_local_time();
} elseif (strlen($courseSessionCode) > 0) {
$sql .= " FROM $userTable u
INNER JOIN $session_course_user_table scu
ON (u.id = scu.user_id)
$extraUrlJoin
WHERE
scu.c_id = $courseSessionId AND
scu.session_id = $sessionId
$extraUrlCondition
ORDER BY lastname,firstname";
$filename = 'export_users_'.$courseSessionCode.'_'.$sessionInfo['name'].'_'.api_get_local_time();
} elseif ($sessionId > 0) {
$sql .= " FROM $userTable u
INNER JOIN $session_user_table su
ON (u.id = su.user_id)
$extraUrlJoin
WHERE
su.session_id = $sessionId
$extraUrlCondition
ORDER BY lastname,firstname";
$filename = 'export_users_'.$sessionInfo['name'].'_'.api_get_local_time();
} else {
if (api_is_multiple_url_enabled()) {
$tbl_user_rel_access_url = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER);
$access_url_id = api_get_current_access_url_id();
if ($access_url_id != -1) {
$sql .= " FROM $userTable u
INNER JOIN $tbl_user_rel_access_url as user_rel_url
ON (u.id = user_rel_url.user_id)
WHERE access_url_id = $access_url_id
ORDER BY lastname,firstname";
}
} else {
$sql .= " FROM $userTable u ORDER BY lastname,firstname";
}
$filename = 'export_users_'.api_get_local_time();
}
$data = [];
$extra_fields = UserManager::get_extra_fields(0, 0, 5, 'ASC', false);
if ($export['addcsvheader'] == '1' && $export['file_type'] === 'csv') {
if ($_configuration['password_encryption'] !== 'none') {
$data[] = [
'UserId',
'LastName',
'FirstName',
'Email',
'UserName',
'AuthSource',
'Status',
'OfficialCode',
'PhoneNumber',
'RegistrationDate',
];
} else {
$data[] = [
'UserId',
'LastName',
'FirstName',
'Email',
'UserName',
'Password',
'AuthSource',
'Status',
'OfficialCode',
'PhoneNumber',
'RegistrationDate',
];
}
foreach ($extra_fields as $extra) {
$data[0][] = $extra[1];
}
}
$res = Database::query($sql);
while ($user = Database::fetch_array($res, 'ASSOC')) {
$studentData = UserManager::get_extra_user_data(
$user['UserId'],
true,
false
);
foreach ($studentData as $key => $value) {
$key = substr($key, 6);
if (is_array($value)) {
$user[$key] = $value['extra_'.$key];
} else {
$user[$key] = $value;
}
}
$data[] = $user;
}
switch ($fileType) {
case 'xml':
Export::arrayToXml($data, $filename, 'Contact', 'Contacts');
exit;
break;
case 'csv':
Export::arrayToCsv($data, $filename);
exit;
case 'xls':
Export::arrayToXls($data, $filename);
exit;
break;
}

172
main/user/user_import.php Normal file
View File

@@ -0,0 +1,172 @@
<?php
/* For licensing terms, see /license.txt */
require_once __DIR__.'/../inc/global.inc.php';
$this_section = SECTION_COURSES;
// notice for unauthorized people.
api_protect_course_script(true);
if (api_get_setting('allow_user_course_subscription_by_course_admin') == 'false') {
if (!api_is_platform_admin()) {
api_not_allowed(true);
}
}
// Make sure we know if we're importing students or teachers into the course
$userType = STUDENT;
if (!empty($_REQUEST['type']) && $_REQUEST['type'] == COURSEMANAGER) {
$userType = COURSEMANAGER;
}
$tool_name = get_lang('ImportUsersToACourse');
$interbreadcrumb[] = ["url" => "user.php", "name" => get_lang("Users")];
$interbreadcrumb[] = ["url" => "#", "name" => get_lang("ImportUsersToACourse")];
$form = new FormValidator('user_import', 'post', 'user_import.php');
$form->addElement('header', $tool_name);
$form->addElement('file', 'import_file', get_lang('ImportCSVFileLocation'));
$form->addElement('checkbox', 'unsubscribe_users', null, get_lang('UnsubscribeUsersAlreadyAddedInCourse'));
$form->addElement('hidden', 'type', $userType);
$form->addButtonImport(get_lang('Import'));
$course_code = api_get_course_id();
if (empty($course_code)) {
api_not_allowed(true);
}
$session_id = api_get_session_id();
$message = '';
$user_to_show = [];
$type = '';
if ($form->validate()) {
if (isset($_FILES['import_file']['size']) && $_FILES['import_file']['size'] !== 0) {
$unsubscribe_users = isset($_POST['unsubscribe_users']) ? true : false;
//@todo : csvToArray deprecated
$users = Import::csvToArray($_FILES['import_file']['tmp_name']);
$invalid_users = [];
$clean_users = [];
if (!empty($users)) {
$empty_line = 0;
foreach ($users as $user_data) {
$user_id = null;
$user_data = array_change_key_case($user_data, CASE_LOWER);
// Checking "username" field
if (isset($user_data['username']) && !empty($user_data['username'])) {
$user_id = UserManager::get_user_id_from_username($user_data['username']);
}
// Checking "id" field
if (isset($user_data['id']) && !empty($user_data['id'])) {
$user_id = $user_data['id'];
}
if (UserManager::is_user_id_valid($user_id)) {
$clean_users[] = $user_id;
} else {
$invalid_users[] = $user_data;
}
}
if (empty($invalid_users)) {
$type = 'confirmation';
$message = get_lang('ListOfUsersSubscribedToCourse');
if ($unsubscribe_users) {
$current_user_list = CourseManager::get_user_list_from_course_code(
$course_code,
$session_id,
null,
null,
$userType
);
if (!empty($current_user_list)) {
$user_ids = [];
foreach ($current_user_list as $user) {
if ($userType == COURSEMANAGER) {
if (CourseManager::is_course_teacher($user['user_id'], $course_code)) {
$user_ids[] = $user['user_id'];
}
} else {
if (!CourseManager::is_course_teacher($user['user_id'], $course_code)) {
$user_ids[] = $user['user_id'];
}
}
}
CourseManager::unsubscribe_user($user_ids, $course_code, $session_id);
}
}
foreach ($clean_users as $userId) {
$userInfo = api_get_user_info($userId);
CourseManager::subscribeUser($userId, $course_code, $userType, $session_id);
if (empty($session_id)) {
//just to make sure
if (CourseManager::is_user_subscribed_in_course($userId, $course_code)) {
$user_to_show[] = $userInfo['complete_name'];
}
} else {
//just to make sure
if (CourseManager::is_user_subscribed_in_course($userId, $course_code, true, $session_id)) {
$user_to_show[] = $userInfo['complete_name'];
}
}
}
} else {
$message = get_lang('CheckUsersWithId');
$type = 'warning';
foreach ($invalid_users as $invalid_user) {
$user_to_show[] = $invalid_user;
}
}
}
}
}
Display::display_header();
if (!empty($message)) {
if (!empty($user_to_show)) {
$userMessage = null;
foreach ($user_to_show as $user) {
if (!is_array($user)) {
$user = [$user];
}
$user = array_filter($user);
$userMessage .= implode(', ', $user)."<br />";
}
if ($type == 'confirmation') {
echo Display::return_message($message.': <br />'.$userMessage, 'confirm', false);
} else {
echo Display::return_message($message.': <br />'.$userMessage, 'warning', false);
}
} else {
$empty_line_msg = ($empty_line == 0) ? get_lang('ErrorsWhenImportingFile') : get_lang('ErrorsWhenImportingFile').': '.get_lang('EmptyHeaderLine');
echo Display::return_message($empty_line_msg, 'error');
}
}
$form->display();
echo get_lang('CSVMustLookLike');
echo '<blockquote><pre>
username
jdoe
jmontoya
</pre>
</blockquote>';
echo get_lang('Or');
echo '<blockquote><pre>
id
23
1337
</pre>
</blockquote>';
Display::display_footer();