lp_controller.php 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897
  1. <?php
  2. /* For licensing terms, see /license.txt */
  3. /**
  4. * Controller script. Prepares the common background variables to give to the scripts corresponding to
  5. * the requested action
  6. * @package chamilo.learnpath
  7. * @author Yannick Warnier <ywarnier@beeznest.org>
  8. */
  9. /**
  10. * Initialisation
  11. */
  12. $debug = 0;
  13. if ($debug > 0) error_log('New LP -+- Entered lp_controller.php -+- (action: '.$_REQUEST['action'].')', 0);
  14. // Language files that needs to be included.
  15. if (isset($_GET['action'])) {
  16. if ($_GET['action'] == 'export') {
  17. // Only needed on export.
  18. $language_file[] = 'hotspot';
  19. $language_file[] = 'exercice';
  20. }
  21. }
  22. $language_file[] = 'course_home';
  23. $language_file[] = 'scormdocument';
  24. $language_file[] = 'scorm';
  25. $language_file[] = 'learnpath';
  26. $language_file[] = 'resourcelinker';
  27. $language_file[] = 'registration';
  28. // Including the global initialization file.
  29. require_once '../inc/global.inc.php';
  30. if (api_get_setting('show_glossary_in_documents') == 'ismanual' || api_get_setting('show_glossary_in_documents') == 'isautomatic' ) {
  31. $htmlHeadXtra[] = '<script type="text/javascript">
  32. <!--
  33. var jQueryFrameReadyConfigPath = \''.api_get_path(WEB_LIBRARY_PATH).'javascript/jquery.js\';
  34. -->
  35. </script>';
  36. $htmlHeadXtra[] = '<script src="'.api_get_path(WEB_LIBRARY_PATH).'javascript/jquery.frameready.js" type="text/javascript" language="javascript"></script>';
  37. $htmlHeadXtra[] = '<script src="'.api_get_path(WEB_LIBRARY_PATH).'javascript/jquery.highlight.js" type="text/javascript" language="javascript"></script>';
  38. }
  39. $htmlHeadXtra[] = '<script type="text/javascript">
  40. function setFocus(){
  41. $("#idTitle").focus();
  42. }
  43. $(window).load(function () {
  44. setFocus();
  45. });
  46. </script>';
  47. // Flag to allow for anonymous user - needs to be set before global.inc.php.
  48. $use_anonymous = true;
  49. // Include class definitions before session_start() to ensure availability when touching
  50. // session vars containing learning paths.
  51. require_once 'learnpath.class.php';
  52. if ($debug > 0) error_log('New LP - Included learnpath', 0);
  53. require_once 'learnpathItem.class.php';
  54. if ($debug > 0) error_log('New LP - Included learnpathItem', 0);
  55. require_once 'scorm.class.php';
  56. if ($debug > 0) error_log('New LP - Included scorm', 0);
  57. require_once 'scormItem.class.php';
  58. if ($debug > 0) error_log('New LP - Included scormItem', 0);
  59. require_once 'aicc.class.php';
  60. if ($debug > 0) error_log('New LP - Included aicc', 0);
  61. require_once 'aiccItem.class.php';
  62. if ($debug > 0) error_log('New LP - Included aiccItem', 0);
  63. require_once 'back_compat.inc.php';
  64. if ($debug > 0) error_log('New LP - Included back_compat', 0);
  65. $session_id = api_get_session_id();
  66. if (!$is_allowed_in_course) {
  67. api_not_allowed(true);
  68. }
  69. require_once api_get_path(LIBRARY_PATH).'fckeditor/fckeditor.php';
  70. $lpfound = false;
  71. $myrefresh = 0;
  72. $myrefresh_id = 0;
  73. if (!empty($_SESSION['refresh']) && $_SESSION['refresh'] == 1) {
  74. // Check if we should do a refresh of the oLP object (for example after editing the LP).
  75. // If refresh is set, we regenerate the oLP object from the database (kind of flush).
  76. api_session_unregister('refresh');
  77. $myrefresh = 1;
  78. if ($debug > 0) error_log('New LP - Refresh asked', 0);
  79. }
  80. if ($debug > 0) error_log('New LP - Passed refresh check', 0);
  81. if (!empty($_REQUEST['dialog_box'])) {
  82. $dialog_box = stripslashes(urldecode($_REQUEST['dialog_box']));
  83. }
  84. $lp_controller_touched = 1;
  85. $lp_found = false;
  86. if (isset($_SESSION['lpobject'])) {
  87. if ($debug > 0) error_log('New LP - SESSION[lpobject] is defined', 0);
  88. $oLP = unserialize($_SESSION['lpobject']);
  89. if (is_object($oLP)) {
  90. if ($debug > 0) error_log('New LP - oLP is object', 0);
  91. if ($myrefresh == 1 OR (empty($oLP->cc)) OR $oLP->cc != api_get_course_id() OR $oLP->lp_view_session_id != $session_id) {
  92. if ($debug > 0) error_log('New LP - Course has changed, discard lp object', 0);
  93. if ($myrefresh == 1) { $myrefresh_id = $oLP->get_id(); }
  94. $oLP = null;
  95. api_session_unregister('oLP');
  96. api_session_unregister('lpobject');
  97. } else {
  98. $_SESSION['oLP'] = $oLP;
  99. $lp_found = true;
  100. }
  101. }
  102. }
  103. if ($debug>0) error_log('New LP - Passed data remains check', 0);
  104. if (!$lp_found || (!empty($_REQUEST['lp_id']) && $_SESSION['oLP']->get_id() != $_REQUEST['lp_id'])) {
  105. if ($debug > 0) error_log('New LP - oLP is not object, has changed or refresh been asked, getting new', 0);
  106. // Regenerate a new lp object? Not always as some pages don't need the object (like upload?)
  107. if (!empty($_REQUEST['lp_id']) || !empty($myrefresh_id)) {
  108. if ($debug > 0) error_log('New LP - lp_id is defined', 0);
  109. // Select the lp in the database and check which type it is (scorm/dokeos/aicc) to generate the
  110. // right object.
  111. $lp_table = Database::get_course_table(TABLE_LP_MAIN);
  112. if (!empty($_REQUEST['lp_id'])) {
  113. $lp_id = $_REQUEST['lp_id'];
  114. } else {
  115. $lp_id = $myrefresh_id;
  116. }
  117. if (is_numeric($lp_id)) {
  118. $lp_id = Database::escape_string($lp_id);
  119. $sel = "SELECT * FROM $lp_table WHERE id = $lp_id";
  120. if ($debug > 0) error_log('New LP - querying '.$sel, 0);
  121. $res = Database::query($sel);
  122. if (Database::num_rows($res)) {
  123. $row = Database::fetch_array($res);
  124. $type = $row['lp_type'];
  125. if ($debug > 0) error_log('New LP - found row - type '.$type. ' - Calling constructor with '.api_get_course_id().' - '.$lp_id.' - '.api_get_user_id(), 0);
  126. switch ($type) {
  127. case 1:
  128. if ($debug > 0) error_log('New LP - found row - type dokeos - Calling constructor with '.api_get_course_id().' - '.$lp_id.' - '.api_get_user_id(), 0);
  129. $oLP = new learnpath(api_get_course_id(),$lp_id,api_get_user_id());
  130. if ($oLP !== false) { $lp_found = true; } else { eror_log($oLP->error, 0); }
  131. break;
  132. case 2:
  133. if ($debug > 0) error_log('New LP - found row - type scorm - Calling constructor with '.api_get_course_id().' - '.$lp_id.' - '.api_get_user_id(), 0);
  134. $oLP = new scorm(api_get_course_id(),$lp_id,api_get_user_id());
  135. if ($oLP !== false) { $lp_found = true; } else { eror_log($oLP->error, 0); }
  136. break;
  137. case 3:
  138. if ($debug > 0) error_log('New LP - found row - type aicc - Calling constructor with '.api_get_course_id().' - '.$lp_id.' - '.api_get_user_id(), 0);
  139. $oLP = new aicc(api_get_course_id(),$lp_id,api_get_user_id());
  140. if ($oLP !== false) { $lp_found = true; } else { eror_log($oLP->error, 0); }
  141. break;
  142. default:
  143. if ($debug > 0) error_log('New LP - found row - type other - Calling constructor with '.api_get_course_id().' - '.$lp_id.' - '.api_get_user_id(), 0);
  144. $oLP = new learnpath(api_get_course_id(),$lp_id,api_get_user_id());
  145. if ($oLP !== false) { $lp_found = true; } else { eror_log($oLP->error, 0); }
  146. break;
  147. }
  148. }
  149. } else {
  150. if ($debug > 0) error_log('New LP - Request[lp_id] is not numeric', 0);
  151. }
  152. } else {
  153. if ($debug > 0) error_log('New LP - Request[lp_id] and refresh_id were empty', 0);
  154. }
  155. if ($lp_found) {
  156. $_SESSION['oLP'] = $oLP;
  157. }
  158. }
  159. if ($debug > 0) error_log('New LP - Passed oLP creation check', 0);
  160. /**
  161. * Actions switching
  162. */
  163. $_SESSION['oLP']->update_queue = array(); // Reinitialises array used by javascript to update items in the TOC.
  164. $_SESSION['oLP']->message = ''; // Should use ->clear_message() method but doesn't work.
  165. if (isset($_GET['isStudentView']) && $_GET['isStudentView'] == 'true') {
  166. if ($_REQUEST['action'] != 'list' AND $_REQUEST['action'] != 'view') {
  167. if (!empty($_REQUEST['lp_id'])) {
  168. $_REQUEST['action'] = 'view';
  169. } else {
  170. $_REQUEST['action'] = 'list';
  171. }
  172. }
  173. }
  174. $is_allowed_to_edit = api_is_allowed_to_edit(null, true);
  175. $action = (!empty($_REQUEST['action']) ? $_REQUEST['action'] : '');
  176. switch ($action) {
  177. case 'add_item':
  178. if (!$is_allowed_to_edit) {
  179. api_not_allowed(true);
  180. }
  181. if ($debug > 0) error_log('New LP - add item action triggered', 0);
  182. if (!$lp_found) {
  183. //check if the learnpath ID was defined, otherwise send back to list
  184. if ($debug > 0) error_log('New LP - No learnpath given for add item', 0);
  185. require 'lp_list.php';
  186. } else {
  187. $_SESSION['refresh'] = 1;
  188. if (isset($_POST['submit_button']) && !empty($_POST['title'])) {
  189. // If a title was sumbitted:
  190. //Updating the lp.modified_on
  191. $_SESSION['oLP']->set_modified_on();
  192. if (isset($_SESSION['post_time']) && $_SESSION['post_time'] == $_POST['post_time']) {
  193. // Check post_time to ensure ??? (counter-hacking measure?)
  194. require 'lp_add_item.php';
  195. } else {
  196. $_SESSION['post_time'] = $_POST['post_time'];
  197. if ($_POST['type'] == TOOL_DOCUMENT) {
  198. if (isset($_POST['path']) && $_GET['edit'] != 'true') {
  199. $document_id = $_POST['path'];
  200. } else {
  201. $document_id = $_SESSION['oLP']->create_document($_course);
  202. }
  203. $new_item_id = $_SESSION['oLP']->add_item($_POST['parent'], $_POST['previous'], $_POST['type'], $document_id, $_POST['title'], $_POST['description'], $_POST['prerequisites']);
  204. } else {
  205. // For all other item types than documents, load the item using the item type and path rather than its ID.
  206. $new_item_id = $_SESSION['oLP']->add_item($_POST['parent'], $_POST['previous'], $_POST['type'], $_POST['path'], $_POST['title'], $_POST['description'], $_POST['prerequisites'], $_POST['maxTimeAllowed']);
  207. }
  208. // Display.
  209. require 'lp_add_item.php';
  210. }
  211. } else {
  212. require 'lp_add_item.php';
  213. }
  214. }
  215. break;
  216. case 'add_lp':
  217. if (!$is_allowed_to_edit) {
  218. api_not_allowed(true);
  219. }
  220. if ($debug > 0) error_log('New LP - add_lp action triggered', 0);
  221. $_REQUEST['lp_name'] = trim($_REQUEST['lp_name']);
  222. if (!empty($_REQUEST['lp_name'])) {
  223. $_SESSION['refresh'] = 1;
  224. if (isset($_SESSION['post_time']) && $_SESSION['post_time'] == $_REQUEST['post_time']) {
  225. require 'lp_add.php';
  226. } else {
  227. $_SESSION['post_time'] = $_REQUEST['post_time'];
  228. if (!$_REQUEST['enabletimelimit']) {
  229. $_REQUEST['publicated_on'] = null;
  230. $_REQUEST['expired_on'] = null;
  231. } else {
  232. $publicated_on = $_REQUEST['publicated_on'];
  233. $publicated_on = $publicated_on['Y'].'-'.$publicated_on['F'].'-'.$publicated_on['d'].' '.$publicated_on['H'].':'.$publicated_on['i'].':00';
  234. $expired_on = $_REQUEST['expired_on'];
  235. $expired_on = $expired_on['Y'].'-'.$expired_on['F'].'-'.$expired_on['d'].' '.$expired_on['H'].':'.$expired_on['i'].':00';
  236. }
  237. // Kevin Van Den Haute: Changed $_REQUEST['learnpath_description'] by '' because it's not used.
  238. //old->$new_lp_id = learnpath::add_lp(api_get_course_id(), $_REQUEST['learnpath_name'], $_REQUEST['learnpath_description'], 'dokeos', 'manual', '');
  239. $new_lp_id = learnpath::add_lp(api_get_course_id(), Security::remove_XSS($_REQUEST['lp_name']), '', 'chamilo', 'manual', '', $publicated_on, $expired_on);
  240. //learnpath::toggle_visibility($new_lp_id,'v');
  241. // Kevin Van Den Haute: Only go further if learnpath::add_lp has returned an id.
  242. if (is_numeric($new_lp_id)) {
  243. // TODO: Maybe create a first module directly to avoid bugging the user with useless queries
  244. $_SESSION['oLP'] = new learnpath(api_get_course_id(),$new_lp_id,api_get_user_id());
  245. //$_SESSION['oLP']->add_item(0, -1, 'dokeos_chapter', $_REQUEST['path'], 'Default');
  246. require 'lp_build.php';
  247. }
  248. }
  249. }
  250. else
  251. require 'lp_add.php';
  252. break;
  253. case 'admin_view':
  254. if (!$is_allowed_to_edit) {
  255. api_not_allowed(true);
  256. }
  257. if ($debug > 0) error_log('New LP - admin_view action triggered', 0);
  258. if (!$lp_found) { error_log('New LP - No learnpath given for admin_view', 0); require 'lp_list.php'; }
  259. else {
  260. $_SESSION['refresh'] = 1;
  261. require 'lp_admin_view.php';
  262. }
  263. break;
  264. case 'auto_launch':
  265. if (api_get_course_setting('enable_lp_auto_launch') == 1) { //Redirect to a specific LP
  266. if (!$is_allowed_to_edit) {
  267. api_not_allowed(true);
  268. }
  269. if ($debug > 0) error_log('New LP - export action triggered', 0);
  270. if (!$lp_found) { error_log('New LP - No learnpath given for set_autolunch', 0); require 'lp_list.php'; }
  271. else {
  272. $_SESSION['oLP']->set_autolunch($_GET['lp_id'], $_GET['status']);
  273. require 'lp_list.php';
  274. exit;
  275. }
  276. }
  277. break;
  278. case 'build':
  279. if (!$is_allowed_to_edit) {
  280. api_not_allowed(true);
  281. }
  282. if ($debug > 0) error_log('New LP - build action triggered', 0);
  283. if (!$lp_found) { error_log('New LP - No learnpath given for build', 0); require 'lp_list.php'; }
  284. else {
  285. $_SESSION['refresh'] = 1;
  286. require 'lp_build.php';
  287. }
  288. break;
  289. case 'delete_item':
  290. if (!$is_allowed_to_edit) {
  291. api_not_allowed(true);
  292. }
  293. if ($debug > 0) error_log('New LP - delete item action triggered', 0);
  294. if (!$lp_found) { error_log('New LP - No learnpath given for delete item', 0); require 'lp_list.php'; }
  295. else {
  296. $_SESSION['refresh'] = 1;
  297. if (is_numeric($_GET['id'])) {
  298. $_SESSION['oLP']->delete_item($_GET['id']);
  299. $is_success = true;
  300. }
  301. if (isset($_GET['view']) && $_GET['view'] == 'build') {
  302. require 'lp_build.php';
  303. } else {
  304. require 'lp_admin_view.php';
  305. }
  306. }
  307. break;
  308. case 'edit_item':
  309. if (!$is_allowed_to_edit) {
  310. api_not_allowed(true);
  311. }
  312. if ($debug > 0) error_log('New LP - edit item action triggered', 0);
  313. if (!$lp_found) { error_log('New LP - No learnpath given for edit item', 0); require 'lp_list.php'; }
  314. else {
  315. $_SESSION['refresh'] = 1;
  316. if (isset($_POST['submit_button']) && !empty($_POST['title'])) {
  317. //Updating the lp.modified_on
  318. $_SESSION['oLP']->set_modified_on();
  319. //$_SESSION['oLP']->edit_item($_GET['id'], $_POST['parent'], $_POST['previous'], $_POST['title'], $_POST['description'], $_POST['prerequisites']);
  320. // TODO: mp3 edit
  321. $audio = array();
  322. if (isset($_FILES['mp3'])) $audio = $_FILES['mp3'];
  323. $_SESSION['oLP']->edit_item($_GET['id'], $_POST['parent'], $_POST['previous'], $_POST['title'], $_POST['description'], $_POST['prerequisites'], $audio, $_POST['maxTimeAllowed']);
  324. if (isset($_POST['content_lp'])) {
  325. $_SESSION['oLP']->edit_document($_course);
  326. }
  327. $is_success = true;
  328. }
  329. if (isset($_GET['view']) && $_GET['view'] == 'build') {
  330. require 'lp_edit_item.php';
  331. } else {
  332. require 'lp_admin_view.php';
  333. }
  334. }
  335. break;
  336. case 'edit_item_prereq':
  337. if (!$is_allowed_to_edit) {
  338. api_not_allowed(true);
  339. }
  340. if ($debug > 0) error_log('New LP - edit item prereq action triggered', 0);
  341. if (!$lp_found) { error_log('New LP - No learnpath given for edit item prereq', 0); require 'lp_list.php'; }
  342. else {
  343. if (isset($_POST['submit_button'])) {
  344. //Updating the lp.modified_on
  345. $_SESSION['oLP']->set_modified_on();
  346. $_SESSION['refresh'] = 1;
  347. $_SESSION['oLP']->edit_item_prereq($_GET['id'], $_POST['prerequisites'], $_POST['min_' . $_POST['prerequisites']], $_POST['max_' . $_POST['prerequisites']]);
  348. }
  349. require 'lp_edit_item_prereq.php';
  350. }
  351. break;
  352. case 'move_item':
  353. if (!$is_allowed_to_edit) {
  354. api_not_allowed(true);
  355. }
  356. if ($debug > 0) error_log('New LP - move item action triggered', 0);
  357. if (!$lp_found) { error_log('New LP - No learnpath given for move item', 0); require 'lp_list.php'; }
  358. else {
  359. $_SESSION['refresh'] = 1;
  360. if (isset($_POST['submit_button'])) {
  361. //Updating the lp.modified_on
  362. $_SESSION['oLP']->set_modified_on();
  363. $_SESSION['oLP']->edit_item($_GET['id'], $_POST['parent'], $_POST['previous'], $_POST['title'], $_POST['description']);
  364. $is_success = true;
  365. }
  366. if (isset($_GET['view']) && $_GET['view'] == 'build') {
  367. require 'lp_move_item.php';
  368. } else {
  369. // Avoids weird behaviours see CT#967.
  370. $check = Security::check_token('get');
  371. if ($check) {
  372. $_SESSION['oLP']->move_item($_GET['id'], $_GET['direction']);
  373. }
  374. Security::clear_token();
  375. require 'lp_admin_view.php';
  376. }
  377. }
  378. break;
  379. case 'view_item':
  380. if (!$is_allowed_to_edit) {
  381. api_not_allowed(true);
  382. }
  383. if ($debug > 0) error_log('New LP - view_item action triggered', 0);
  384. if (!$lp_found) {
  385. error_log('New LP - No learnpath given for view item', 0); require 'lp_list.php';
  386. } else {
  387. $_SESSION['refresh'] = 1;
  388. require 'lp_view_item.php';
  389. }
  390. break;
  391. case 'upload':
  392. if (!$is_allowed_to_edit) {
  393. api_not_allowed(true);
  394. }
  395. if ($debug > 0) error_log('New LP - upload action triggered', 0);
  396. $cwdir = getcwd();
  397. require 'lp_upload.php';
  398. // Reinit current working directory as many functions in upload change it.
  399. chdir($cwdir);
  400. require 'lp_list.php';
  401. break;
  402. case 'export':
  403. if (!$is_allowed_to_edit) {
  404. api_not_allowed(true);
  405. }
  406. if ($debug > 0) error_log('New LP - export action triggered', 0);
  407. if (!$lp_found) { error_log('New LP - No learnpath given for export', 0); require 'lp_list.php'; }
  408. else {
  409. $_SESSION['oLP']->scorm_export();
  410. exit();
  411. //require 'lp_list.php';
  412. }
  413. break;
  414. case 'export_to_pdf':
  415. if (!learnpath::is_lp_visible_for_student($_SESSION['oLP']->lp_id, api_get_user_id())) {
  416. api_not_allowed();
  417. }
  418. if ($debug > 0) error_log('New LP - export action triggered', 0);
  419. if (!$lp_found) { error_log('New LP - No learnpath given for export_to_pdf', 0); require 'lp_list.php';
  420. } else {
  421. $result = $_SESSION['oLP']->scorm_export_to_pdf($_GET['lp_id']);
  422. if (!$result) {
  423. require 'lp_list.php';
  424. }
  425. exit;
  426. }
  427. break;
  428. case 'delete':
  429. if (!$is_allowed_to_edit) {
  430. api_not_allowed(true);
  431. }
  432. if ($debug > 0) error_log('New LP - delete action triggered', 0);
  433. if (!$lp_found) { error_log('New LP - No learnpath given for delete', 0); require 'lp_list.php'; }
  434. else {
  435. $_SESSION['refresh'] = 1;
  436. // Remove lp from homepage if it is there.
  437. //$_SESSION['oLP']->toggle_visibility((int)$_GET['lp_id'],'i');
  438. $_SESSION['oLP']->delete(null,(int)$_GET['lp_id'],'remove');
  439. api_session_unregister('oLP');
  440. require 'lp_list.php';
  441. }
  442. break;
  443. case 'toggle_visible': // Change lp visibility (inside lp tool).
  444. if (!$is_allowed_to_edit) {
  445. api_not_allowed(true);
  446. }
  447. if ($debug > 0) error_log('New LP - visibility action triggered', 0);
  448. if (!$lp_found) { error_log('New LP - No learnpath given for visibility', 0); require 'lp_list.php'; }
  449. else {
  450. learnpath::toggle_visibility($_REQUEST['lp_id'], $_REQUEST['new_status']);
  451. require 'lp_list.php';
  452. }
  453. break;
  454. case 'toggle_publish': // Change lp published status (visibility on homepage).
  455. if (!$is_allowed_to_edit) {
  456. api_not_allowed(true);
  457. }
  458. if ($debug > 0) error_log('New LP - publish action triggered', 0);
  459. if (!$lp_found) { error_log('New LP - No learnpath given for publish', 0); require 'lp_list.php'; }
  460. else {
  461. learnpath::toggle_publish($_REQUEST['lp_id'],$_REQUEST['new_status']);
  462. require 'lp_list.php';
  463. }
  464. break;
  465. case 'move_lp_up': // Change lp published status (visibility on homepage)
  466. if (!$is_allowed_to_edit) {
  467. api_not_allowed(true);
  468. }
  469. if ($debug > 0) error_log('New LP - publish action triggered', 0);
  470. if (!$lp_found) {
  471. error_log('New LP - No learnpath given for publish', 0);
  472. require 'lp_list.php';
  473. } else {
  474. learnpath::move_up($_REQUEST['lp_id']);
  475. require 'lp_list.php';
  476. }
  477. break;
  478. case 'move_lp_down': //change lp published status (visibility on homepage)
  479. if (!$is_allowed_to_edit) {
  480. api_not_allowed(true);
  481. }
  482. if ($debug > 0) error_log('New LP - publish action triggered', 0);
  483. if (!$lp_found) {
  484. error_log('New LP - No learnpath given for publish', 0);
  485. require 'lp_list.php';
  486. } else {
  487. learnpath::move_down($_REQUEST['lp_id']);
  488. require 'lp_list.php';
  489. }
  490. break;
  491. case 'edit':
  492. if (!$is_allowed_to_edit) {
  493. api_not_allowed(true);
  494. }
  495. if ($debug > 0) error_log('New LP - edit action triggered', 0);
  496. if (!$lp_found) { error_log('New LP - No learnpath given for edit', 0); require 'lp_list.php'; }
  497. else {
  498. $_SESSION['refresh'] = 1;
  499. require 'lp_edit.php';
  500. }
  501. break;
  502. case 'update_lp':
  503. if (!$is_allowed_to_edit) {
  504. api_not_allowed(true);
  505. }
  506. if ($debug > 0) error_log('New LP - update_lp action triggered', 0);
  507. if (!$lp_found) { error_log('New LP - No learnpath given for edit', 0); require 'lp_list.php'; }
  508. else {
  509. $_SESSION['refresh'] = 1;
  510. $lp_name = Security::remove_XSS($_REQUEST['lp_name']);
  511. $_SESSION['oLP']->set_name($lp_name);
  512. $author = $_REQUEST['lp_author'];
  513. // Fixing the author name (no body or html tags).
  514. $auth_init = stripos($author, '<p>');
  515. if ($auth_init === false) {
  516. $auth_init = stripos($author, '<body>');
  517. $auth_end = $auth_init + stripos(substr($author, $auth_init + 6), '</body>') + 7;
  518. $len = $auth_end - $auth_init + 6;
  519. } else {
  520. $auth_end = strripos($author, '</p>');
  521. $len = $auth_end - $auth_init + 4;
  522. }
  523. $author_fixed = substr($author, $auth_init, $len);
  524. //$author_fixed = $author;
  525. $_SESSION['oLP']->set_author($author_fixed);
  526. $_SESSION['oLP']->set_encoding($_REQUEST['lp_encoding']); // TODO (as of Chamilo 1.8.8): Check in the future whether this field is needed.
  527. $_SESSION['oLP']->set_maker($_REQUEST['lp_maker']);
  528. $_SESSION['oLP']->set_proximity($_REQUEST['lp_proximity']);
  529. $_SESSION['oLP']->set_theme($_REQUEST['lp_theme']);
  530. $_SESSION['oLP']->set_prerequisite($_REQUEST['prerequisites']);
  531. $_SESSION['oLP']->set_use_max_score($_REQUEST['use_max_score']);
  532. if (!$_REQUEST['enabletimelimit']) {
  533. //there will be always a publication date
  534. $publicated_on = $_REQUEST['publicated_on'];
  535. $publicated_on = $publicated_on['Y'].'-'.$publicated_on['F'].'-'.$publicated_on['d'].' '.$publicated_on['H'].':'.$publicated_on['i'].':00';
  536. $expired_on = null;
  537. } else {
  538. $publicated_on = $_REQUEST['publicated_on'];
  539. $publicated_on = $publicated_on['Y'].'-'.$publicated_on['F'].'-'.$publicated_on['d'].' '.$publicated_on['H'].':'.$publicated_on['i'].':00';
  540. $expired_on = $_REQUEST['expired_on'];
  541. $expired_on = $expired_on['Y'].'-'.$expired_on['F'].'-'.$expired_on['d'].' '.$expired_on['H'].':'.$expired_on['i'].':00';
  542. }
  543. $_SESSION['oLP']->set_modified_on();
  544. $_SESSION['oLP']->set_publicated_on($publicated_on);
  545. $_SESSION['oLP']->set_expired_on($expired_on);
  546. if ($_REQUEST['remove_picture']) {
  547. $_SESSION['oLP']->delete_lp_image();
  548. }
  549. if ($_FILES['lp_preview_image']['size'] > 0)
  550. $_SESSION['oLP']->upload_image($_FILES['lp_preview_image']);
  551. if (api_get_setting('search_enabled') === 'true') {
  552. require_once api_get_path(LIBRARY_PATH).'specific_fields_manager.lib.php';
  553. $specific_fields = get_specific_field_list();
  554. foreach ($specific_fields as $specific_field) {
  555. $_SESSION['oLP']->set_terms_by_prefix($_REQUEST[$specific_field['code']], $specific_field['code']);
  556. $new_values = explode(',', trim($_REQUEST[$specific_field['code']]));
  557. if (!empty($new_values)) {
  558. array_walk($new_values, 'trim');
  559. delete_all_specific_field_value(api_get_course_id(), $specific_field['id'], TOOL_LEARNPATH, $_SESSION['oLP']->lp_id);
  560. foreach ($new_values as $value) {
  561. if (!empty($value)) {
  562. add_specific_field_value($specific_field['id'], api_get_course_id(), TOOL_LEARNPATH, $_SESSION['oLP']->lp_id, $value);
  563. }
  564. }
  565. }
  566. }
  567. }
  568. require 'lp_build.php';
  569. }
  570. break;
  571. case 'add_sub_item': // Add an item inside a chapter.
  572. if (!$is_allowed_to_edit) {
  573. api_not_allowed(true);
  574. }
  575. if ($debug > 0) error_log('New LP - add sub item action triggered', 0);
  576. if (!$lp_found) { error_log('New LP - No learnpath given for add sub item', 0); require 'lp_list.php'; }
  577. else {
  578. $_SESSION['refresh'] = 1;
  579. if (!empty($_REQUEST['parent_item_id'])) {
  580. $_SESSION['from_learnpath']='yes';
  581. $_SESSION['origintoolurl'] = 'lp_controller.php?action=admin_view&lp_id='.Security::remove_XSS($_REQUEST['lp_id']);
  582. require 'resourcelinker.php';
  583. //$_SESSION['oLP']->add_sub_item($_REQUEST['parent_item_id'], $_REQUEST['previous'], $_REQUEST['type'], $_REQUEST['path'], $_REQUEST['title']);
  584. } else {
  585. require 'lp_admin_view.php';
  586. }
  587. }
  588. break;
  589. case 'deleteitem':
  590. case 'delete_item':
  591. if (!$is_allowed_to_edit) {
  592. api_not_allowed(true);
  593. }
  594. if ($debug > 0) error_log('New LP - delete item action triggered', 0);
  595. if (!$lp_found) { error_log('New LP - No learnpath given for delete item', 0); require 'lp_list.php'; }
  596. else {
  597. $_SESSION['refresh'] = 1;
  598. if (!empty($_REQUEST['id'])) {
  599. $_SESSION['oLP']->delete_item($_REQUEST['id']);
  600. }
  601. require 'lp_admin_view.php';
  602. }
  603. break;
  604. case 'edititemprereq':
  605. case 'edit_item_prereq':
  606. if (!$is_allowed_to_edit) {
  607. api_not_allowed(true);
  608. }
  609. if ($debug > 0) error_log('New LP - edit item prereq action triggered', 0);
  610. if (!$lp_found) { error_log('New LP - No learnpath given for edit item prereq', 0); require 'lp_list.php'; }
  611. else {
  612. if (!empty($_REQUEST['id']) && !empty($_REQUEST['submit_item'])) {
  613. $_SESSION['refresh'] = 1;
  614. $_SESSION['oLP']->edit_item_prereq($_REQUEST['id'], $_REQUEST['prereq']);
  615. }
  616. require 'lp_admin_view.php';
  617. }
  618. break;
  619. case 'restart':
  620. if ($debug > 0) error_log('New LP - restart action triggered', 0);
  621. if (!$lp_found) { error_log('New LP - No learnpath given for restart', 0); require 'lp_list.php'; }
  622. else {
  623. $_SESSION['oLP']->restart();
  624. require 'lp_view.php';
  625. }
  626. break;
  627. case 'last':
  628. if ($debug > 0) error_log('New LP - last action triggered', 0);
  629. if (!$lp_found) { error_log('New LP - No learnpath given for last', 0); require 'lp_list.php'; }
  630. else {
  631. $_SESSION['oLP']->last();
  632. require 'lp_view.php';
  633. }
  634. break;
  635. case 'first':
  636. if ($debug > 0) error_log('New LP - first action triggered', 0);
  637. if (!$lp_found) { error_log('New LP - No learnpath given for first', 0); require 'lp_list.php'; }
  638. else {
  639. $_SESSION['oLP']->first();
  640. require 'lp_view.php';
  641. }
  642. break;
  643. case 'next':
  644. if ($debug > 0) error_log('New LP - next action triggered', 0);
  645. if (!$lp_found) { error_log('New LP - No learnpath given for next', 0); require 'lp_list.php'; }
  646. else {
  647. $_SESSION['oLP']->next();
  648. require 'lp_view.php';
  649. }
  650. break;
  651. case 'previous':
  652. if ($debug > 0) error_log('New LP - previous action triggered', 0);
  653. if (!$lp_found) { error_log('New LP - No learnpath given for previous', 0); require 'lp_list.php'; }
  654. else {
  655. $_SESSION['oLP']->previous();
  656. require 'lp_view.php';
  657. }
  658. break;
  659. case 'content':
  660. if ($debug > 0) error_log('New LP - content action triggered', 0);
  661. if ($debug > 0) error_log('New LP - Item id is '.$_GET['item_id'], 0);
  662. if (!$lp_found) { error_log('New LP - No learnpath given for content', 0); require 'lp_list.php'; }
  663. else {
  664. $_SESSION['oLP']->save_last();
  665. $_SESSION['oLP']->set_current_item($_GET['item_id']);
  666. $_SESSION['oLP']->start_current_item();
  667. require 'lp_content.php';
  668. }
  669. break;
  670. case 'view':
  671. if ($debug > 0)
  672. error_log('New LP - view action triggered', 0);
  673. if (!$lp_found) {
  674. error_log('New LP - No learnpath given for view', 0);
  675. require 'lp_list.php';
  676. } else {
  677. if ($debug > 0) {error_log('New LP - Trying to set current item to ' . $_REQUEST['item_id'], 0); }
  678. if ( !empty($_REQUEST['item_id']) ) {
  679. $_SESSION['oLP']->set_current_item($_REQUEST['item_id']);
  680. }
  681. require 'lp_view.php';
  682. }
  683. break;
  684. case 'save':
  685. if ($debug > 0) error_log('New LP - save action triggered', 0);
  686. if (!$lp_found) { error_log('New LP - No learnpath given for save', 0); require 'lp_list.php'; }
  687. else {
  688. $_SESSION['oLP']->save_item();
  689. require 'lp_save.php';
  690. }
  691. break;
  692. case 'stats':
  693. if ($debug > 0) error_log('New LP - stats action triggered', 0);
  694. if (!$lp_found) { error_log('New LP - No learnpath given for stats', 0); require 'lp_list.php'; }
  695. else {
  696. $_SESSION['oLP']->save_current();
  697. $_SESSION['oLP']->save_last();
  698. // Declare variables to be used in lp_stats.php.
  699. $lp_id = $_SESSION['oLP']->get_id();
  700. $list = $_SESSION['oLP']->get_flat_ordered_items_list($lp_id);
  701. $user_id = api_get_user_id();
  702. require 'lp_stats.php';
  703. }
  704. break;
  705. case 'list':
  706. if ($debug > 0) error_log('New LP - list action triggered', 0);
  707. if ($lp_found) {
  708. $_SESSION['refresh'] = 1;
  709. $_SESSION['oLP']->save_last();
  710. }
  711. require 'lp_list.php';
  712. break;
  713. case 'mode':
  714. // Switch between fullscreen and embedded mode.
  715. if ($debug > 0) error_log('New LP - mode change triggered', 0);
  716. $mode = $_REQUEST['mode'];
  717. if ($mode == 'fullscreen') {
  718. $_SESSION['oLP']->mode = 'fullscreen';
  719. } elseif ($mode == 'embedded') {
  720. $_SESSION['oLP']->mode = 'embedded';
  721. } elseif ($mode == 'embedframe') {
  722. $_SESSION['oLP']->mode = 'embedframe';
  723. }
  724. require 'lp_view.php';
  725. break;
  726. case 'switch_view_mode':
  727. if ($debug > 0) error_log('New LP - switch_view_mode action triggered', 0);
  728. if (!$lp_found) { error_log('New LP - No learnpath given for switch', 0); require 'lp_list.php'; }
  729. $_SESSION['refresh'] = 1;
  730. $_SESSION['oLP']->update_default_view_mode();
  731. require 'lp_list.php';
  732. break;
  733. case 'switch_force_commit':
  734. if ($debug > 0) error_log('New LP - switch_force_commit action triggered', 0);
  735. if (!$lp_found) { error_log('New LP - No learnpath given for switch', 0); require 'lp_list.php'; }
  736. $_SESSION['refresh'] = 1;
  737. $_SESSION['oLP']->update_default_scorm_commit();
  738. require 'lp_list.php';
  739. break;
  740. case 'switch_reinit':
  741. if ($debug > 0) error_log('New LP - switch_reinit action triggered', 0);
  742. if (!$lp_found) { error_log('New LP - No learnpath given for switch', 0); require 'lp_list.php'; }
  743. $_SESSION['refresh'] = 1;
  744. $_SESSION['oLP']->update_reinit();
  745. require 'lp_list.php';
  746. break;
  747. case 'switch_scorm_debug':
  748. if ($debug > 0) error_log('New LP - switch_scorm_debug action triggered', 0);
  749. if (!$lp_found) { error_log('New LP - No learnpath given for switch', 0); require 'lp_list.php'; }
  750. $_SESSION['refresh'] = 1;
  751. $_SESSION['oLP']->update_scorm_debug();
  752. require 'lp_list.php';
  753. break;
  754. case 'intro_cmdAdd':
  755. if ($debug > 0) error_log('New LP - intro_cmdAdd action triggered', 0);
  756. // Add introduction section page.
  757. break;
  758. case 'js_api_refresh':
  759. if ($debug > 0) error_log('New LP - js_api_refresh action triggered', 0);
  760. if (!$lp_found) { error_log('New LP - No learnpath given for js_api_refresh', 0); require 'lp_message.php'; }
  761. if (isset($_REQUEST['item_id'])) {
  762. $htmlHeadXtra[] = $_SESSION['oLP']->get_js_info($_REQUEST['item_id']);
  763. }
  764. require 'lp_message.php';
  765. break;
  766. case 'return_to_course_homepage':
  767. if (!$lp_found) { error_log('New LP - No learnpath given for stats', 0); require 'lp_list.php'; }
  768. else {
  769. $_SESSION['oLP']->save_current();
  770. $_SESSION['oLP']->save_last();
  771. // Declare variables to be used in lp_stats.php.
  772. $lp_id = $_SESSION['oLP']->get_id();
  773. $list = $_SESSION['oLP']->get_flat_ordered_items_list($lp_id);
  774. $user_id = api_get_user_id();
  775. header('location: '.api_get_path(WEB_COURSE_PATH).api_get_course_path().'/?id_session='.api_get_session_id());
  776. }
  777. break;
  778. case 'search':
  779. /* Include the search script, it's smart enough to know when we are
  780. * searching or not.
  781. */
  782. require 'lp_list_search.php';
  783. break;
  784. default:
  785. if ($debug > 0) error_log('New LP - default action triggered', 0);
  786. //$_SESSION['refresh'] = 1;
  787. require 'lp_list.php';
  788. break;
  789. }
  790. if (!empty($_SESSION['oLP'])) {
  791. $_SESSION['lpobject'] = serialize($_SESSION['oLP']);
  792. if ($debug > 0) error_log('New LP - lpobject is serialized in session', 0);
  793. }