Source for file index.php
Documentation is available at index.php
DOKEOS - elearning and course management software
For a full list of contributors, see documentation/credits.html
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
See "documentation/licence.html" more details.
B-1030 Brussels - Belgium
* @author Patrick Cool <patrick.cool@UGent.be>, Ghent University, Refactoring
* @version $Id: index.php 15173 2008-04-29 17:29:11Z yannoo $
* @todo check the different @todos in this page and really do them
* @todo check if the news management works as expected
// only this script should have this constant defined. This is used to activate the javascript that
// gives the login name automatic focus in header.inc.html.
/** @todo Couldn't this be done using the $HtmlHeadXtra array? */
define('DOKEOS_HOMEPAGE', true);
$language_file = array ('courses', 'index');
/* Flag forcing the 'current course' reset, as we're not inside a course anymore */
// maybe we should change this into an api function? an example: Coursemanager::unset();
-----------------------------------------------------------
-----------------------------------------------------------
/** @todo make all the library files consistent, use filename.lib.php and not filename.lib.inc.php */
require_once ('main/inc/global.inc.php');
include_once (api_get_path(LIBRARY_PATH). 'course.lib.php');
include_once (api_get_path(LIBRARY_PATH). 'debug.lib.inc.php');
include_once (api_get_path(LIBRARY_PATH). 'events.lib.inc.php');
include_once (api_get_path(LIBRARY_PATH). 'system_announcements.lib.php');
include_once (api_get_path(LIBRARY_PATH). 'groupmanager.lib.php');
include_once (api_get_path(LIBRARY_PATH). 'formvalidator/FormValidator.class.php');
$loginFailed = isset ($_GET['loginFailed']) ? true : isset ($loginFailed);
$setting_show_also_closed_courses = (api_get_setting('show_closed_courses')== 'true') ? true : false;
// the section (for the tabs)
-----------------------------------------------------------
-----------------------------------------------------------
/** @todo wouldn't it make more sense if this would be done in local.inc.php so that local.inc.php become the only place where authentication is done?
* by doing this you could logout from any page instead of only from index.php. From the moment there is a logout=true in the url you will be logged out
* this can be usefull when you are on an open course and you need to log in to edit something and you immediately want to check how anonymous users
if (!empty($_GET['logout']))
-----------------------------------------------------------
-----------------------------------------------------------
-----------------------------------------------------------
Constants and CONFIGURATION parameters
-----------------------------------------------------------
/** @todo these configuration settings should move to the dokeos config settings */
/** defines wether or not anonymous visitors can see a list of the courses on the Dokeos homepage that are open to the world */
$_setting['display_courses_to_anonymous_users'] = 'true';
/** @todo remove this piece of code because this is not used */
if (isset ($_user['user_id']))
==============================================================================
==============================================================================
* @todo This piece of code should probably move to local.inc.php where the actual login / logout procedure is handled.
* @todo consider removing this piece of code because does nothing.
if (isset ($_GET['submitAuth']) && $_GET['submitAuth'] == 1)
echo 'Attempted breakin - sysadmins notified.';
* @todo This piece of code should probably move to local.inc.php where the actual login procedure is handled.
* @todo check if this code is used. I think this code is never executed because after clicking the submit button
* the code does the stuff in local.inc.php and then redirects to index.php or user_portal.php depending
* on api_get_setting('page_after_login')
if (!empty($_POST["submitAuth"]))
// the user is already authenticated, we now find the last login of the user.
if (isset ($_user['user_id']))
$sql_last_login = "SELECT UNIX_TIMESTAMP(login_date)
WHERE login_user_id = '". $_user['user_id']. "'
ORDER BY login_date DESC LIMIT 1";
$result_last_login = api_sql_query($sql_last_login, __FILE__ , __LINE__ );
$user_last_login_datetime = $user_last_login_datetime[0];
// decode all open event informations and fill the track_c_* tables
include (api_get_path(LIBRARY_PATH). "stats.lib.inc.php");
} // end login -- if($_POST["submitAuth"])
// only if login form was not sent because if the form is sent the user was already on the page.
==============================================================================
==============================================================================
echo '<div class="maincontent" id="content">';
// Plugins for loginpage_main AND campushomepage_main
// Including the page for the news
if (!empty ($_GET['include']) && !strstr($_GET['include'], '/') && !strstr($_GET['include'], '\\') && strstr($_GET['include'], '.html'))
include ('./home/'. $_GET['include']);
if(!empty($_SESSION['user_language_choice']))
$user_selected_language= $_SESSION['user_language_choice'];
elseif(!empty($_SESSION['_user']['language']))
$user_selected_language= $_SESSION['_user']['language'];
$user_selected_language= get_setting('platformLanguage');
if(!file_exists('home/home_news_'. $user_selected_language. '.html'))
$home_top_temp= file('home/home_top.html');
$home_top_temp= implode('',$home_top_temp);
if(file_exists('home/home_top_'. $user_selected_language. '.html'))
$home_top_temp = file_get_contents('home/home_top_'. $user_selected_language. '.html');
// Display System announcements
$announcement = isset ($_GET['announcement']) ? $_GET['announcement'] : - 1;
$announcement = intval($announcement);
if (isset ($_user['user_id']))
// Display courses and category list
echo '<div class="home_cats">';
// display right menu: language form, login section + useful weblinks
echo '<div class="menu" id="menu">';
==============================================================================
==============================================================================
* This function handles the logout and is called whenever there is a $_GET['logout']
* @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
global $_configuration, $extAuthSource;
// variable initialisation
if(!empty($_SESSION['user_language_choice']))
$query_string= '?language='. $_SESSION['user_language_choice'];
// Database table definition
// selecting the last login of the user
$sql_last_connection= "SELECT login_id, login_date FROM $tbl_track_login WHERE login_user_id='$uid' ORDER BY login_date DESC LIMIT 0,1";
$i_id_last_connection= mysql_result($q_last_connection,0,"login_id");
if(!isset ($_SESSION['login_as']))
$s_sql_update_logout_date= "UPDATE $tbl_track_login SET logout_date=NOW() WHERE login_id='$i_id_last_connection'";
LoginDelete($uid, $_configuration['statistics_database']); //from inc/lib/online.inc.php - removes the "online" status
//the following code enables the use of an external logout function.
//example: define a $extAuthSource['ldap']['logout']="file.php" in configuration.php
// then a function called ldap_logout() inside that file
// (using *authent_name*_logout as the function name) and the following code
// will find and execute it
if(is_array($extAuthSource[$uinfo['auth_source']]))
$subarray = $extAuthSource[$uinfo['auth_source']];
if(!empty($subarray['logout']) && file_exists($subarray['logout']))
include_once($subarray['logout']);
$logout_function = $uinfo['auth_source']. '_logout';
$logout_function($uinfo);
header("Location: index.php$query_string");
* This function checks if there are courses that are open to the world in the platform course categories (=faculties)
* @param unknown_type $category
global $setting_show_also_closed_courses;
$sql_query = "SELECT * FROM $main_course_table WHERE category_code='$category'";
if ($setting_show_also_closed_courses == false)
return true; //at least one open course
if(isset ($course['visibility']))
return true; //at least one course (does not matter weither it's open or not because $setting_show_also_closed_courses = true
echo "<li><a href=\"main/create_course/add_course.php\">". get_lang("CourseCreate"). "</a></li>";
echo "<li><a href=\"main/auth/courses.php\">". get_lang("CourseManagement"). "</a></li>";
* Displays the right-hand menu for anonymous users:
* login form, useful links, help section
* Warning: function defines globals
* @todo does $_plugins need to be global?
global $loginFailed, $_plugins, $_user, $menu_navigation;
if ( !($_user['user_id']) or api_is_anonymous($_user['user_id']) ) // only display if the user isn't logged in
echo '<div class="menusection"><span class="menusectioncaption">'. get_lang('MenuUser'). '</span><ul class="menulist">';
echo '<li><a href="main/auth/inscription.php">'. get_lang('Reg'). '</a></li>';
echo '<div class="note" style="background: none">';
/*** hide right menu "general" and other parts on anonymous right menu *****/
echo "<div class=\"menusection\">", "<span class=\"menusectioncaption\">". get_lang("MenuGeneral"). "</span>";
echo "<ul class=\"menulist\">";
if (!isset ($user_selected_language))
$user_selected_language = $platformLanguage;
if(!file_exists('home/home_menu_'. $user_selected_language. '.html'))
include ('home/home_menu.html');
include('home/home_menu_'. $user_selected_language. '.html');
echo '<div class="note" style="background: none">';
if(isset ($_SESSION['_user']['user_id']) && $_SESSION['_user']['user_id']!= 0)
// tabs that are deactivated are added here
if (!empty($menu_navigation))
echo "<div class=\"menusection\">";
echo "<span class=\"menusectioncaption\">". get_lang("MainNavigation"). "</span>";
echo "<ul class=\"menulist\">";
foreach($menu_navigation as $section => $navigation_info)
$current = ($section == $GLOBALS['this_section'] ? ' id="current"' : '');
echo '<a href="'. $navigation_info['url']. '" target="_top">'. $navigation_info['title']. '</a>';
echo "<div class=\"menusection\">";
echo "<span class=\"menusectioncaption\">". get_lang("MenuUser"). "</span>";
echo "<ul class=\"menulist\">";
if ($display_add_course_link)
// includes for any files to be displayed below anonymous right menu
echo '<div class="note">';
include ('home/home_notice.html');
elseif(file_exists('home/home_notice_'. $user_selected_language. '.html') && file_get_contents('home/home_notice_'. $user_selected_language. '.html')!= '')
echo '<div class="note">';
include('home/home_notice_'. $user_selected_language. '.html');
* Reacts on a failed login:
* displays an explanation with
* a link to the registration form.
if(!isset ($_GET['error']))
$message = get_lang("InvalidForSelfRegistration");
$message = get_lang("InvalidForSelfRegistration");
case 'user_password_incorrect':
echo "<div id=\"login_fail\">". $message. "</div>";
* Adds a form to let users login
$form->addElement('text','login',get_lang('UserName'),array('size'=> 15));
$form->addElement('password','password',get_lang('Pass'),array('size'=> 15));
$form->addElement('submit','submitAuth',get_lang('Ok'));
$renderer = & $form->defaultRenderer();
$renderer->setElementTemplate('<div><label>{label}</label></div><div>{element}</div>');
include_once('main/auth/openid/login.php');
* Displays a link to the lost password section
echo "<li><a href=\"main/auth/lostPassword.php\">". get_lang("LostPassword"). "</a></li>";
* Display list of courses in a category.
* @author Patrick Cool <patrick.cool@UGent.be>, Ghent University - refactoring and code cleaning
$ctok = $_SESSION['sec_token'];
$category = $_GET["category"];
global $setting_show_also_closed_courses;
// Database table definitions
//get list of courses in category $category
$sql_get_course_list = "SELECT * FROM $main_course_table cours
ORDER BY title, UPPER(visual_code)";
//removed: AND cours.visibility='".COURSE_VISIBILITY_OPEN_WORLD."'
$sql_result_courses = api_sql_query($sql_get_course_list, __FILE__ , __LINE__ );
$course_list[] = $course_result;
$platform_visible_courses = '';
// $setting_show_also_closed_courses
if ($setting_show_also_closed_courses)
$platform_visible_courses = '';
if ($setting_show_also_closed_courses)
$platform_visible_courses = '';
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";
$htmlListCat = "<h4 style=\"margin-top: 0px;\">". get_lang("CatList"). "</h4>". "<ul>";
if ($catLine['code'] != $category)
if ($category_has_open_courses)
//the category contains courses accessible to anonymous visitors
$htmlListCat .= "<a href=\"". api_get_self(). "?category=". $catLine['code']. "\">". $catLine['name']. "</a>";
$htmlListCat .= " (". $catLine['nbCourse']. " ". get_lang("Courses"). ")";
$htmlListCat .= "</li>\n";
elseif ($catLine['children_count'] > 0)
//the category has children, subcategories
$htmlListCat .= "<a href=\"". api_get_self(). "?category=". $catLine['code']. "\">". $catLine['name']. "</a>";
$htmlListCat .= "</li>\n";
/************************************************************************
end changed code to eliminate the (0 courses) after empty categories
************************************************************************/
$htmlListCat .= $catLine['name'];
$htmlListCat .= "</li>\n";
}//else don't set thereIsSubCat to true to avoid printing things if not requested
$htmlTitre .= "<a href=\"". api_get_self(). "?category=". $catLine['parent_id']. "\">". "<< ". get_lang("Up"). "</a>";
if ($category != "" && !is_null($catLine['code']))
$htmlTitre .= "<h3>". $catLine['name']. "</h3>\n";
$htmlTitre .= "<h3>". get_lang("Categories"). "</h3>\n";
$htmlListCat .= "</ul>\n";
echo "<h3>", $categoryName['name'], "</h3>\n";
$courses_list_string = '';
$courses_list_string .= "<hr size=\"1\" noshade=\"noshade\">\n";
$courses_list_string .= "<h4 style=\"margin-top: 0px;\">". get_lang("CourseList"). "</h4>\n". "<ul>\n";
foreach ($course_list AS $course)
// $setting_show_also_closed_courses
if ($setting_show_also_closed_courses== false)
// 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
$courses_list_string .= "<li>\n";
$courses_list_string .= "<a href=\"". $web_course_path. $course['directory']. "/\">". $course['title']. "</a><br />";
if (get_setting("display_coursecode_in_courselist") == "true")
$courses_list_string .= $course['visual_code'];
if (get_setting("display_coursecode_in_courselist") == "true" AND get_setting("display_teacher_in_courselist") == "true")
$courses_list_string .= " - ";
if (get_setting("display_teacher_in_courselist") == "true")
$courses_list_string .= $course['tutor_name'];
$courses_list_string .= ' - '. $course['course_language'];
$courses_list_string .= "</li>\n";
// 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_list_string .= "<li>\n";
OR $courses_of_user[$course['code']]['status'] == '1'
$courses_list_string .= "<a href=\"". $web_course_path. $course['directory']. "/\">";
$courses_list_string .= $course['title'];
OR $courses_of_user[$course['code']]['status'] == '1'
$courses_list_string .= "</a><br />";
if (get_setting("display_coursecode_in_courselist") == "true")
$courses_list_string .= $course['visual_code'];
if (get_setting("display_coursecode_in_courselist") == "true" AND get_setting("display_teacher_in_courselist") == "true")
$courses_list_string .= " - ";
if (get_setting("display_teacher_in_courselist") == "true")
$courses_list_string .= $course['tutor_name'];
$courses_list_string .= ' - '. $course['course_language'];
$courses_list_string .= ' - '. $course['course_language'];
// 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
if ($user_identified AND !key_exists($course['code'],$courses_of_user))
if ($course['subscribe'] == '1')
$courses_list_string .= "<form action=\"main/auth/courses.php?action=subscribe&category=". $_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>";
$courses_list_string .= '<br />'. get_lang("SubscribingNotAllowed");
$courses_list_string .= "</li>\n";
$courses_list_string .= "</ul>\n";
// echo "<blockquote>",get_lang('_No_course_publicly_available'),"</blockquote>\n";
{ //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)
echo $courses_list_string;
echo "<p>", "<a href=\"". api_get_self(). "\"><b><<</b> ", get_lang("BackToHomePage"), "</a>", "</p>\n";
* retrieves all the courses that the user has already subscribed to
* @author Patrick Cool <patrick.cool@UGent.be>, Ghent University, Belgium
* @param int $user_id: the id of the user
* @return array an array containing all the information of the courses of the given user
// Secondly we select the courses that are in a category (user_course_cat<>0) and sort these according to the sort of the category
$sql_select_courses= "SELECT course.code k, course.visual_code vc, course.subscribe subscr, course.unsubscribe unsubscr,
course.title i, course.tutor_name t, course.db_name db, course.directory dir, course_rel_user.status status,
course_rel_user.sort sort, course_rel_user.user_course_cat user_course_cat
FROM $table_course course,
$table_course_user course_rel_user
WHERE course.code = course_rel_user.course_code
AND course_rel_user.user_id = '". $user_id. "'
ORDER BY course_rel_user.sort ASC";
// we only need the database name of the course
$courses[$row['k']] = array("db"=> $row['db'], "code" => $row['k'], "visual_code" => $row['vc'], "title" => $row['i'], "directory" => $row['dir'], "status" => $row['status'], "tutor" => $row['t'], "subscribe" => $row['subscr'], "unsubscribe" => $row['unsubscr'], "sort" => $row['sort'], "user_course_category" => $row['user_course_cat']);
|