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/lib/page.lib.php

1431 lines
61 KiB

<?php
/* For licensing terms, see /license.txt */
/**
* Controller for pages presentation in general
* @package chamilo.page.controller
* @author Julio Montoya <gugli100@gmail.com>
*/
/**
* Page controller
*/
use Silex\Application;
use Pagerfanta\Adapter\FixedAdapter;
use Pagerfanta\Pagerfanta;
use Pagerfanta\View\TwitterBootstrapView;
class PageController
{
public $maxPerPage = 2;
private $app;
public function __construct(Application $app)
{
$this->app = $app;
}
/**
* Returns an HTML block with the user picture (as a link in a <div>)
* @param int User ID (if not provided, will use the user ID from session)
* @return string HTML div with a link to the user's profile
* @uses UserManager::get_user_pictur_path_by_id() to get the image path
* @uses UserManager::get_picture_user() to get the details of the image in a specific format
* @uses PageController::show_right_block() to include the image in a larger user block
* @assert (-1) === false
*/
public function return_user_image_block($user_id = null)
{
if (empty($user_id)) {
$user_id = api_get_user_id();
}
//Always show the user image
$img_array = UserManager::get_user_picture_path_by_id($user_id, 'web', true, true);
$no_image = false;
if ($img_array['file'] == 'unknown.jpg') {
$no_image = true;
}
$img_array = UserManager::get_picture_user($user_id, $img_array['file'], 100, USER_IMAGE_SIZE_ORIGINAL);
$profile_content = null;
if (api_get_setting('allow_social_tool') == 'true') {
if (!$no_image) {
$profile_content .= '<a style="text-align:center" href="'.api_get_path(WEB_CODE_PATH).'social/home.php">
<img src="'.$img_array['file'].'"></a>';
} else {
$profile_content .= '<a style="text-align:center" href="'.api_get_path(WEB_CODE_PATH).'auth/profile.php">
<img title="'.get_lang('EditProfile').'" src="'.$img_array['file'].'"></a>';
}
}
$this->show_right_block(null, null, 'user_image_block', array('content' => $profile_content));
}
/**
* Return a block with course-related links. The resulting HTML block's
* contents are only based on the user defined by the active session.
*
* @return string HTML <div> with links
* @assert () != ''
*/
public function return_course_block($filter = null)
{
$show_create_link = false;
$show_course_link = false;
if ((api_get_setting('allow_users_to_create_courses') == 'false' && !api_is_platform_admin()) || api_is_student(
)
) {
$display_add_course_link = false;
} else {
$display_add_course_link = true;
}
if ($display_add_course_link) {
$show_create_link = true;
}
if (api_is_platform_admin() || api_is_course_admin() || api_is_allowed_to_create_course()) {
$show_course_link = true;
} else {
if (api_get_setting('allow_students_to_browse_courses') == 'true') {
$show_course_link = true;
}
}
// My account section
$my_account_content = array();
if ($show_create_link) {
$my_account_content[] = array(
'href' => api_get_path(WEB_CODE_PATH).'create_course/add_course.php',
'title' => api_get_setting('course_validation') == 'true' ? get_lang('CreateCourseRequest') : get_lang(
'CourseCreate'
)
);
}
//Sort courses
$url = api_get_path(WEB_CODE_PATH).'auth/courses.php?action=sortmycourses';
$my_account_content[] = array(
'href' => $url,
'title' => get_lang('SortMyCourses')
);
//Course management
if ($show_course_link) {
if (!api_is_drh()) {
$my_account_content[] = array(
'href' => api_get_path(WEB_CODE_PATH).'auth/courses.php',
'title' => get_lang('CourseCatalog')
);
if (isset($filter) && $filter == 'history') {
$my_account_content[] = array(
'href' => api_get_path(WEB_PUBLIC_PATH).'userportal',
'title' => get_lang('DisplayTrainingList')
);
} else {
$my_account_content[] = array(
'href' => api_get_path(WEB_PUBLIC_PATH).'userportal/history',
'title' => get_lang('HistoryTrainingSessions')
);
}
} else {
$my_account_content .= array(
'href' => api_get_path(WEB_CODE_PATH).'dashboard/index.php',
'title' => get_lang('Dashboard')
);
}
}
$this->show_right_block(get_lang('Courses'), $my_account_content, 'course_block');
}
/**
* Returns the profile block, showing links to the messaging and social
* network tools. The user ID is taken from the active session
* @return string HTML <div> block
* @assert () != ''
*/
public function return_profile_block()
{
if (api_get_setting('allow_message_tool') == 'true') {
if (api_get_setting('allow_social_tool') == 'true') {
$this->show_right_block(get_lang('Profile'), array(), 'profile_social_block');
} else {
$this->show_right_block(get_lang('Profile'), array(), 'profile_block');
}
}
}
/**
* Get the section course section
*/
public function getSectionCourseBlock()
{
$app = $this->app;
$courseURL = $app['url_generator']->generate('userportal', array('type' => 'courses'));
$sessionURL = $app['url_generator']->generate('userportal', array('type' => 'sessions'));
$myCourseCategoriesURL = $app['url_generator']->generate('userportal', array('type' => 'mycoursecategories'));
$specialCoursesURL = $app['url_generator']->generate('userportal', array('type' => 'specialcourses'));
$sessionCategoriesURL = $app['url_generator']->generate('userportal', array('type' => 'sessioncategories'));
$params = array(
array('href' => $courseURL, 'title' => get_lang('Courses')),
array('href' => $specialCoursesURL, 'title' => get_lang('SpecialCourses')),
array('href' => $myCourseCategoriesURL, 'title' => get_lang('MyCourseCategories')),
array('href' => $sessionURL, 'title' => get_lang('Sessions')),
array('href' => $sessionCategoriesURL, 'title' => get_lang('SessionsCategories')),
);
$this->show_right_block(get_lang('CourseSessionBlock'), $params, 'course_session_block');
}
/**
* Returns a list of the most popular courses of the moment (also called
* "hot courses").
* @uses CourseManager::return_hot_courses() in fact, the current method is only a bypass to this method
* @return string HTML <div> with the most popular courses
* @assert () != ''
*/
public function return_hot_courses()
{
return CourseManager::return_hot_courses();
}
/**
* Returns an online help block read from the home/home_menu_[lang].html
* file
* @return string HTML block
* @assert () != ''
*/
public function return_help()
{
$home = api_get_home_path();
$user_selected_language = api_get_interface_language();
$sys_path = api_get_path(SYS_PATH);
$platformLanguage = api_get_setting('platformLanguage');
if (!isset($user_selected_language)) {
$user_selected_language = $platformLanguage;
}
$home_menu = @(string)file_get_contents($sys_path.$home.'home_menu_'.$user_selected_language.'.html');
if (!empty($home_menu)) {
$home_menu_content = api_to_system_encoding($home_menu, api_detect_encoding(strip_tags($home_menu)));
$this->show_right_block(
get_lang('MenuGeneral'),
null,
'help_block',
array('content' => $home_menu_content)
);
}
}
/**
* Returns an HTML block with links to the skills tools
* @return string HTML <div> block
* @assert () != ''
*/
public function return_skills_links()
{
if (api_get_setting('allow_skills_tool') == 'true') {
$content = array();
$content[] = array(
'title' => get_lang('MySkills'),
'href' => api_get_path(WEB_CODE_PATH).'social/skills_wheel.php'
);
if (api_get_setting('allow_hr_skills_management') == 'true' || api_is_platform_admin()) {
$content[] = array(
'title' => get_lang('ManageSkills'),
'href' => api_get_path(WEB_CODE_PATH).'admin/skills_wheel.php'
);
}
$this->show_right_block(get_lang("Skills"), $content, 'skill_block');
}
}
/**
* Returns an HTML block with the notice, as found in the
* home/home_notice_[lang].html file
* @return string HTML <div> block
* @assert () != ''
*/
public function return_notice()
{
$sys_path = api_get_path(SYS_PATH);
$user_selected_language = api_get_interface_language();
$home = api_get_home_path();
// Notice
$home_notice = @(string)file_get_contents($sys_path.$home.'home_notice_'.$user_selected_language.'.html');
if (empty($home_notice)) {
$home_notice = @(string)file_get_contents($sys_path.$home.'home_notice.html');
}
if (!empty($home_notice)) {
$home_notice = api_to_system_encoding($home_notice, api_detect_encoding(strip_tags($home_notice)));
$home_notice = Display::div($home_notice, array('class' => 'homepage_notice'));
$this->show_right_block(get_lang('Notice'), null, 'notice_block', array('content' => $home_notice));
}
}
/**
* Returns the received content packaged in <div> block, with the title as
* <h4>
* @param string Title to include as h4
* @param string Longer content to show (usually a <ul> list)
* @param string ID to be added to the HTML attributes for the block
* @param array Array of attributes to add to the HTML block
* @return string HTML <div> block
* @assert ('a','') != ''
* @todo use the menu builder
*/
public function show_right_block($title, $content, $id, $params = null)
{
$app = $this->app;
if (!empty($id)) {
$params['id'] = $id;
}
$block_menu = array(
'id' => $params['id'],
'title' => $title,
'elements' => $content,
'content' => isset($params['content']) ? $params['content'] : null
);
$app['template']->assign($id, $block_menu);
}
/**
* Adds a form to let users login
* @return string An HTML string with the user login form
* @assert () != ''
* @version 1.1
*/
public function display_login_form()
{
$form = new FormValidator('formLogin', 'POST', null, null, array('class' => 'form-vertical'));
// 'placeholder'=>get_lang('UserName')
//'autocomplete'=>"off",
$form->addElement(
'text',
'login',
get_lang('UserName'),
array('class' => 'span2 autocapitalize_off', 'autofocus' => 'autofocus')
);
$form->addElement('password', 'password', get_lang('Pass'), array('class' => 'span2'));
$form->addElement('style_submit_button', 'submitAuth', get_lang('LoginEnter'), array('class' => 'btn'));
$html = $form->return_form();
if (api_get_setting('openid_authentication') == 'true') {
include_once 'main/auth/openid/login.php';
$html .= '<div>'.openid_form().'</div>';
}
return $html;
}
/**
* Returns a content search form in an HTML <div>, pointing at the
* main/search/ directory. If search_enabled is not set, then it returns
* an empty string
* @return string HTML <div> block showing the search form, or an empty string if search not enabled
* @assert () !== false
*/
public function return_search_block()
{
$html = '';
if (api_get_setting('search_enabled') == 'true') {
$html .= '<div class="searchbox">';
$search_btn = get_lang('Search');
$search_content = '<br />
<form action="main/search/" method="post">
<input type="text" id="query" class="span2" name="query" value="" />
<button class="save" type="submit" name="submit" value="'.$search_btn.'" />'.$search_btn.' </button>
</form></div>';
$html .= $this->show_right_block(get_lang('Search'), $search_content, 'search_block');
}
return $html;
}
/**
* Returns a list of announcements
* @param int User ID
* @param bool True: show the announcements as a slider. False: show them as a vertical list
* @return string HTML list of announcements
* @assert () != ''
* @assert (1) != ''
*/
public function return_announcements($user_id = null, $show_slide = true)
{
// Display System announcements
$announcement = isset($_GET['announcement']) ? intval($_GET['announcement']) : null;
if (!api_is_anonymous() && $user_id) {
$visibility = api_is_allowed_to_create_course(
) ? SystemAnnouncementManager::VISIBLE_TEACHER : SystemAnnouncementManager::VISIBLE_STUDENT;
if ($show_slide) {
$announcements = SystemAnnouncementManager :: display_announcements_slider($visibility, $announcement);
} else {
$announcements = SystemAnnouncementManager :: display_all_announcements($visibility, $announcement);
}
} else {
if ($show_slide) {
$announcements = SystemAnnouncementManager :: display_announcements_slider(
SystemAnnouncementManager::VISIBLE_GUEST,
$announcement
);
} else {
$announcements = SystemAnnouncementManager :: display_all_announcements(
SystemAnnouncementManager::VISIBLE_GUEST,
$announcement
);
}
}
return $announcements;
}
/**
* Return the homepage, including announcements
* @return string The portal's homepage as an HTML string
* @assert () != ''
*/
public function return_home_page()
{
// Including the page for the news
$html = null;
$home = api_get_path(SYS_PATH).api_get_home_path();
$home_top_temp = null;
if (!empty($_GET['include']) && preg_match('/^[a-zA-Z0-9_-]*\.html$/', $_GET['include'])) {
$open = @(string)file_get_contents(api_get_path(SYS_PATH).$home.$_GET['include']);
$html = api_to_system_encoding($open, api_detect_encoding(strip_tags($open)));
} else {
$user_selected_language = api_get_user_language();
if (!file_exists($home.'home_news_'.$user_selected_language.'.html')) {
if (file_exists($home.'home_top.html')) {
$home_top_temp = file($home.'home_top.html');
} else {
//$home_top_temp = file('home/'.'home_top.html');
}
if (!empty($home_top_temp)) {
$home_top_temp = implode('', $home_top_temp);
}
} else {
if (file_exists($home.'home_top_'.$user_selected_language.'.html')) {
$home_top_temp = file_get_contents($home.'home_top_'.$user_selected_language.'.html');
} else {
$home_top_temp = file_get_contents($home.'home_top.html');
}
}
if (empty($home_top_temp) && api_is_platform_admin()) {
$home_top_temp = get_lang('PortalHomepageDefaultIntroduction');
}
$open = str_replace('{rel_path}', api_get_path(REL_PATH), $home_top_temp);
if (!empty($open)) {
$html = api_to_system_encoding($open, api_detect_encoding(strip_tags($open)));
}
}
return $html;
}
/**
* Returns the reservation block (if the reservation tool is enabled)
* @return string HTML block, or empty string if reservation tool is disabled
* @assert () == ''
*/
public function return_reservation_block()
{
$html = '';
$booking_content = null;
if (api_get_setting('allow_reservation') == 'true' && api_is_allowed_to_create_course()) {
$booking_content .= '<ul class="nav nav-list">';
$booking_content .= '<a href="main/reservation/reservation.php">'.get_lang(
'ManageReservations'
).'</a><br />';
$booking_content .= '</ul>';
$html .= $this->show_right_block(get_lang('Booking'), $booking_content, 'reservation_block');
}
return $html;
}
/**
* Returns an HTML block with classes (if show_groups_to_users is true)
* @return string A list of links to users classes tools, or an empty string if show_groups_to_users is disabled
* @assert () == ''
*/
public function return_classes_block()
{
$html = '';
if (api_get_setting('show_groups_to_users') == 'true') {
$usergroup = new Usergroup();
$usergroup_list = $usergroup->get_usergroup_by_user(api_get_user_id());
$classes = '';
if (!empty($usergroup_list)) {
foreach ($usergroup_list as $group_id) {
$data = $usergroup->get($group_id);
$data['name'] = Display::url(
$data['name'],
api_get_path(WEB_CODE_PATH).'user/classes.php?id='.$data['id']
);
$classes .= Display::tag('li', $data['name']);
}
}
if (api_is_platform_admin()) {
$classes .= Display::tag(
'li',
Display::url(get_lang('AddClasses'), api_get_path(WEB_CODE_PATH).'admin/usergroups.php?action=add')
);
}
if (!empty($classes)) {
$classes = Display::tag('ul', $classes, array('class' => 'nav nav-list'));
$html .= $this->show_right_block(get_lang('Classes'), $classes, 'classes_block');
}
}
return $html;
}
/**
* Prepares a block with all the pending exercises in all courses
* @param array Array of courses (arrays) of the user
* @return void Doesn't return anything but prepares and HTML block for use in templates
* @assert () !== 1
*/
public function return_exercise_block($personal_course_list, $tpl)
{
$exercise_list = array();
if (!empty($personal_course_list)) {
foreach ($personal_course_list as $course_item) {
$course_code = $course_item['c'];
$session_id = $course_item['id_session'];
$exercises = ExerciseLib::get_exercises_to_be_taken($course_code, $session_id);
foreach ($exercises as $exercise_item) {
$exercise_item['course_code'] = $course_code;
$exercise_item['session_id'] = $session_id;
$exercise_item['tms'] = api_strtotime($exercise_item['end_time'], 'UTC');
$exercise_list[] = $exercise_item;
}
}
if (!empty($exercise_list)) {
$exercise_list = ArrayClass::msort($exercise_list, 'tms');
$my_exercise = $exercise_list[0];
$url = Display::url(
$my_exercise['title'],
api_get_path(
WEB_CODE_PATH
).'exercice/overview.php?exerciseId='.$my_exercise['id'].'&cidReq='.$my_exercise['course_code'].'&id_session='.$my_exercise['session_id']
);
$tpl->assign('exercise_url', $url);
$tpl->assign(
'exercise_end_date',
api_convert_and_format_date($my_exercise['end_time'], DATE_FORMAT_SHORT)
);
}
}
}
/**
* Returns links to teachers tools (create course, etc) based on the user
* in the active session
* @return string HTML <div> block
* @assert () == ''
*/
public function return_teacher_link()
{
$user_id = api_get_user_id();
if (!empty($user_id)) {
// tabs that are deactivated are added here
$show_menu = false;
$show_create_link = false;
$show_course_link = false;
if (api_is_platform_admin() || api_is_course_admin() || api_is_allowed_to_create_course()) {
$show_menu = true;
$show_course_link = true;
} else {
if (api_get_setting('allow_students_to_browse_courses') == 'true') {
$show_menu = true;
$show_course_link = true;
}
}
if ($show_menu && ($show_create_link || $show_course_link)) {
$show_menu = true;
} else {
$show_menu = false;
}
}
// My Account section
$elements = array();
if ($show_menu) {
if ($show_create_link) {
$elements[] = array(
'href' => api_get_path(WEB_CODE_PATH).'create_course/add_course.php',
'title' => (api_get_setting('course_validation') == 'true' ? get_lang(
'CreateCourseRequest'
) : get_lang('CourseCreate'))
);
}
if ($show_course_link) {
if (!api_is_drh() && !api_is_session_admin()) {
$elements[] = array(
'href' => api_get_path(WEB_CODE_PATH).'auth/courses.php',
'title' => get_lang('CourseCatalog')
);
} else {
$elements[] = array(
'href' => api_get_path(WEB_CODE_PATH).'dashboard/index.php',
'title' => get_lang('Dashboard')
);
}
}
}
$this->show_right_block(get_lang('Courses'), $elements, 'teacher_block');
}
/**
* Display list of courses in a category.
* (for anonymous users)
*
* @version 1.1
* @author Patrick Cool <patrick.cool@UGent.be>, Ghent University - refactoring and code cleaning
* @author Julio Montoya <gugli100@gmail.com>, Beeznest template modifs
* @assert () !== 0
*/
public function return_courses_in_categories()
{
$result = '';
$stok = Security::get_token();
// Initialization.
$user_identified = (api_get_user_id() > 0 && !api_is_anonymous());
$web_course_path = api_get_path(WEB_COURSE_PATH);
$category = Database::escape_string($_GET['category']);
$setting_show_also_closed_courses = api_get_setting('show_closed_courses') == 'true';
// Database table definitions.
$main_course_table = Database :: get_main_table(TABLE_MAIN_COURSE);
$main_category_table = Database :: get_main_table(TABLE_MAIN_CATEGORY);
// Get list of courses in category $category.
$sql_get_course_list = "SELECT * FROM $main_course_table cours
WHERE category_code = '".Database::escape_string($_GET['category'])."'
ORDER BY title, UPPER(visual_code)";
// Showing only the courses of the current access_url_id.
if (api_is_multiple_url_enabled()) {
$url_access_id = api_get_current_access_url_id();
if ($url_access_id != -1) {
$tbl_url_rel_course = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE);
$sql_get_course_list = "SELECT * FROM $main_course_table as course INNER JOIN $tbl_url_rel_course as url_rel_course
ON (url_rel_course.c_id = course.id)
WHERE access_url_id = $url_access_id AND category_code = '".Database::escape_string(
$_GET['category']
)."' ORDER BY title, UPPER(visual_code)";
}
}
// Removed: AND cours.visibility='".COURSE_VISIBILITY_OPEN_WORLD."'
$sql_result_courses = Database::query($sql_get_course_list);
while ($course_result = Database::fetch_array($sql_result_courses)) {
$course_list[] = $course_result;
}
$platform_visible_courses = '';
// $setting_show_also_closed_courses
if ($user_identified) {
if ($setting_show_also_closed_courses) {
$platform_visible_courses = '';
} else {
$platform_visible_courses = " AND (t3.visibility='".COURSE_VISIBILITY_OPEN_WORLD."' OR t3.visibility='".COURSE_VISIBILITY_OPEN_PLATFORM."' )";
}
} else {
if ($setting_show_also_closed_courses) {
$platform_visible_courses = '';
} else {
$platform_visible_courses = " AND (t3.visibility='".COURSE_VISIBILITY_OPEN_WORLD."' )";
}
}
$sqlGetSubCatList = "
SELECT t1.name,t1.code,t1.parent_id,t1.children_count,COUNT(DISTINCT t3.code) AS nbCourse
FROM $main_category_table t1
LEFT JOIN $main_category_table t2 ON t1.code=t2.parent_id
LEFT JOIN $main_course_table t3 ON (t3.category_code=t1.code $platform_visible_courses)
WHERE t1.parent_id ".(empty($category) ? "IS NULL" : "='$category'")."
GROUP BY t1.name,t1.code,t1.parent_id,t1.children_count ORDER BY t1.tree_pos, t1.name";
// Showing only the category of courses of the current access_url_id
if (api_is_multiple_url_enabled()) {
$url_access_id = api_get_current_access_url_id();
if ($url_access_id != -1) {
$tbl_url_rel_course = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE);
$sqlGetSubCatList = "
SELECT t1.name,t1.code,t1.parent_id,t1.children_count,COUNT(DISTINCT t3.code) AS nbCourse
FROM $main_category_table t1
LEFT JOIN $main_category_table t2 ON t1.code=t2.parent_id
LEFT JOIN $main_course_table t3 ON (t3.category_code=t1.code $platform_visible_courses)
INNER JOIN $tbl_url_rel_course as url_rel_course
ON (url_rel_course.c_id = t3.id)
WHERE access_url_id = $url_access_id AND t1.parent_id ".(empty($category) ? "IS NULL" : "='$category'")."
GROUP BY t1.name,t1.code,t1.parent_id,t1.children_count ORDER BY t1.tree_pos, t1.name";
}
}
$resCats = Database::query($sqlGetSubCatList);
$thereIsSubCat = false;
if (Database::num_rows($resCats) > 0) {
$htmlListCat = Display::page_header(get_lang('CatList'));
$htmlListCat .= '<ul>';
while ($catLine = Database::fetch_array($resCats)) {
if ($catLine['code'] != $category) {
$category_has_open_courses = $this->category_has_open_courses($catLine['code']);
if ($category_has_open_courses) {
// The category contains courses accessible to anonymous visitors.
$htmlListCat .= '<li>';
$htmlListCat .= '<a href="'.api_get_self(
).'?category='.$catLine['code'].'">'.$catLine['name'].'</a>';
if (api_get_setting('show_number_of_courses') == 'true') {
$htmlListCat .= ' ('.$catLine['nbCourse'].' '.get_lang('Courses').')';
}
$htmlListCat .= "</li>";
$thereIsSubCat = true;
} elseif ($catLine['children_count'] > 0) {
// The category has children, subcategories.
$htmlListCat .= '<li>';
$htmlListCat .= '<a href="'.api_get_self(
).'?category='.$catLine['code'].'">'.$catLine['name'].'</a>';
$htmlListCat .= "</li>";
$thereIsSubCat = true;
} /* End changed code to eliminate the (0 courses) after empty categories. */ elseif (api_get_setting(
'show_empty_course_categories'
) == 'true'
) {
$htmlListCat .= '<li>';
$htmlListCat .= $catLine['name'];
$htmlListCat .= "</li>";
$thereIsSubCat = true;
} // Else don't set thereIsSubCat to true to avoid printing things if not requested.
} else {
$htmlTitre = '<p>';
if (api_get_setting('show_back_link_on_top_of_tree') == 'true') {
$htmlTitre .= '<a href="'.api_get_self().'">&lt;&lt; '.get_lang('BackToHomePage').'</a>';
}
if (!is_null($catLine['parent_id']) || (api_get_setting(
'show_back_link_on_top_of_tree'
) != 'true' && !is_null($catLine['code']))
) {
$htmlTitre .= '<a href="'.api_get_self(
).'?category='.$catLine['parent_id'].'">&lt;&lt; '.get_lang('Up').'</a>';
}
$htmlTitre .= "</p>";
if ($category != "" && !is_null($catLine['code'])) {
$htmlTitre .= '<h3>'.$catLine['name']."</h3>";
} else {
$htmlTitre .= '<h3>'.get_lang('Categories')."</h3>";
}
}
}
$htmlListCat .= "</ul>";
}
$result .= $htmlTitre;
if ($thereIsSubCat) {
$result .= $htmlListCat;
}
while ($categoryName = Database::fetch_array($resCats)) {
$result .= '<h3>'.$categoryName['name']."</h3>\n";
}
$numrows = Database::num_rows($sql_result_courses);
$courses_list_string = '';
$courses_shown = 0;
if ($numrows > 0) {
$courses_list_string .= Display::page_header(get_lang('CourseList'));
$courses_list_string .= "<ul>";
if (api_get_user_id()) {
$courses_of_user = $this->get_courses_of_user(api_get_user_id());
}
foreach ($course_list as $course) {
// $setting_show_also_closed_courses
if (!$setting_show_also_closed_courses) {
// If we do not show the closed courses
// we only show the courses that are open to the world (to everybody)
// and the courses that are open to the platform (if the current user is a registered user.
if (($user_identified && $course['visibility'] == COURSE_VISIBILITY_OPEN_PLATFORM) || ($course['visibility'] == COURSE_VISIBILITY_OPEN_WORLD)) {
$courses_shown++;
$courses_list_string .= "<li>\n";
$courses_list_string .= '<a href="'.$web_course_path.$course['directory'].'/">'.$course['title'].'</a><br />';
$course_details = array();
if (api_get_setting('display_coursecode_in_courselist') == 'true') {
$course_details[] = $course['visual_code'];
}
if (api_get_setting('display_teacher_in_courselist') == 'true') {
$course_details[] = $course['tutor_name'];
}
if (api_get_setting(
'show_different_course_language'
) == 'true' && $course['course_language'] != api_get_setting('platformLanguage')
) {
$course_details[] = $course['course_language'];
}
$courses_list_string .= implode(' - ', $course_details);
$courses_list_string .= "</li>\n";
}
} else {
// We DO show the closed courses.
// The course is accessible if (link to the course homepage):
// 1. the course is open to the world (doesn't matter if the user is logged in or not): $course['visibility'] == COURSE_VISIBILITY_OPEN_WORLD);
// 2. the user is logged in and the course is open to the world or open to the platform: ($user_identified && $course['visibility'] == COURSE_VISIBILITY_OPEN_PLATFORM);
// 3. the user is logged in and the user is subscribed to the course and the course visibility is not COURSE_VISIBILITY_CLOSED;
// 4. the user is logged in and the user is course admin of te course (regardless of the course visibility setting);
// 5. the user is the platform admin api_is_platform_admin().
//
$courses_shown++;
$courses_list_string .= "<li>\n";
if ($course['visibility'] == COURSE_VISIBILITY_OPEN_WORLD
|| ($user_identified && $course['visibility'] == COURSE_VISIBILITY_OPEN_PLATFORM)
|| ($user_identified && key_exists(
$course['code'],
$courses_of_user
) && $course['visibility'] != COURSE_VISIBILITY_CLOSED)
|| $courses_of_user[$course['code']]['status'] == '1'
|| api_is_platform_admin()
) {
$courses_list_string .= '<a href="'.$web_course_path.$course['directory'].'/">';
}
$courses_list_string .= $course['title'];
if ($course['visibility'] == COURSE_VISIBILITY_OPEN_WORLD
|| ($user_identified && $course['visibility'] == COURSE_VISIBILITY_OPEN_PLATFORM)
|| ($user_identified && key_exists(
$course['code'],
$courses_of_user
) && $course['visibility'] != COURSE_VISIBILITY_CLOSED)
|| $courses_of_user[$course['code']]['status'] == '1'
|| api_is_platform_admin()
) {
$courses_list_string .= '</a><br />';
}
$course_details = array();
if (api_get_setting('display_coursecode_in_courselist') == 'true') {
$course_details[] = $course['visual_code'];
}
// if (api_get_setting('display_coursecode_in_courselist') == 'true' && api_get_setting('display_teacher_in_courselist') == 'true') {
// $courses_list_string .= ' - ';
// }
if (api_get_setting('display_teacher_in_courselist') == 'true') {
$course_details[] = $course['tutor_name'];
}
if (api_get_setting(
'show_different_course_language'
) == 'true' && $course['course_language'] != api_get_setting('platformLanguage')
) {
$course_details[] = $course['course_language'];
}
if (api_get_setting(
'show_different_course_language'
) == 'true' && $course['course_language'] != api_get_setting('platformLanguage')
) {
$course_details[] = $course['course_language'];
}
$courses_list_string .= implode(' - ', $course_details);
// We display a subscription link if:
// 1. it is allowed to register for the course and if the course is not already in the courselist of the user and if the user is identiefied
// 2.
if ($user_identified && !key_exists($course['code'], $courses_of_user)) {
if ($course['subscribe'] == '1') {
$courses_list_string .= '<form action="main/auth/courses.php?action=subscribe&category='.Security::remove_XSS(
$_GET['category']
).'" method="post">';
$courses_list_string .= '<input type="hidden" name="sec_token" value="'.$stok.'">';
$courses_list_string .= '<input type="hidden" name="subscribe" value="'.$course['code'].'" />';
$courses_list_string .= '<input type="image" name="unsub" src="main/img/enroll.gif" alt="'.get_lang(
'Subscribe'
).'" />'.get_lang('Subscribe').'</form>';
} else {
$courses_list_string .= '<br />'.get_lang('SubscribingNotAllowed');
}
}
$courses_list_string .= "</li>";
} //end else
} // end foreach
$courses_list_string .= "</ul>";
}
if ($courses_shown > 0) {
// Only display the list of courses and categories if there was more than
// 0 courses visible to the world (we're in the anonymous list here).
$result .= $courses_list_string;
}
if ($category != '') {
$result .= '<p><a href="'.api_get_self().'"> '.Display :: return_icon(
'back.png',
get_lang('BackToHomePage')
).get_lang('BackToHomePage').'</a></p>';
}
return $result;
}
public function returnMyCourseCategories($user_id, $filter, $page)
{
if (empty($user_id)) {
return false;
}
$loadDirs = api_get_setting('show_documents_preview') == 'true' ? true : false;
$start = ($page - 1) * $this->maxPerPage;
$nbResults = (int)CourseManager::displayPersonalCourseCategories($user_id, $filter, $loadDirs, true);
$html = CourseManager::displayPersonalCourseCategories(
$user_id,
$filter,
$loadDirs,
false,
$start,
$this->maxPerPage
);
$adapter = new FixedAdapter($nbResults, array());
$pagerfanta = new Pagerfanta($adapter);
$pagerfanta->setMaxPerPage($this->maxPerPage); // 10 by default
$pagerfanta->setCurrentPage($page); // 1 by default
$this->app['pagerfanta.view.router.name'] = 'userportal';
$this->app['pagerfanta.view.router.params'] = array(
'filter' => $filter,
'type' => 'courses',
'page' => $page
);
$this->app['template']->assign('pagination', $pagerfanta);
return $html;
}
function returnSpecialCourses($user_id, $filter, $page)
{
if (empty($user_id)) {
return false;
}
$loadDirs = api_get_setting('show_documents_preview') == 'true' ? true : false;
$start = ($page - 1) * $this->maxPerPage;
$nbResults = CourseManager::displaySpecialCourses($user_id, $filter, $loadDirs, true);
$html = CourseManager::displaySpecialCourses($user_id, $filter, $loadDirs, false, $start, $this->maxPerPage);
if (!empty($html)) {
$adapter = new FixedAdapter($nbResults, array());
$pagerfanta = new Pagerfanta($adapter);
$pagerfanta->setMaxPerPage($this->maxPerPage); // 10 by default
$pagerfanta->setCurrentPage($page); // 1 by default
$this->app['pagerfanta.view.router.name'] = 'userportal';
$this->app['pagerfanta.view.router.params'] = array(
'filter' => $filter,
'type' => 'courses',
'page' => $page
);
$this->app['template']->assign('pagination', $pagerfanta);
}
return $html;
}
/**
* The most important function here, prints the session and course list (user_portal.php)
*
* @param int User ID
* @param string filter
* @param int page
* @return string HTML list of sessions and courses
* @assert () === false
*
*/
public function returnCourses($user_id, $filter, $page)
{
if (empty($user_id)) {
return false;
}
$loadDirs = api_get_setting('show_documents_preview') == 'true' ? true : false;
$start = ($page - 1) * $this->maxPerPage;
$nbResults = CourseManager::displayCourses($user_id, $filter, $loadDirs, true);
$html = CourseManager::displayCourses($user_id, $filter, $loadDirs, false, $start, $this->maxPerPage);
if (!empty($html)) {
$adapter = new FixedAdapter($nbResults, array());
$pagerfanta = new Pagerfanta($adapter);
$pagerfanta->setMaxPerPage($this->maxPerPage); // 10 by default
$pagerfanta->setCurrentPage($page); // 1 by default
/*
Original pagination construction
$view = new TwitterBootstrapView();
$routeGenerator = function($page) use ($app, $filter) {
return $app['url_generator']->generate('userportal', array(
'filter' => $filter,
'type' => 'courses',
'page' => $page)
);
};
$pagination = $view->render($pagerfanta, $routeGenerator, array(
'proximity' => 3,
));
*/
//Pagination using the pagerfanta silex service provider
$this->app['pagerfanta.view.router.name'] = 'userportal';
$this->app['pagerfanta.view.router.params'] = array(
'filter' => $filter,
'type' => 'courses',
'page' => $page
);
$this->app['template']->assign('pagination', $pagerfanta);
}
return $html;
}
public function returnSessionsCategories($user_id, $filter, $page)
{
if (empty($user_id)) {
return false;
}
$load_history = (isset($filter) && $filter == 'history') ? true : false;
$start = ($page - 1) * $this->maxPerPage;
$nbResults = UserManager::getCategories($user_id, false, true, true);
$session_categories = UserManager::getCategories($user_id, false, false, true, $start, $this->maxPerPage);
$html = null;
//Showing history title
if ($load_history) {
$html .= Display::page_subheader(get_lang('HistoryTrainingSession'));
if (empty($session_categories)) {
$html .= get_lang('YouDoNotHaveAnySessionInItsHistory');
}
}
$load_directories_preview = api_get_setting('show_documents_preview') == 'true' ? true : false;
$sessions_with_category = $html;
if (isset($session_categories) && !empty($session_categories)) {
foreach ($session_categories as $session_category) {
$session_category_id = $session_category['session_category']['id'];
// All sessions included in
$count_courses_session = 0;
$html_sessions = '';
foreach ($session_category['sessions'] as $session) {
$session_id = $session['session_id'];
// Don't show empty sessions.
if (count($session['courses']) < 1) {
continue;
}
$html_courses_session = '';
$count = 0;
foreach ($session['courses'] as $course) {
if (api_get_setting('hide_courses_in_sessions') == 'false') {
$html_courses_session .= CourseManager::get_logged_user_course_html($course, $session_id);
}
$count_courses_session++;
$count++;
}
$params = array();
if ($count > 0) {
$params['icon'] = Display::return_icon(
'window_list.png',
$session['session_name'],
array('id' => 'session_img_'.$session_id),
ICON_SIZE_LARGE
);
//Default session name
$session_link = $session['session_name'];
$params['link'] = null;
if (api_get_setting('session_page_enabled') == 'true' && !api_is_drh()) {
//session name with link
$session_link = Display::tag(
'a',
$session['session_name'],
array('href' => api_get_path(WEB_CODE_PATH).'session/index.php?session_id='.$session_id)
);
$params['link'] = api_get_path(WEB_CODE_PATH).'session/index.php?session_id='.$session_id;
}
$params['title'] = $session_link;
$moved_status = SessionManager::get_session_change_user_reason($session['moved_status']);
$moved_status = isset($moved_status) && !empty($moved_status) ? ' ('.$moved_status.')' : null;
$params['subtitle'] = isset($session['coach_info']) ? $session['coach_info']['complete_name'] : null.$moved_status;
$params['dates'] = $session['date_message'];
if (api_is_platform_admin()) {
$params['right_actions'] = '<a href="'.api_get_path(
WEB_CODE_PATH
).'admin/resume_session.php?id_session='.$session_id.'">'.Display::return_icon(
'edit.png',
get_lang('Edit'),
array('align' => 'absmiddle'),
ICON_SIZE_SMALL
).'</a>';
}
$html_sessions .= CourseManager::course_item_html($params, true).$html_courses_session;
}
}
if ($count_courses_session > 0) {
$params = array();
$params['icon'] = Display::return_icon(
'folder_blue.png',
$session_category['session_category']['name'],
array(),
ICON_SIZE_LARGE
);
if (api_is_platform_admin()) {
$params['right_actions'] = '<a href="'.api_get_path(
WEB_CODE_PATH
).'admin/session_category_edit.php?&id='.$session_category['session_category']['id'].'">'.Display::return_icon(
'edit.png',
get_lang('Edit'),
array(),
ICON_SIZE_SMALL
).'</a>';
}
$params['title'] = $session_category['session_category']['name'];
if (api_is_platform_admin()) {
$params['link'] = api_get_path(
WEB_CODE_PATH
).'admin/session_category_edit.php?&id='.$session_category['session_category']['id'];
}
$session_category_start_date = $session_category['session_category']['date_start'];
$session_category_end_date = $session_category['session_category']['date_end'];
if (!empty($session_category_start_date) && $session_category_start_date != '0000-00-00' && !empty($session_category_end_date) && $session_category_end_date != '0000-00-00') {
$params['subtitle'] = sprintf(
get_lang('FromDateXToDateY'),
$session_category['session_category']['date_start'],
$session_category['session_category']['date_end']
);
} else {
if (!empty($session_category_start_date) && $session_category_start_date != '0000-00-00') {
$params['subtitle'] = get_lang('From').' '.$session_category_start_date;
}
if (!empty($session_category_end_date) && $session_category_end_date != '0000-00-00') {
$params['subtitle'] = get_lang('Until').' '.$session_category_end_date;
}
}
$sessions_with_category .= CourseManager::course_item_parent(
CourseManager::course_item_html($params, true),
$html_sessions
);
}
}
//Pagination
$adapter = new FixedAdapter($nbResults, array());
$pagerfanta = new Pagerfanta($adapter);
$pagerfanta->setMaxPerPage($this->maxPerPage); // 10 by default
$pagerfanta->setCurrentPage($page); // 1 by default
$this->app['pagerfanta.view.router.name'] = 'userportal';
$this->app['pagerfanta.view.router.params'] = array(
'filter' => $filter,
'type' => 'sessioncategories',
'page' => $page
);
$this->app['template']->assign('pagination', $pagerfanta);
}
return $sessions_with_category;
}
public function returnSessions($user_id, $filter, $page)
{
if (empty($user_id)) {
return false;
}
$app = $this->app;
$loadHistory = (isset($filter) && $filter == 'history') ? true : false;
$app['session_menu'] = function ($app) use ($loadHistory) {
$menu = $app['knp_menu.factory']->createItem(
'root',
array(
'childrenAttributes' => array(
'class' => 'nav nav-tabs',
'currentClass' => 'active'
)
)
);
//$menu->setUri($app['request']->getRequestUri());
/*
$menu->setChildrenAttributes(array(
'currentClass' => 'active'
));*/
$current = $menu->addChild(
get_lang('Current'),
array(
'route' => 'userportal',
'routeParameters' => array(
'filter' => 'current',
'type' => 'sessions'
)
)
);
$history = $menu->addChild(
get_lang('HistoryTrainingSession'),
array(
'route' => 'userportal',
'routeParameters' => array(
'filter' => 'history',
'type' => 'sessions'
)
)
);
//@todo use URIVoter
if ($loadHistory) {
$history->setCurrent(true);
} else {
$current->setCurrent(true);
}
return $menu;
};
//@todo move this in template
$app['knp_menu.menus'] = array('actions_menu' => 'session_menu');
$start = ($page - 1) * $this->maxPerPage;
if ($loadHistory) {
//Load sessions in category in *history*
$nbResults = (int)UserManager::get_sessions_by_category(
$user_id,
true,
true,
true,
null,
null,
'no_category'
);
$session_categories = UserManager::get_sessions_by_category(
$user_id,
true,
false,
true,
$start,
$this->maxPerPage,
'no_category'
);
} else {
//Load sessions in category
$nbResults = (int)UserManager::get_sessions_by_category(
$user_id,
false,
true,
false,
null,
null,
'no_category'
);
$session_categories = UserManager::get_sessions_by_category(
$user_id,
false,
false,
false,
$start,
$this->maxPerPage,
'no_category'
);
}
$html = null;
//Showing history title
if ($loadHistory) {
// $html .= Display::page_subheader(get_lang('HistoryTrainingSession'));
if (empty($session_categories)) {
$html .= get_lang('YouDoNotHaveAnySessionInItsHistory');
}
}
$load_directories_preview = api_get_setting('show_documents_preview') == 'true' ? true : false;
$sessions_with_no_category = $html;
if (isset($session_categories) && !empty($session_categories)) {
foreach ($session_categories as $session_category) {
$session_category_id = $session_category['session_category']['id'];
// Sessions does not belong to a session category
if ($session_category_id == 0) {
// Independent sessions
if (isset($session_category['sessions'])) {
foreach ($session_category['sessions'] as $session) {
$session_id = $session['session_id'];
// Don't show empty sessions.
if (count($session['courses']) < 1) {
continue;
}
$html_courses_session = '';
$count_courses_session = 0;
foreach ($session['courses'] as $course) {
//Read only and accessible
if (api_get_setting('hide_courses_in_sessions') == 'false') {
$html_courses_session .= CourseManager::get_logged_user_course_html(
$course,
$session_id,
$load_directories_preview
);
}
$count_courses_session++;
}
if ($count_courses_session > 0) {
$params = array();
$params['icon'] = Display::return_icon(
'window_list.png',
$session['session_name'],
array('id' => 'session_img_'.$session_id),
ICON_SIZE_LARGE
);
$params['is_session'] = true;
//Default session name
$session_link = $session['session_name'];
$params['link'] = null;
if (api_get_setting('session_page_enabled') == 'true' && !api_is_drh()) {
//session name with link
$session_link = Display::tag(
'a',
$session['session_name'],
array(
'href' => api_get_path(
WEB_CODE_PATH
).'session/index.php?session_id='.$session_id
)
);
$params['link'] = api_get_path(
WEB_CODE_PATH
).'session/index.php?session_id='.$session_id;
}
$params['title'] = $session_link;
$moved_status = SessionManager::get_session_change_user_reason(
$session['moved_status']
);
$moved_status = isset($moved_status) && !empty($moved_status) ? ' ('.$moved_status.')' : null;
$params['subtitle'] = isset($session['coach_info']) ? $session['coach_info']['complete_name'] : null.$moved_status;
$params['dates'] = $session['date_message'];
$params['right_actions'] = '';
if (api_is_platform_admin()) {
$params['right_actions'] .= '<a href="'.api_get_path(
WEB_CODE_PATH
).'admin/resume_session.php?id_session='.$session_id.'">';
$params['right_actions'] .= Display::return_icon(
'edit.png',
get_lang('Edit'),
array('align' => 'absmiddle'),
ICON_SIZE_SMALL
).'</a>';
}
if (api_get_setting('hide_courses_in_sessions') == 'false') {
// $params['extra'] .= $html_courses_session;
}
$sessions_with_no_category .= CourseManager::course_item_parent(
CourseManager::course_item_html($params, true),
$html_courses_session
);
}
}
}
}
}
$adapter = new FixedAdapter($nbResults, array());
$pagerfanta = new Pagerfanta($adapter);
$pagerfanta->setMaxPerPage($this->maxPerPage); // 10 by default
$pagerfanta->setCurrentPage($page); // 1 by default
$this->app['pagerfanta.view.router.name'] = 'userportal';
$this->app['pagerfanta.view.router.params'] = array(
'filter' => $filter,
'type' => 'sessions',
'page' => $page
);
$this->app['template']->assign('pagination', $pagerfanta);
}
return $sessions_with_no_category;
}
/**
* Shows a welcome message when the user doesn't have any content in
* the course list
* @param object A Template object used to declare variables usable in the given template
* @return void
* @assert () === false
*/
public function return_welcome_to_course_block($tpl)
{
if (empty($tpl)) {
return false;
}
$count_courses = CourseManager::count_courses();
$course_catalog_url = api_get_path(WEB_CODE_PATH).'auth/courses.php';
$course_list_url = api_get_path(WEB_PATH).'user_portal.php';
$tpl->assign('course_catalog_url', $course_catalog_url);
$tpl->assign('course_list_url', $course_list_url);
$tpl->assign('course_catalog_link', Display::url(get_lang('here'), $course_catalog_url));
$tpl->assign('course_list_link', Display::url(get_lang('here'), $course_list_url));
$tpl->assign('count_courses', $count_courses);
$tpl->assign('welcome_to_course_block', 1);
}
}