Chamilo is a learning management system focused on ease of use and accessibility
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
chamilo-lms/main/inc/ajax/course_home.ajax.php

599 lines
23 KiB

<?php
/* For licensing terms, see /license.txt */
use Chamilo\CourseBundle\Entity\CTool;
use ChamiloSession as Session;
// @todo refactor this script, create a class that manage the jqgrid requests
/**
* Responses to AJAX calls.
*/
$action = $_GET['a'];
switch ($action) {
case 'set_visibility':
require_once __DIR__.'/../global.inc.php';
$course_id = api_get_course_int_id();
$sessionId = api_get_session_id();
// Allow tool visibility in sessions.
$allowEditionInSession = api_get_configuration_value('allow_edit_tool_visibility_in_session');
$em = Database::getManager();
$repository = $em->getRepository('ChamiloCourseBundle:CTool');
if (api_is_allowed_to_edit(null, true)) {
$criteria = [
'course' => $course_id,
'sessionId' => 0,
'iid' => (int) $_GET['id'],
];
/** @var CTool $tool */
$tool = $repository->findOneBy($criteria);
$visibility = $tool->getVisibility();
if ($allowEditionInSession && !empty($sessionId)) {
$criteria = [
'cId' => $course_id,
'sessionId' => $sessionId,
'name' => $tool->getName(),
];
/** @var CTool $tool */
$toolInSession = $repository->findOneBy($criteria);
if ($toolInSession) {
// Use the session
$tool = $toolInSession;
$visibility = $toolInSession->getVisibility();
} else {
// Creates new row in c_tool
$toolInSession = clone $tool;
$toolInSession->setIid(0);
$toolInSession->setId(0);
$toolInSession->setVisibility(0);
$toolInSession->setSessionId($session_id);
$em->persist($toolInSession);
$em->flush();
// Update id with iid
$toolInSession->setId($toolInSession->getIid());
$em->persist($toolInSession);
$em->flush();
// $tool will be updated later
$tool = $toolInSession;
}
}
$toolImage = $tool->getImage();
$customIcon = $tool->getCustomIcon();
if (api_get_setting('homepage_view') != 'activity_big') {
$toolImage = Display::return_icon(
$toolImage,
null,
null,
null,
null,
true
);
$inactiveImage = str_replace('.gif', '_na.gif', $toolImage);
} else {
// Display::return_icon() also checks in the app/Resources/public/css/themes/{theme}/icons folder
$toolImage = (substr($toolImage, 0, strpos($toolImage, '.'))).'.png';
$toolImage = Display::return_icon(
$toolImage,
get_lang(ucfirst($tool->getName())),
null,
ICON_SIZE_BIG,
null,
true
);
$inactiveImage = str_replace('.png', '_na.png', $toolImage);
}
if (isset($customIcon) && !empty($customIcon)) {
$toolImage = CourseHome::getCustomWebIconPath().$customIcon;
$inactiveImage = CourseHome::getCustomWebIconPath().CourseHome::getDisableIcon($customIcon);
}
$requested_image = $visibility == 0 ? $toolImage : $inactiveImage;
$requested_class = $visibility == 0 ? '' : 'text-muted';
$requested_message = $visibility == 0 ? 'is_active' : 'is_inactive';
$requested_view = $visibility == 0 ? 'visible.png' : 'invisible.png';
$requestedVisible = $visibility == 0 ? 1 : 0;
$requested_view = $visibility == 0 ? 'visible.png' : 'invisible.png';
$requestedVisible = $visibility == 0 ? 1 : 0;
// HIDE AND REACTIVATE TOOL
if ($_GET['id'] == strval(intval($_GET['id']))) {
$tool->setVisibility($requestedVisible);
$em->persist($tool);
$em->flush();
// Also hide the tool in all sessions
if ($allowEditionInSession && empty($sessionId)) {
$criteria = [
'cId' => $course_id,
'name' => $tool->getName(),
];
/** @var CTool $toolItem */
$tools = $repository->findBy($criteria);
foreach ($tools as $toolItem) {
$toolSessionId = $toolItem->getSessionId();
if (!empty($toolSessionId)) {
$toolItem->setVisibility($requestedVisible);
$em->persist($toolItem);
}
}
$em->flush();
}
}
$response = [
'image' => $requested_image,
'tclass' => $requested_class,
'message' => $requested_message,
'view' => $requested_view,
];
echo json_encode($response);
}
break;
case 'show_course_information':
require_once __DIR__.'/../global.inc.php';
// Get the name of the database course.
$course_info = api_get_course_info($_GET['code']);
$content = get_lang('NoDescription');
if (!empty($course_info)) {
if (api_get_setting('course_catalog_hide_private') === 'true' &&
$course_info['visibility'] == COURSE_VISIBILITY_REGISTERED
) {
echo get_lang('PrivateAccess');
break;
}
$table = Database::get_course_table(TABLE_COURSE_DESCRIPTION);
$sql = "SELECT * FROM $table
WHERE c_id = ".$course_info['real_id']." AND session_id = 0
ORDER BY id";
$result = Database::query($sql);
if (Database::num_rows($result) > 0) {
while ($description = Database::fetch_object($result)) {
$descriptions[$description->id] = $description;
}
$content = CourseManager::get_details_course_description_html(
$descriptions,
api_get_system_encoding(),
false
);
}
}
echo $content;
break;
case 'session_courses_lp_default':
/**
* @todo this functions need to belong to a class or a special
* wrapper to process the AJAX petitions from the jqgrid
*/
require_once __DIR__.'/../global.inc.php';
$now = time();
$page = (int) $_REQUEST['page']; //page
$limit = (int) $_REQUEST['rows']; // quantity of rows
//index to filter
$sidx = isset($_REQUEST['sidx']) && !empty($_REQUEST['sidx']) ? $_REQUEST['sidx'] : 'id';
$sord = $_REQUEST['sord']; //asc or desc
if (!in_array($sord, ['asc', 'desc'])) {
$sord = 'desc';
}
$session_id = (int) $_REQUEST['session_id'];
$course_id = (int) $_REQUEST['course_id'];
//Filter users that does not belong to the session
if (!api_is_platform_admin()) {
$new_session_list = UserManager::get_personal_session_course_list(api_get_user_id());
$my_session_list = [];
foreach ($new_session_list as $item) {
if (!empty($item['session_id'])) {
$my_session_list[] = $item['session_id'];
}
}
if (!in_array($session_id, $my_session_list)) {
break;
}
}
$start = $limit * $page - $limit;
$course_list = SessionManager::get_course_list_by_session_id($session_id);
$count = 0;
$temp = [];
foreach ($course_list as $item) {
$list = new LearnpathList(api_get_user_id(), $item['code'], $session_id);
$flat_list = $list->get_flat_list();
$lps[$item['code']] = $flat_list;
$course_url = api_get_path(WEB_COURSE_PATH).$item['directory'].'/?id_session='.$session_id;
$item['title'] = Display::url($item['title'], $course_url, ['target' => SESSION_LINK_TARGET]);
foreach ($flat_list as $lp_id => $lp_item) {
$temp[$count]['id'] = $lp_id;
$lp = new learnpath($item['code'], $lp_id, api_get_user_id());
if ($lp->progress_db == 100) {
continue;
}
$lp_url = api_get_path(WEB_CODE_PATH).'lp/lp_controller.php?cidReq='.$item['code'].'&id_session='.$session_id.'&lp_id='.$lp_id.'&action=view';
$last_date = Tracking::get_last_connection_date_on_the_course(
api_get_user_id(),
$item,
$session_id,
false
);
if (empty($lp_item['modified_on'])) {
$lp_date = api_get_local_time($lp_item['created_on']);
$image = 'new.gif';
$label = get_lang('LearnpathAdded');
} else {
$lp_date = api_get_local_time($lp_item['modified_on']);
$image = 'moderator_star.png';
$label = get_lang('LearnpathUpdated');
}
$icons = '';
if (strtotime($last_date) < strtotime($lp_date)) {
$icons = Display::return_icon($image, get_lang('TitleNotification').': '.$label.' - '.$lp_date);
}
if (!empty($lp_item['publicated_on'])) {
$date = substr($lp_item['publicated_on'], 0, 10);
} else {
$date = '-';
}
// Checking LP publicated and expired_on dates
if (!empty($lp_item['publicated_on'])) {
if ($now < api_strtotime($lp_item['publicated_on'], 'UTC')) {
continue;
}
}
if (!empty($lp_item['expired_on'])) {
if ($now > api_strtotime($lp_item['expired_on'], 'UTC')) {
continue;
}
}
$temp[$count]['cell'] = [
$date,
$item['title'],
Display::url($icons.' '.$lp_item['lp_name'], $lp_url, ['target' => SESSION_LINK_TARGET]),
];
$temp[$count]['course'] = strip_tags($item['title']);
$temp[$count]['lp'] = $lp_item['lp_name'];
$temp[$count]['date'] = $lp_item['publicated_on'];
$count++;
}
}
$temp = msort($temp, $sidx, $sord);
$i = 0;
$response = new stdClass();
foreach ($temp as $key => $row) {
$row = $row['cell'];
if (!empty($row)) {
if ($key >= $start && $key < ($start + $limit)) {
$response->rows[$i]['id'] = $key;
$response->rows[$i]['cell'] = [$row[0], $row[1], $row[2]];
$i++;
}
}
}
$total_pages = 0;
if ($count > 0 && $limit > 0) {
$total_pages = ceil($count / $limit);
}
$response->total = $total_pages;
if ($page > $total_pages) {
$response->page = $total_pages;
} else {
$response->page = $page;
}
$response->records = $count;
echo json_encode($response);
break;
case 'session_courses_lp_by_week':
require_once __DIR__.'/../global.inc.php';
$now = time();
$page = (int) $_REQUEST['page']; //page
$limit = (int) $_REQUEST['rows']; // quantity of rows
$sidx = isset($_REQUEST['sidx']) && !empty($_REQUEST['sidx']) ? $_REQUEST['sidx'] : 'course';
$sidx = str_replace(['week desc,', ' '], '', $sidx);
$sord = $_REQUEST['sord']; //asc or desc
if (!in_array($sord, ['asc', 'desc'])) {
$sord = 'desc';
}
$session_id = (int) $_REQUEST['session_id'];
$course_id = (int) $_REQUEST['course_id'];
//Filter users that does not belong to the session
if (!api_is_platform_admin()) {
$new_session_list = UserManager::get_personal_session_course_list(api_get_user_id());
$my_session_list = [];
foreach ($new_session_list as $item) {
if (!empty($item['session_id'])) {
$my_session_list[] = $item['session_id'];
}
}
if (!in_array($session_id, $my_session_list)) {
break;
}
}
$start = $limit * $page - $limit;
$course_list = SessionManager::get_course_list_by_session_id($session_id);
$count = 0;
$temp = [];
foreach ($course_list as $item) {
if (isset($course_id) && !empty($course_id)) {
if ($course_id != $item['id']) {
continue;
}
}
$list = new LearnpathList(
api_get_user_id(),
$item['code'],
$session_id,
'lp.publicatedOn DESC'
);
$flat_list = $list->get_flat_list();
$lps[$item['code']] = $flat_list;
$item['title'] = Display::url(
$item['title'],
api_get_path(WEB_COURSE_PATH).$item['directory'].'/?id_session='.$session_id,
['target' => SESSION_LINK_TARGET]
);
foreach ($flat_list as $lp_id => $lp_item) {
$temp[$count]['id'] = $lp_id;
$lp_url = api_get_path(WEB_CODE_PATH).'lp/lp_controller.php?cidReq='.$item['code'].'&id_session='.$session_id.'&lp_id='.$lp_id.'&action=view';
$last_date = Tracking::get_last_connection_date_on_the_course(
api_get_user_id(),
$item,
$session_id,
false
);
if (empty($lp_item['modified_on'])) {
$lp_date = api_get_local_time($lp_item['created_on']);
$image = 'new.gif';
$label = get_lang('LearnpathAdded');
} else {
$lp_date = api_get_local_time($lp_item['modified_on']);
$image = 'moderator_star.png';
$label = get_lang('LearnpathUpdated');
}
if (strtotime($last_date) < strtotime($lp_date)) {
$icons = Display::return_icon($image, get_lang('TitleNotification').': '.$label.' - '.$lp_date);
}
if (!empty($lp_item['publicated_on'])) {
$date = substr($lp_item['publicated_on'], 0, 10);
} else {
$date = '-';
}
// Checking LP publicated and expired_on dates
if (!empty($lp_item['publicated_on'])) {
$week_data = date('Y', api_strtotime($lp_item['publicated_on'], 'UTC')).' - '.get_week_from_day($lp_item['publicated_on']);
if ($now < api_strtotime($lp_item['publicated_on'], 'UTC')) {
continue;
}
} else {
$week_data = '';
}
if (!empty($lp_item['expired_on'])) {
if ($now > api_strtotime($lp_item['expired_on'], 'UTC')) {
continue;
}
}
$temp[$count]['cell'] = [
$week_data,
$date,
$item['title'],
Display::url($icons.' '.$lp_item['lp_name'], $lp_url, ['target' => SESSION_LINK_TARGET]),
];
$temp[$count]['course'] = strip_tags($item['title']);
$temp[$count]['lp'] = $lp_item['lp_name'];
$count++;
}
}
if (!empty($sidx)) {
$temp = msort($temp, $sidx, $sord);
}
$response = new stdClass();
$i = 0;
foreach ($temp as $key => $row) {
$row = $row['cell'];
if (!empty($row)) {
if ($key >= $start && $key < ($start + $limit)) {
$response->rows[$i]['id'] = $key;
$response->rows[$i]['cell'] = [$row[0], $row[1], $row[2], $row[3]];
$i++;
}
}
}
$total_pages = 0;
if ($count > 0 && $limit > 0) {
$total_pages = ceil($count / $limit);
}
$response->total = $total_pages;
if ($page > $total_pages) {
$response->page = $total_pages;
} else {
$response->page = $page;
}
$response->records = $count;
echo json_encode($response);
break;
case 'session_courses_lp_by_course':
require_once __DIR__.'/../global.inc.php';
$now = time();
$page = (int) $_REQUEST['page']; //page
$limit = (int) $_REQUEST['rows']; // quantity of rows
$sidx = isset($_REQUEST['sidx']) && !empty($_REQUEST['sidx']) ? $_REQUEST['sidx'] : 'id';
$sidx = str_replace(['course asc,', ' '], '', $sidx);
$sord = $_REQUEST['sord']; //asc or desc
if (!in_array($sord, ['asc', 'desc'])) {
$sord = 'desc';
}
$session_id = (int) $_REQUEST['session_id'];
$course_id = (int) $_REQUEST['course_id'];
//Filter users that does not belong to the session
if (!api_is_platform_admin()) {
$new_session_list = UserManager::get_personal_session_course_list(api_get_user_id());
$my_session_list = [];
foreach ($new_session_list as $item) {
if (!empty($item['session_id'])) {
$my_session_list[] = $item['session_id'];
}
}
if (!in_array($session_id, $my_session_list)) {
break;
}
}
$start = $limit * $page - $limit;
$course_list = SessionManager::get_course_list_by_session_id($session_id);
$count = 0;
$temp = [];
foreach ($course_list as $item) {
if (isset($course_id) && !empty($course_id)) {
if ($course_id != $item['id']) {
continue;
}
}
$list = new LearnpathList(
api_get_user_id(),
$item['code'],
$session_id
);
$flat_list = $list->get_flat_list();
$lps[$item['code']] = $flat_list;
$item['title'] = Display::url(
$item['title'],
api_get_path(WEB_COURSE_PATH).$item['directory'].'/?id_session='.$session_id,
['target' => SESSION_LINK_TARGET]
);
foreach ($flat_list as $lp_id => $lp_item) {
$temp[$count]['id'] = $lp_id;
$lp_url = api_get_path(WEB_CODE_PATH).'lp/lp_controller.php?cidReq='.$item['code'].'&id_session='.$session_id.'&lp_id='.$lp_id.'&action=view';
$last_date = Tracking::get_last_connection_date_on_the_course(
api_get_user_id(),
$item,
$session_id,
false
);
if (empty($lp_item['modified_on'])) {
$lp_date = api_get_local_time($lp_item['created_on']);
$image = 'new.gif';
$label = get_lang('LearnpathAdded');
} else {
$lp_date = api_get_local_time($lp_item['modified_on']);
$image = 'moderator_star.png';
$label = get_lang('LearnpathUpdated');
}
$icons = '';
if (strtotime($last_date) < strtotime($lp_date)) {
$icons = Display::return_icon($image, get_lang('TitleNotification').': '.$label.' - '.$lp_date);
}
if (!empty($lp_item['publicated_on'])) {
$date = substr($lp_item['publicated_on'], 0, 10);
} else {
$date = '-';
}
// Checking LP publicated and expired_on dates
if (!empty($lp_item['publicated_on'])) {
if ($now < api_strtotime($lp_item['publicated_on'], 'UTC')) {
continue;
}
}
if (!empty($lp_item['expired_on'])) {
if ($now > api_strtotime($lp_item['expired_on'], 'UTC')) {
continue;
}
}
$temp[$count]['cell'] = [
$date,
$item['title'],
Display::url($icons.' '.$lp_item['lp_name'], $lp_url, ['target' => SESSION_LINK_TARGET]),
];
$temp[$count]['course'] = strip_tags($item['title']);
$temp[$count]['lp'] = $lp_item['lp_name'];
$temp[$count]['date'] = $lp_item['publicated_on'];
$count++;
}
}
$temp = msort($temp, $sidx, $sord);
$response = new stdClass();
$i = 0;
foreach ($temp as $key => $row) {
$row = $row['cell'];
if (!empty($row)) {
if ($key >= $start && $key < ($start + $limit)) {
$response->rows[$i]['id'] = $key;
$response->rows[$i]['cell'] = [$row[0], $row[1], $row[2]];
$i++;
}
}
}
$total_pages = 0;
if ($count > 0 && $limit > 0) {
$total_pages = ceil($count / $limit);
}
$response->total = $total_pages;
$response->page = $page;
if ($page > $total_pages) {
$response->page = $total_pages;
}
$response->records = $count;
echo json_encode($response);
break;
case 'get_notification':
$courseId = isset($_REQUEST['course_id']) ? (int) $_REQUEST['course_id'] : 0;
$sessionId = isset($_REQUEST['session_id']) ? (int) $_REQUEST['session_id'] : 0;
$status = isset($_REQUEST['status']) ? (int) $_REQUEST['status'] : 0;
if (empty($courseId)) {
break;
}
require_once __DIR__.'/../global.inc.php';
$courseInfo = api_get_course_info_by_id($courseId);
$courseInfo['id_session'] = $sessionId;
$courseInfo['status'] = $status;
$id = 'notification_'.$courseId.'_'.$sessionId.'_'.$status;
$notificationId = Session::read($id);
if ($notificationId) {
echo Display::show_notification($courseInfo, false);
Session::erase($notificationId);
}
break;
default:
echo '';
}
exit;