|
|
|
@ -3339,81 +3339,6 @@ class CourseManager |
|
|
|
|
return $html; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Builds the course block in user_portal.php |
|
|
|
|
* @todo use Twig |
|
|
|
|
* @param array $params |
|
|
|
|
* @param bool|false $is_sub_content |
|
|
|
|
* @return string |
|
|
|
|
*/ |
|
|
|
|
public static function course_item_html($params, $is_sub_content = false) |
|
|
|
|
{ |
|
|
|
|
$html = ''; |
|
|
|
|
$class = "panel panel-default"; |
|
|
|
|
if ($is_sub_content) { |
|
|
|
|
$class = "course_item"; |
|
|
|
|
} |
|
|
|
|
$html .= '<div class="' . $class . '">'; |
|
|
|
|
$html .= '<div class="panel-body">'; |
|
|
|
|
$html .= '<div class="course-items">'; |
|
|
|
|
$html .= ' <div class="row">'; |
|
|
|
|
$html .= '<div class="col-md-2">'; |
|
|
|
|
if (!empty($params['link'])) { |
|
|
|
|
$html .= '<a class="thumbnail" href="' . $params['link'] . '">'; |
|
|
|
|
$html .= $params['icon']; |
|
|
|
|
$html .= '</a>'; |
|
|
|
|
} else { |
|
|
|
|
$html .= '<div class="thumbnail">'; |
|
|
|
|
$html .= $params['icon']; |
|
|
|
|
$html .= '</div>'; |
|
|
|
|
} |
|
|
|
|
$html .= '</div>'; |
|
|
|
|
$notifications = isset($params['notifications']) ? $params['notifications'] : ''; |
|
|
|
|
$param_class = isset($params['class']) ? $params['class'] : ''; |
|
|
|
|
$params['right_actions'] = isset($params['right_actions']) ? $params['right_actions'] : ''; |
|
|
|
|
|
|
|
|
|
$html .= '<div class="col-md-10 ' . $param_class . '">'; |
|
|
|
|
$html .= '<div class="pull-right">' . $params['right_actions'] . '</div>'; |
|
|
|
|
$html .= '<h4 class="course-items-title">' . $params['title'] . $notifications . '</h4> '; |
|
|
|
|
|
|
|
|
|
if (isset($params['show_description'], $params['description']) && $params['show_description'] == 1) { |
|
|
|
|
$html .= '<p class="description-session">' . $params['description'] . '</p>'; |
|
|
|
|
} |
|
|
|
|
if (!empty($params['subtitle'])) { |
|
|
|
|
$html .= '<div class="subtitle-session">' . $params['subtitle'] . '</div>'; |
|
|
|
|
} |
|
|
|
|
if (!empty($params['teachers'])) { |
|
|
|
|
$html .= '<h5 class="course-items-session">' . |
|
|
|
|
Display::return_icon('teacher.png', get_lang('Teacher'), array(), ICON_SIZE_TINY) . |
|
|
|
|
$params['teachers'] . '</h5>'; |
|
|
|
|
} |
|
|
|
|
if (!empty($params['coaches'])) { |
|
|
|
|
$html .= '<h5 class="course-items-session">' . |
|
|
|
|
Display::return_icon('teacher.png', get_lang('Coach'), array(), ICON_SIZE_TINY) . |
|
|
|
|
$params['coaches'] . '</h5>'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$html .= '</div>'; |
|
|
|
|
$html .= '</div>'; |
|
|
|
|
|
|
|
|
|
$html .= '</div>'; |
|
|
|
|
|
|
|
|
|
$html .= '</div>'; |
|
|
|
|
$html .= '</div>'; |
|
|
|
|
return $html; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @param string $main_content |
|
|
|
|
* @param string $sub_content |
|
|
|
|
* @param string $sub_sub_content |
|
|
|
|
* @return string |
|
|
|
|
*/ |
|
|
|
|
public static function course_item_parent($main_content, $sub_content, $sub_sub_content = null) |
|
|
|
|
{ |
|
|
|
|
return '<div class="panel panel-default">' . $main_content . $sub_content . $sub_sub_content . '</div>'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Display special courses (and only these) as several HTML divs of class userportal-course-item |
|
|
|
|
* |
|
|
|
@ -3516,76 +3441,7 @@ class CourseManager |
|
|
|
|
} |
|
|
|
|
return $listCourse; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Display courses (without special courses) as several HTML divs |
|
|
|
|
* of course categories, as class userportal-catalog-item. |
|
|
|
|
* @uses displayCoursesInCategory() to display the courses themselves |
|
|
|
|
* @param int user id |
|
|
|
|
* @param bool Whether to show the document quick-loader or not |
|
|
|
|
* @return string |
|
|
|
|
*/ |
|
|
|
|
public static function display_courses($user_id, $load_dirs = false) |
|
|
|
|
{ |
|
|
|
|
$user_id = intval($user_id); |
|
|
|
|
if (empty($user_id)) { |
|
|
|
|
$user_id = api_get_user_id(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Step 1: We get all the categories of the user |
|
|
|
|
$table = Database::get_main_table(TABLE_USER_COURSE_CATEGORY); |
|
|
|
|
$sql = "SELECT id, title FROM $table |
|
|
|
|
WHERE user_id = '" . $user_id . "' |
|
|
|
|
ORDER BY sort ASC"; |
|
|
|
|
$result = Database::query($sql); |
|
|
|
|
$html = null; |
|
|
|
|
$courseCount = 0; |
|
|
|
|
$items = []; |
|
|
|
|
while ($row = Database::fetch_array($result)) { |
|
|
|
|
// We simply display the title of the category. |
|
|
|
|
$params = array( |
|
|
|
|
'icon' => Display::return_icon( |
|
|
|
|
'folder_yellow.png', |
|
|
|
|
api_htmlentities($row['title']), array(), ICON_SIZE_LARGE |
|
|
|
|
), |
|
|
|
|
'title' => $row['title'], |
|
|
|
|
'class' => 'table_user_course_category' |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
$courseInCategory = self:: displayCoursesInCategory( |
|
|
|
|
$row['id'], |
|
|
|
|
$load_dirs |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
$item = self::course_item_parent( |
|
|
|
|
self::course_item_html($params, true), |
|
|
|
|
$courseInCategory['html'] |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
$html .= $item; |
|
|
|
|
|
|
|
|
|
$items[] = $item; |
|
|
|
|
$courseCount += $courseInCategory['course_count']; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Step 2: We display the course without a user category. |
|
|
|
|
$courseInCategory = self::displayCoursesInCategory(0, $load_dirs); |
|
|
|
|
|
|
|
|
|
$html .= $courseInCategory['html']; |
|
|
|
|
|
|
|
|
|
if (!empty($courseInCategory['items'])) { |
|
|
|
|
$items = array_merge($items, $courseInCategory['items']); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$courseCount += $courseInCategory['course_count']; |
|
|
|
|
|
|
|
|
|
return [ |
|
|
|
|
'html' => $html, |
|
|
|
|
'items' => $items, |
|
|
|
|
'course_count' => $courseCount |
|
|
|
|
]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Display courses (without special courses) as several HTML divs |
|
|
|
|
* of course categories, as class userportal-catalog-item. |
|
|
|
@ -3906,191 +3762,7 @@ class CourseManager |
|
|
|
|
|
|
|
|
|
return $listCourse; |
|
|
|
|
} |
|
|
|
|
/** |
|
|
|
|
* Display courses inside a category (without special courses) as HTML dics of |
|
|
|
|
* class userportal-course-item. |
|
|
|
|
* @param int User category id |
|
|
|
|
* @param bool Whether to show the document quick-loader or not |
|
|
|
|
* @return string |
|
|
|
|
*/ |
|
|
|
|
public static function displayCoursesInCategory($user_category_id, $load_dirs = false) |
|
|
|
|
{ |
|
|
|
|
$user_id = api_get_user_id(); |
|
|
|
|
// Table definitions |
|
|
|
|
$TABLECOURS = Database:: get_main_table(TABLE_MAIN_COURSE); |
|
|
|
|
$TABLECOURSUSER = Database:: get_main_table(TABLE_MAIN_COURSE_USER); |
|
|
|
|
$TABLE_ACCESS_URL_REL_COURSE = Database:: get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE); |
|
|
|
|
$current_url_id = api_get_current_access_url_id(); |
|
|
|
|
|
|
|
|
|
// Get course list auto-register |
|
|
|
|
$special_course_list = self::get_special_course_list(); |
|
|
|
|
|
|
|
|
|
$without_special_courses = ''; |
|
|
|
|
if (!empty($special_course_list)) { |
|
|
|
|
$without_special_courses = ' AND course.code NOT IN ("' . implode('","', $special_course_list) . '")'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//AND course_rel_user.relation_type<>".COURSE_RELATION_TYPE_RRHH." |
|
|
|
|
$sql = "SELECT |
|
|
|
|
course.id, |
|
|
|
|
course.title, |
|
|
|
|
course.code, |
|
|
|
|
course.subscribe subscr, |
|
|
|
|
course.unsubscribe unsubscr, |
|
|
|
|
course_rel_user.status status, |
|
|
|
|
course_rel_user.sort sort, |
|
|
|
|
course_rel_user.user_course_cat user_course_cat |
|
|
|
|
FROM $TABLECOURS course, |
|
|
|
|
$TABLECOURSUSER course_rel_user, |
|
|
|
|
$TABLE_ACCESS_URL_REL_COURSE url |
|
|
|
|
WHERE |
|
|
|
|
course.id = course_rel_user.c_id AND |
|
|
|
|
url.c_id = course.id AND |
|
|
|
|
course_rel_user.user_id = '" . $user_id . "' AND |
|
|
|
|
course_rel_user.user_course_cat = '" . $user_category_id . "' |
|
|
|
|
$without_special_courses "; |
|
|
|
|
|
|
|
|
|
// If multiple URL access mode is enabled, only fetch courses |
|
|
|
|
// corresponding to the current URL. |
|
|
|
|
if (api_get_multiple_access_url() && $current_url_id != -1) { |
|
|
|
|
$sql .= " AND url.c_id = course.id AND access_url_id='" . $current_url_id . "'"; |
|
|
|
|
} |
|
|
|
|
// Use user's classification for courses (if any). |
|
|
|
|
$sql .= " ORDER BY course_rel_user.user_course_cat, course_rel_user.sort ASC"; |
|
|
|
|
|
|
|
|
|
$result = Database::query($sql); |
|
|
|
|
$html = ''; |
|
|
|
|
$items = []; |
|
|
|
|
|
|
|
|
|
$course_list = array(); |
|
|
|
|
$showCustomIcon = api_get_setting('course_images_in_courses_list'); |
|
|
|
|
$courseCount = 0; |
|
|
|
|
// Browse through all courses. |
|
|
|
|
while ($course = Database::fetch_array($result)) { |
|
|
|
|
$course_info = api_get_course_info($course['code']); |
|
|
|
|
if (isset($course_info['visibility']) && |
|
|
|
|
$course_info['visibility'] == COURSE_VISIBILITY_HIDDEN |
|
|
|
|
) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
$course_info['id_session'] = null; |
|
|
|
|
$course_info['status'] = $course['status']; |
|
|
|
|
|
|
|
|
|
//In order to avoid doubles |
|
|
|
|
if (in_array($course_info['real_id'], $course_list)) { |
|
|
|
|
continue; |
|
|
|
|
} else { |
|
|
|
|
$course_list[] = $course_info['real_id']; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$courseCount++; |
|
|
|
|
|
|
|
|
|
// For each course, get if there is any notification icon to show |
|
|
|
|
// (something that would have changed since the user's last visit). |
|
|
|
|
$show_notification = Display::show_notification($course_info); |
|
|
|
|
|
|
|
|
|
$status_icon = Display::return_icon( |
|
|
|
|
'blackboard.png', |
|
|
|
|
api_htmlentities($course_info['title']), |
|
|
|
|
array(), |
|
|
|
|
ICON_SIZE_LARGE |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
$iconName = basename($course_info['course_image']); |
|
|
|
|
if ($showCustomIcon === 'true' && $iconName != 'course.png') { |
|
|
|
|
$status_icon = Display::img( |
|
|
|
|
$course_info['course_image'], |
|
|
|
|
api_htmlentities($course_info['title']), |
|
|
|
|
array() |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$params = array(); |
|
|
|
|
$params['right_actions'] = ''; |
|
|
|
|
|
|
|
|
|
if (api_is_platform_admin()) { |
|
|
|
|
if ($load_dirs) { |
|
|
|
|
$params['right_actions'] .= '<a id="document_preview_' . $course_info['real_id'] . '_0" class="document_preview" href="javascript:void(0);">' . Display::return_icon('folder.png', |
|
|
|
|
get_lang('Documents'), array('align' => 'absmiddle'), ICON_SIZE_SMALL) . '</a>'; |
|
|
|
|
$params['right_actions'] .= '<a href="' . api_get_path(WEB_CODE_PATH) . 'course_info/infocours.php?cidReq=' . $course['code'] . '">' . Display::return_icon('edit.png', |
|
|
|
|
get_lang('Edit'), array('align' => 'absmiddle'), ICON_SIZE_SMALL) . '</a>'; |
|
|
|
|
$params['right_actions'] .= Display::div('', array( |
|
|
|
|
'id' => 'document_result_' . $course_info['real_id'] . '_0', |
|
|
|
|
'class' => 'document_preview_container' |
|
|
|
|
)); |
|
|
|
|
} else { |
|
|
|
|
$params['right_actions'] .= '<a href="' . api_get_path(WEB_CODE_PATH) . 'course_info/infocours.php?cidReq=' . $course['code'] . '">' . Display::return_icon('edit.png', |
|
|
|
|
get_lang('Edit'), array('align' => 'absmiddle'), ICON_SIZE_SMALL) . '</a>'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ($course_info['status'] == COURSEMANAGER) { |
|
|
|
|
//echo Display::return_icon('teachers.gif', get_lang('Status').': '.get_lang('Teacher'), array('style'=>'width: 11px; height: 11px;')); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
if ($course_info['visibility'] != COURSE_VISIBILITY_CLOSED) { |
|
|
|
|
if ($load_dirs) { |
|
|
|
|
$params['right_actions'] .= '<a id="document_preview_' . $course_info['real_id'] . '_0" class="document_preview" href="javascript:void(0);">' . Display::return_icon('folder.png', |
|
|
|
|
get_lang('Documents'), array('align' => 'absmiddle'), ICON_SIZE_SMALL) . '</a>'; |
|
|
|
|
$params['right_actions'] .= Display::div('', array( |
|
|
|
|
'id' => 'document_result_' . $course_info['real_id'] . '_0', |
|
|
|
|
'class' => 'document_preview_container' |
|
|
|
|
)); |
|
|
|
|
} else { |
|
|
|
|
if ($course_info['status'] == COURSEMANAGER) { |
|
|
|
|
$params['right_actions'] .= '<a href="' . api_get_path(WEB_CODE_PATH) . 'course_info/infocours.php?cidReq=' . $course['code'] . '">' . Display::return_icon('edit.png', |
|
|
|
|
get_lang('Edit'), array('align' => 'absmiddle'), ICON_SIZE_SMALL) . '</a>'; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$course_title_url = ''; |
|
|
|
|
if ($course_info['visibility'] != COURSE_VISIBILITY_CLOSED || $course['status'] == COURSEMANAGER) { |
|
|
|
|
$course_title_url = api_get_path(WEB_COURSE_PATH) . $course_info['path'] . '/index.php?id_session=0'; |
|
|
|
|
$course_title = Display::url($course_info['title'], $course_title_url); |
|
|
|
|
} else { |
|
|
|
|
$course_title = $course_info['title'] . " " . Display::tag('span', get_lang('CourseClosed'), |
|
|
|
|
array('class' => 'item_closed')); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Start displaying the course block itself |
|
|
|
|
if (api_get_setting('display_coursecode_in_courselist') == 'true') { |
|
|
|
|
$course_title .= ' (' . $course_info['visual_code'] . ') '; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (api_get_setting('display_teacher_in_courselist') == 'true') { |
|
|
|
|
$teachers = CourseManager::get_teacher_list_from_course_code_to_string( |
|
|
|
|
$course['code'], |
|
|
|
|
self::USER_SEPARATOR, |
|
|
|
|
true |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$params['link'] = $course_title_url; |
|
|
|
|
$params['icon'] = $status_icon; |
|
|
|
|
$params['title'] = $course_title; |
|
|
|
|
$params['teachers'] = $teachers; |
|
|
|
|
|
|
|
|
|
if ($course_info['visibility'] != COURSE_VISIBILITY_CLOSED) { |
|
|
|
|
$params['notifications'] = $show_notification; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$isSubContent = true; |
|
|
|
|
if (empty($user_category_id)) { |
|
|
|
|
$isSubContent = false; |
|
|
|
|
} |
|
|
|
|
$item = self::course_item_html($params, $isSubContent); |
|
|
|
|
$html .= $item; |
|
|
|
|
$items[] = $item; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return [ |
|
|
|
|
'html' => $html, |
|
|
|
|
'items' => $items, |
|
|
|
|
'course_count' => $courseCount |
|
|
|
|
]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Retrieves the user defined course categories |
|
|
|
|
* @param string $userId |
|
|
|
|