2 /************************************************************************/
4 /************************************************************************/
5 /* Copyright (c) 2010 */
6 /* Inclusive Design Institute */
8 /* This program is free software. You can redistribute it and/or */
9 /* modify it under the terms of the GNU General Public License */
10 /* as published by the Free Software Foundation. */
11 /************************************************************************/
13 if (!defined('TR_INCLUDE_PATH')) { exit; }
15 define('TR_DEVEL', 1);
16 define('TR_ERROR_REPORTING', E_ALL ^ E_NOTICE); // default is E_ALL ^ E_NOTICE, use E_ALL or E_ALL + E_STRICT for developing
18 // Emulate register_globals off. src: http://php.net/manual/en/faq.misc.php#faq.misc.registerglobals
19 function unregister_GLOBALS() {
20 if (!ini_get('register_globals')) { return; }
22 // Might want to change this perhaps to a nicer error
23 if (isset($_REQUEST['GLOBALS'])) { die('GLOBALS overwrite attempt detected'); }
25 // Variables that shouldn't be unset
26 $noUnset = array('GLOBALS','_GET','_POST','_COOKIE','_REQUEST','_SERVER','_ENV', '_FILES');
27 $input = array_merge($_GET,$_POST,$_COOKIE,$_SERVER,$_ENV,$_FILES,isset($_SESSION) && is_array($_SESSION) ? $_SESSION : array());
29 foreach ($input as $k => $v) {
30 if (!in_array($k, $noUnset) && isset($GLOBALS[$k])) { unset($GLOBALS[$k]); }
35 * structure of this document (in order):
37 * 0. load config.inc.php
38 * 1. initilize db connection
40 * 3. initilize session
41 * 4. load $_config from table 'config'
42 * 5. start language block
43 * 6. load common libraries
44 * 7. initialize theme and template management
45 * 8. initialize a user instance without user id.
46 * if $_SESSION['user_id'] is set, it's assigned to instance in include/header.inc.php
47 * 9. register pages based on current user's priviledge
48 * 10. initialize course information if $_SESSION['course_id'] is set
51 /**** 0. start system configuration options block ****/
53 include_once(TR_INCLUDE_PATH.'config.inc.php');
54 error_reporting(TR_ERROR_REPORTING);
56 if (!defined('TR_INSTALL') || !TR_INSTALL) {
57 header('Cache-Control: no-store, no-cache, must-revalidate');
58 header('Pragma: no-cache');
60 $relative_path = substr(TR_INCLUDE_PATH, 0, -strlen('include/'));
61 header('Location: ' . $relative_path . 'install/not_installed.php');
64 /*** end system config block ****/
66 /***** 1. database connection *****/
67 //if (!defined('TR_REDIRECT_LOADED')){
68 // require_once(TR_INCLUDE_PATH.'lib/mysql_connect.inc.php');
70 /***** end database connection ****/
72 /*** 2. constants ***/
73 require_once(TR_INCLUDE_PATH.'constants.inc.php');
75 /*** 3. initilize session ***/
77 @ini_set('session.gc_maxlifetime', '36000'); /* 10 hours */
78 @session_cache_limiter('private, must-revalidate');
80 session_name('TransformableID');
81 error_reporting(TR_ERROR_REPORTING);
84 session_set_cookie_params(0, $_base_path);
86 $str = ob_get_contents();
90 // $_user_id could be set in home/ims/ims_import.php
91 // @see home/ims/ims_import.php
92 if (isset($_user_id) && $_user_id > 0) $_SESSION['user_id'] = $_user_id;
93 /***** end session initilization block ****/
95 /***** 4. load $_config from table 'config' *****/
96 require(TR_INCLUDE_PATH.'phpCache/phpCache.inc.php'); // cache library
97 require(TR_INCLUDE_PATH.'classes/DAO/ThemesDAO.class.php');
98 require(TR_INCLUDE_PATH.'classes/DAO/ConfigDAO.class.php');
100 $configDAO = new ConfigDAO();
101 $rows = $configDAO->getAll();
104 foreach ($rows as $id => $row)
106 $_config[$row['name']] = $row['value'];
110 //set the timezone, php 5.3+ problem. http://atutor.ca/atutor/mantis/view.php?id=4409
111 date_default_timezone_set('UTC');
113 // define as constants. more constants are defined in include/constants.inc.php
114 define('EMAIL', $_config['contact_email']);
115 define('SITE_NAME', $_config['site_name']);
116 $MaxFileSize = $_config['max_file_size'];
117 $MaxCourseSize = $_config['max_course_size'];
118 $MaxFileSize = $_config['max_file_size'];
119 $IllegalExtentions = explode('|',$_config['illegal_extentions']);
120 /***** end loading $_config *****/
122 /***** 5. start language block *****/
123 // set current language
124 require(TR_INCLUDE_PATH . 'classes/Language/LanguageManager.class.php');
125 $languageManager = new LanguageManager();
127 $myLang = $languageManager->getMyLanguage();
129 if ($myLang === FALSE) {
130 echo 'There are no languages installed!';
134 $myLang->saveToSession();
136 /* set right-to-left language */
138 if ($myLang->isRTL()) {
139 $rtl = 'rtl_'; /* basically the prefix to a rtl variant directory/filename. eg. rtl_atee */
141 /***** end language block ****/
143 /***** 6. load common libraries *****/
144 require(TR_INCLUDE_PATH.'lib/output.inc.php'); /* output functions */
145 /***** end load common libraries ****/
147 /***** 7. initialize theme and template management *****/
148 require(TR_INCLUDE_PATH.'classes/Savant2/Savant2.php');
150 // set default template paths:
151 $savant = new Savant2();
153 if (isset($_SESSION['prefs']['PREF_THEME']) && file_exists(TR_INCLUDE_PATH . '../themes/' . $_SESSION['prefs']['PREF_THEME']) && $_SESSION['user_id']>0)
155 if (!is_dir(TR_INCLUDE_PATH . '../themes/' . $_SESSION['prefs']['PREF_THEME']))
157 $_SESSION['prefs']['PREF_THEME'] = 'default';
162 $themesDAO = new ThemesDAO();
163 $row = $themesDAO->getByID($_SESSION['prefs']['PREF_THEME']);
165 if ($row['status'] == 0)
168 $_SESSION['prefs']['PREF_THEME'] = get_default_theme();
173 $_SESSION['prefs']['PREF_THEME'] = get_default_theme();
176 $savant->addPath('template', TR_INCLUDE_PATH . '../themes/' . $_SESSION['prefs']['PREF_THEME'] . '/');
178 require(TR_INCLUDE_PATH . '../themes/' . $_SESSION['prefs']['PREF_THEME'] . '/theme.cfg.php');
180 require(TR_INCLUDE_PATH.'classes/Message/Message.class.php');
181 $msg = new Message($savant);
183 /***** end of initialize theme and template management *****/
185 /***** 8. initialize user instance *****/
186 // used as global var
187 if (isset($_SESSION['user_id']) && $_SESSION['user_id'] > 0)
189 // check if $_SESSION['user_id'] is valid
190 include_once(TR_INCLUDE_PATH.'classes/DAO/UsersDAO.class.php');
191 $usersDAO = new UsersDAO();
192 $user = $usersDAO->getUserByID($_SESSION['user_id']);
194 if (!$user) // invalid user
195 unset($_SESSION['user_id']);
198 include_once(TR_INCLUDE_PATH.'classes/User.class.php');
199 $_current_user = new User($_SESSION['user_id']);
202 /***** end of initialize user instance *****/
204 /* 9. initialize course information if $course_id or $cid is set
205 * This section generates global variables:
206 * $_content_id if set,
207 * $_course_id if set or $cid is set
208 * $_SESSION['s_cid']: record the last content_id on (user_id + course_id) basis
209 * $_sequence_links: resume/first/next/previous content links
211 if (intval($_REQUEST['_cid']) > 0) $_content_id = intval($_REQUEST['_cid']);
212 else if (intval($_POST['_cid']) > 0) $_content_id = intval($_POST['_cid']);
214 if (intval($_REQUEST['_course_id']) > 0) $_course_id = intval($_REQUEST['_course_id']);
215 else if (intval($_POST['_course_id']) > 0) $_course_id = intval($_POST['_course_id']);
217 // find course_id thru content_id
218 if ($_content_id > 0)
220 include_once(TR_INCLUDE_PATH.'classes/DAO/ContentDAO.class.php');
221 $contentDAO = new ContentDAO();
222 $content_row = $contentDAO->get($_content_id);
223 $_course_id = $content_row['course_id'];
226 // Generate $_SESSION['s_cid']: record the last visited content_id
227 // for authors and the users who have the current course in "my courses" list,
228 // save the last visited content_id into user_courses and set the session var.
229 // @see ContentUtility::saveLastCid()
230 // for the users who don't have the current course in "my courses" list,
231 // set the session var as $_GET['cid']
234 if ($_SESSION['user_id'] > 0)
236 include_once(TR_INCLUDE_PATH.'classes/DAO/UserCoursesDAO.class.php');
237 $userCoursesDAO = new UserCoursesDAO();
238 $user_courses_row = $userCoursesDAO->get($_SESSION['user_id'], $_course_id);
240 if ($user_courses_row && $user_courses_row['last_cid'] > 0)
241 $_SESSION['s_cid'] = $user_courses_row['last_cid'];
242 else if ($_content_id > 0)
243 $_SESSION['s_cid'] = $_content_id;
244 else // first time accessing this course, no last cid yet
245 unset($_SESSION['s_cid']);
249 $_SESSION['s_cid'] = $_content_id;
253 // Generate contentManager.
254 // Must be called after generating $_SESSION['s_cid'] as it's used in contentManager class
257 global $contentManager;
259 include_once(TR_INCLUDE_PATH. '../home/classes/ContentManager.class.php');
261 $contentManager = new ContentManager($_course_id);
262 $_sequence_links = $contentManager->generateSequenceCrumbs($_content_id);
265 /*** 10. register pages based on user's priviledge ***/
266 require_once(TR_INCLUDE_PATH.'page_constants.inc.php');
269 * This function is used for printing variables for debugging.
271 * @param mixed $var The variable to output
272 * @param string $title The name of the variable, or some mark-up identifier.
273 * @author Joel Kronenberg
275 function debug($var, $title='') {
276 if (!defined('TR_DEVEL') || !TR_DEVEL) {
280 echo '<pre style="border: 1px black solid; padding: 0px; margin: 10px;" title="debugging box">';
282 echo '<h4>'.$title.'</h4>';
287 $str = ob_get_contents();
290 $str = str_replace('<', '<', $str);
292 $str = str_replace('[', '<span style="color: red; font-weight: bold;">[', $str);
293 $str = str_replace(']', ']</span>', $str);
294 $str = str_replace('=>', '<span style="color: blue; font-weight: bold;">=></span>', $str);
295 $str = str_replace('Array', '<span style="color: purple; font-weight: bold;">Array</span>', $str);
301 * This function is used for printing variables into log file for debugging.
303 * @param mixed $var The variable to output
304 * @param string $log The location of the log file. If not provided, use the default one.
305 * @author Cindy Qi Li
307 function debug_to_log($var, $log='') {
308 if (!defined('TR_DEVEL') || !TR_DEVEL) {
312 if ($log == '') $log = TR_CONTENT_DIR. 'debug.log';
313 $handle = fopen($log, 'a');
314 fwrite($handle, "\n\n");
315 fwrite($handle, date("F j, Y, g:i a"));
316 fwrite($handle, "\n");
317 fwrite($handle, var_export($var,1));
322 /****************************************************/
323 /* compute the $_my_uri variable */
324 $bits = explode(SEP, getenv('QUERY_STRING'));
325 $num_bits = count($bits);
328 for ($i=0; $i<$num_bits; $i++) {
329 // if ( (strpos($bits[$i], 'enable=') === 0)
330 // || (strpos($bits[$i], 'disable=') === 0)
331 // || (strpos($bits[$i], 'expand=') === 0)
332 // || (strpos($bits[$i], 'collapse=') === 0)
333 // || (strpos($bits[$i], 'lang=') === 0)
335 if ( (strpos($bits[$i], 'lang=') === 0)
337 /* we don't want this variable added to $_my_uri */
341 if (($_my_uri == '') && ($bits[$i] != '')) {
343 } else if ($bits[$i] != ''){
346 $_my_uri .= $bits[$i];
348 if ($_my_uri == '') {
353 $_my_uri = $_SERVER['PHP_SELF'].$_my_uri;
355 function my_add_null_slashes( $string ) {
356 // return mysql_real_escape_string(stripslashes($string));
357 return addslashes(stripslashes($string));
360 function my_null_slashes($string) {
364 if ( get_magic_quotes_gpc() == 1 ) {
365 $addslashes = 'my_add_null_slashes';
366 $stripslashes = 'stripslashes';
368 $addslashes = 'mysql_real_escape_string';
369 $stripslashes = 'my_null_slashes';
373 * If MBString extension is loaded, then use it.
374 * Otherwise we will have to use include/utf8 library
376 if (extension_loaded('mbstring')){
377 $strtolower = 'mb_strtolower';
378 $strtoupper = 'mb_strtoupper';
379 $substr = 'mb_substr';
380 $strpos = 'mb_strpos';
381 $strrpos = 'mb_strrpos';
382 $strlen = 'mb_strlen';
384 $strtolower = 'utf8_strtolower';
385 $strtoupper = 'utf8_strtoupper';
386 $substr = 'utf8_substr';
387 $strpos = 'utf8_strpos';
388 $strrpos = 'utf8_strrpos';
389 $strlen = 'utf8_strlen';
392 function get_default_theme() {
393 $themesDAO = new ThemesDAO();
395 $rows = $themesDAO->getDefaultTheme();
397 if (!is_dir(TR_INCLUDE_PATH . '../themes/' . $rows[0]['dir_name']))
400 return $rows[0]['dir_name'];
404 * Convert all '&' to '&' from the input
405 * @param string any string input, mainly URLs.
406 * @return input with & replaced to '&'
407 * @author Harris Wong
410 function convertAmp($input){
411 $input = str_replace('&', '&', $input); //convert everything to '&' first
412 return str_replace('&', '&', $input);