add_courses_to_session.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556
  1. <?php
  2. /*
  3. ==============================================================================
  4. Dokeos - elearning and course management software
  5. Copyright (c) 2004-2009 Dokeos SPRL
  6. Copyright (c) 2003 Ghent University (UGent)
  7. Copyright (c) 2001 Universite catholique de Louvain (UCL)
  8. Copyright (c) Olivier Brouckaert
  9. For a full list of contributors, see "credits.txt".
  10. The full license can be read in "license.txt".
  11. This program is free software; you can redistribute it and/or
  12. modify it under the terms of the GNU General Public License
  13. as published by the Free Software Foundation; either version 2
  14. of the License, or (at your option) any later version.
  15. See the GNU General Public License for more details.
  16. Contact: Dokeos, rue du Corbeau, 108, B-1030 Brussels, Belgium, info@dokeos.com
  17. ==============================================================================
  18. */
  19. /**
  20. ==============================================================================
  21. * @package dokeos.admin
  22. * @todo use formvalidator
  23. ==============================================================================
  24. */
  25. // name of the language file that needs to be included
  26. $language_file='admin';
  27. // resetting the course id
  28. $cidReset=true;
  29. // including some necessary dokeos files
  30. require('../inc/global.inc.php');
  31. // including additonal libraries
  32. require_once ('../inc/lib/xajax/xajax.inc.php');
  33. require_once (api_get_path(LIBRARY_PATH).'sessionmanager.lib.php');
  34. $xajax = new xajax();
  35. //$xajax->debugOn();
  36. $xajax -> registerFunction ('search_courses');
  37. // setting the section (for the tabs)
  38. $this_section = SECTION_PLATFORM_ADMIN;
  39. // Access restrictions
  40. api_protect_admin_script(true);
  41. // setting breadcrumbs
  42. $interbreadcrumb[] = array('url' => 'index.php', 'name' => get_lang('PlatformAdmin'));
  43. $interbreadcrumb[] = array('url' => 'session_list.php','name' => get_lang('SessionList'));
  44. // Database Table Definitions
  45. $tbl_session_rel_course_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
  46. $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION);
  47. $tbl_session_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_USER);
  48. $tbl_session_rel_course = Database::get_main_table(TABLE_MAIN_SESSION_COURSE);
  49. $tbl_course = Database::get_main_table(TABLE_MAIN_COURSE);
  50. // setting the name of the tool
  51. $tool_name= get_lang('SubscribeCoursesToSession');
  52. $id_session=intval($_GET['id_session']);
  53. $add_type = 'multiple';
  54. if(isset($_GET['add_type']) && $_GET['add_type']!=''){
  55. $add_type = Security::remove_XSS($_REQUEST['add_type']);
  56. }
  57. if (!api_is_platform_admin()) {
  58. $sql = 'SELECT session_admin_id FROM '.Database :: get_main_table(TABLE_MAIN_SESSION).' WHERE id='.$id_session;
  59. $rs = api_sql_query($sql,__FILE__,__LINE__);
  60. if (Database::result($rs,0,0)!=$_user['user_id']) {
  61. api_not_allowed(true);
  62. }
  63. }
  64. function search_courses($needle,$type)
  65. {
  66. global $tbl_course, $tbl_session_rel_course, $id_session;
  67. $xajax_response = new XajaxResponse();
  68. $return = '';
  69. if(!empty($needle) && !empty($type)) {
  70. // xajax send utf8 datas... datas in db can be non-utf8 datas
  71. $charset = api_get_setting('platform_charset');
  72. $needle = api_convert_encoding($needle, $charset, 'utf-8');
  73. $cond_course_code = '';
  74. if (!empty($id_session)) {
  75. $id_session = Database::escape_string($id_session);
  76. // check course_code from session_rel_course table
  77. $sql = 'SELECT course_code FROM '.$tbl_session_rel_course.' WHERE id_session ="'.(int)$id_session.'"';
  78. $res = api_sql_query($sql,__FILE__,__LINE__);
  79. $course_codes = '';
  80. if (Database::num_rows($res) > 0) {
  81. while ($row = Database::fetch_row($res)) {
  82. $course_codes .= '\''.$row[0].'\',';
  83. }
  84. $course_codes = substr($course_codes,0,(strlen($course_codes)-1));
  85. $cond_course_code = ' AND course.code NOT IN('.$course_codes.') ';
  86. }
  87. }
  88. if ($type=='single') {
  89. // search users where username or firstname or lastname begins likes $needle
  90. $sql = 'SELECT course.code, course.visual_code, course.title, session_rel_course.id_session
  91. FROM '.$tbl_course.' course
  92. LEFT JOIN '.$tbl_session_rel_course.' session_rel_course
  93. ON course.code = session_rel_course.course_code
  94. AND session_rel_course.id_session = '.intval($id_session).'
  95. WHERE course.visual_code LIKE "'.$needle.'%"
  96. OR course.title LIKE "'.$needle.'%"';
  97. } else {
  98. $sql = 'SELECT course.code, course.visual_code, course.title
  99. FROM '.$tbl_course.' course
  100. WHERE course.visual_code LIKE "'.$needle.'%" '.$cond_course_code.' ORDER BY course.code ';
  101. }
  102. global $_configuration;
  103. if ($_configuration['multiple_access_urls']==true) {
  104. $tbl_course_rel_access_url= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE);
  105. $access_url_id = api_get_current_access_url_id();
  106. if ($access_url_id != -1){
  107. if ($type=='single') {
  108. $sql = 'SELECT course.code, course.visual_code, course.title, session_rel_course.id_session
  109. FROM '.$tbl_course.' course
  110. LEFT JOIN '.$tbl_session_rel_course.' session_rel_course
  111. ON course.code = session_rel_course.course_code
  112. AND session_rel_course.id_session = '.intval($id_session).'
  113. INNER JOIN '.$tbl_course_rel_access_url.' url_course ON (url_course.course_code=course.code)
  114. WHERE access_url_id = '.$access_url_id.' AND (course.visual_code LIKE "'.$needle.'%"
  115. OR course.title LIKE "'.$needle.'%" )';
  116. } else {
  117. $sql = 'SELECT course.code, course.visual_code, course.title
  118. FROM '.$tbl_course.' course, '.$tbl_course_rel_access_url.' url_course
  119. WHERE url_course.course_code=course.code AND access_url_id = '.$access_url_id.'
  120. AND course.visual_code LIKE "'.$needle.'%" '.$cond_course_code.' ORDER BY course.code ';
  121. }
  122. }
  123. }
  124. $rs = api_sql_query($sql, __FILE__, __LINE__);
  125. $course_list = array();
  126. if ($type=='single') {
  127. while($course = Database :: fetch_array($rs)) {
  128. $course_list[] = $course['code'];
  129. $course_title=str_replace("'","\'",$course_title);
  130. $return .= '<a href="#" onclick="add_course_to_session(\''.$course['code'].'\',\''.$course_title.' ('.$course['visual_code'].')'.'\')">'.$course['title'].' ('.$course['visual_code'].')</a><br />';
  131. }
  132. $xajax_response -> addAssign('ajax_list_courses_single','innerHTML',utf8_encode($return));
  133. } else {
  134. $return .= '<select id="origin" name="NoSessionCoursesList[]" multiple="multiple" size="20" style="width:300px;">';
  135. while($course = Database :: fetch_array($rs)) {
  136. $course_list[] = $course['code'];
  137. $course_title=str_replace("'","\'",$course_title);
  138. $return .= '<option value="'.$course['code'].'">'.$course['title'].' ('.$course['visual_code'].')</option>';
  139. }
  140. $return .= '</select>';
  141. $xajax_response -> addAssign('ajax_list_courses_multiple','innerHTML',api_utf8_encode($return));
  142. }
  143. }
  144. $_SESSION['course_list'] = $course_list;
  145. return $xajax_response;
  146. }
  147. $xajax -> processRequests();
  148. $htmlHeadXtra[] = $xajax->getJavascript('../inc/lib/xajax/');
  149. $htmlHeadXtra[] = '
  150. <script type="text/javascript">
  151. function add_course_to_session (code, content) {
  152. document.getElementById("course_to_add").value = "";
  153. document.getElementById("ajax_list_courses_single").innerHTML = "";
  154. destination = document.getElementById("destination");
  155. for (i=0;i<destination.length;i++) {
  156. if(destination.options[i].text == content) {
  157. return false;
  158. }
  159. }
  160. destination.options[destination.length] = new Option(content,code);
  161. destination.selectedIndex = -1;
  162. sortOptions(destination.options);
  163. }
  164. function remove_item(origin)
  165. {
  166. for(var i = 0 ; i<origin.options.length ; i++) {
  167. if(origin.options[i].selected) {
  168. origin.options[i]=null;
  169. i = i-1;
  170. }
  171. }
  172. }
  173. </script>';
  174. $formSent=0;
  175. $errorMsg=$firstLetterCourse=$firstLetterSession='';
  176. $CourseList=$SessionList=array();
  177. $courses=$sessions=array();
  178. $noPHP_SELF=true;
  179. if ($_POST['formSent']) {
  180. $formSent=$_POST['formSent'];
  181. $firstLetterCourse=$_POST['firstLetterCourse'];
  182. $firstLetterSession=$_POST['firstLetterSession'];
  183. $CourseList=$_POST['SessionCoursesList'];
  184. if (!is_array($CourseList)) {
  185. $CourseList=array();
  186. }
  187. $nbr_courses=0;
  188. $id_coach = api_sql_query("SELECT id_coach FROM $tbl_session WHERE id=$id_session");
  189. $id_coach = Database::fetch_array($id_coach);
  190. $id_coach = $id_coach[0];
  191. $rs = api_sql_query("SELECT course_code FROM $tbl_session_rel_course WHERE id_session=$id_session");
  192. $existingCourses = api_store_result($rs);
  193. $sql="SELECT id_user
  194. FROM $tbl_session_rel_user
  195. WHERE id_session = $id_session";
  196. $result=api_sql_query($sql,__FILE__,__LINE__);
  197. $UserList=api_store_result($result);
  198. foreach($CourseList as $enreg_course) {
  199. $enreg_course = Database::escape_string($enreg_course);
  200. $exists = false;
  201. foreach($existingCourses as $existingCourse) {
  202. if($enreg_course == $existingCourse['course_code']) {
  203. $exists=true;
  204. }
  205. }
  206. if(!$exists) {
  207. $sql_insert_rel_course= "INSERT INTO $tbl_session_rel_course(id_session,course_code, id_coach) VALUES('$id_session','$enreg_course','$id_coach')";
  208. api_sql_query($sql_insert_rel_course ,__FILE__,__LINE__);
  209. //We add in the existing courses table the current course, to not try to add another time the current course
  210. $existingCourses[]=array('course_code'=>$enreg_course);
  211. $nbr_users=0;
  212. foreach ($UserList as $enreg_user) {
  213. $enreg_user = Database::escape_string($enreg_user['id_user']);
  214. $sql_insert = "INSERT IGNORE INTO $tbl_session_rel_course_rel_user(id_session,course_code,id_user) VALUES('$id_session','$enreg_course','$enreg_user')";
  215. api_sql_query($sql_insert,__FILE__,__LINE__);
  216. if(Database::affected_rows()) {
  217. $nbr_users++;
  218. }
  219. }
  220. api_sql_query("UPDATE $tbl_session_rel_course SET nbr_users=$nbr_users WHERE id_session='$id_session' AND course_code='$enreg_course'",__FILE__,__LINE__);
  221. }
  222. }
  223. foreach($existingCourses as $existingCourse) {
  224. if(!in_array($existingCourse['course_code'], $CourseList)){
  225. api_sql_query("DELETE FROM $tbl_session_rel_course WHERE course_code='".$existingCourse['course_code']."' AND id_session=$id_session");
  226. api_sql_query("DELETE FROM $tbl_session_rel_course_rel_user WHERE course_code='".$existingCourse['course_code']."' AND id_session=$id_session");
  227. }
  228. }
  229. $nbr_courses=count($CourseList);
  230. api_sql_query("UPDATE $tbl_session SET nbr_courses=$nbr_courses WHERE id='$id_session'",__FILE__,__LINE__);
  231. if(isset($_GET['add']))
  232. header('Location: add_users_to_session.php?id_session='.$id_session.'&add=true');
  233. else
  234. header('Location: resume_session.php?id_session='.$id_session);
  235. //header('Location: '.$_GET['page'].'?id_session='.$id_session);
  236. }
  237. // display the dokeos header
  238. Display::display_header($tool_name);
  239. // display the tool title
  240. // api_display_tool_title($tool_name);
  241. if($add_type == 'multiple') {
  242. $link_add_type_unique = '<a href="'.api_get_self().'?id_session='.$id_session.'&add='.Security::remove_XSS($_GET['add']).'&add_type=unique">'.Display::return_icon('single.gif').get_lang('SessionAddTypeUnique').'</a>';
  243. $link_add_type_multiple = Display::return_icon('multiple.gif').get_lang('SessionAddTypeMultiple').' ';
  244. } else {
  245. $link_add_type_unique = Display::return_icon('single.gif').get_lang('SessionAddTypeUnique').'&nbsp;&nbsp;&nbsp;';
  246. $link_add_type_multiple = '<a href="'.api_get_self().'?id_session='.$id_session.'&add='.Security::remove_XSS($_GET['add']).'&add_type=multiple">'.Display::return_icon('multiple.gif').get_lang('SessionAddTypeMultiple').'</a>';
  247. }
  248. echo '<div class="actions">';
  249. echo $link_add_type_unique.$link_add_type_multiple;
  250. echo '</div>';
  251. // the form header
  252. echo '<div class="row"><div class="form_header">'.$tool_name.'</div></div>';
  253. /*$sql = 'SELECT COUNT(1) FROM '.$tbl_course;
  254. $rs = api_sql_query($sql, __FILE__, __LINE__);
  255. $count_courses = mysql_result($rs, 0, 0);*/
  256. $ajax_search = $add_type == 'unique' ? true : false;
  257. $nosessionCourses = $sessionCourses = array();
  258. if ($ajax_search) {
  259. $sql="SELECT code, title, visual_code, id_session
  260. FROM $tbl_course course
  261. INNER JOIN $tbl_session_rel_course session_rel_course
  262. ON course.code = session_rel_course.course_code
  263. AND session_rel_course.id_session = ".intval($id_session)."
  264. ORDER BY ".(sizeof($courses)?"(code IN(".implode(',',$courses).")) DESC,":"")." title";
  265. global $_configuration;
  266. if ($_configuration['multiple_access_urls']==true) {
  267. $tbl_course_rel_access_url= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE);
  268. $access_url_id = api_get_current_access_url_id();
  269. if ($access_url_id != -1){
  270. $sql="SELECT code, title, visual_code, id_session
  271. FROM $tbl_course course
  272. INNER JOIN $tbl_session_rel_course session_rel_course
  273. ON course.code = session_rel_course.course_code
  274. AND session_rel_course.id_session = ".intval($id_session)."
  275. INNER JOIN $tbl_course_rel_access_url url_course ON (url_course.course_code=course.code)
  276. WHERE access_url_id = $access_url_id
  277. ORDER BY ".(sizeof($courses)?"(code IN(".implode(',',$courses).")) DESC,":"")." title";
  278. }
  279. }
  280. $result=api_sql_query($sql,__FILE__,__LINE__);
  281. $Courses=api_store_result($result);
  282. foreach($Courses as $course) {
  283. $sessionCourses[$course['code']] = $course ;
  284. }
  285. } else {
  286. $sql="SELECT code, title, visual_code, id_session
  287. FROM $tbl_course course
  288. LEFT JOIN $tbl_session_rel_course session_rel_course
  289. ON course.code = session_rel_course.course_code
  290. AND session_rel_course.id_session = ".intval($id_session)."
  291. ORDER BY ".(sizeof($courses)?"(code IN(".implode(',',$courses).")) DESC,":"")." title";
  292. global $_configuration;
  293. if ($_configuration['multiple_access_urls']==true) {
  294. $tbl_course_rel_access_url= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE);
  295. $access_url_id = api_get_current_access_url_id();
  296. if ($access_url_id != -1){
  297. $sql="SELECT code, title, visual_code, id_session
  298. FROM $tbl_course course
  299. LEFT JOIN $tbl_session_rel_course session_rel_course
  300. ON course.code = session_rel_course.course_code
  301. AND session_rel_course.id_session = ".intval($id_session)."
  302. INNER JOIN $tbl_course_rel_access_url url_course ON (url_course.course_code=course.code)
  303. WHERE access_url_id = $access_url_id
  304. ORDER BY ".(sizeof($courses)?"(code IN(".implode(',',$courses).")) DESC,":"")." title";
  305. }
  306. }
  307. $result=api_sql_query($sql,__FILE__,__LINE__);
  308. $Courses=api_store_result($result);
  309. foreach($Courses as $course) {
  310. if ($course['id_session'] == $id_session) {
  311. $sessionCourses[$course['code']] = $course ;
  312. } else {
  313. $nosessionCourses[$course['code']] = $course ;
  314. }
  315. }
  316. }
  317. unset($Courses);
  318. ?>
  319. <form name="formulaire" method="post" action="<?php echo api_get_self(); ?>?page=<?php echo $_GET['page'] ?>&id_session=<?php echo $id_session; ?><?php if(!empty($_GET['add'])) echo '&add=true' ; ?>" style="margin:0px;" <?php if($ajax_search){echo ' onsubmit="valide();"';}?>>
  320. <input type="hidden" name="formSent" value="1" />
  321. <?php
  322. if(!empty($errorMsg))
  323. {
  324. Display::display_normal_message($errorMsg); //main API
  325. }
  326. ?>
  327. <table border="0" cellpadding="5" cellspacing="0" width="100%" align="center">
  328. <tr>
  329. <td width="45%" align="center"><b><?php echo get_lang('CourseListInPlatform') ?> :</b></td>
  330. <td width="10%">&nbsp;</td>
  331. <td align="center" width="45%"><b><?php echo get_lang('CourseListInSession') ?> :</b></td>
  332. </tr>
  333. <?php if($add_type == 'multiple') { ?>
  334. <tr><td width="45%" align="center">
  335. <?php echo get_lang('FirstLetterCourse'); ?> :
  336. <select name="firstLetterCourse" onchange = "xajax_search_courses(this.value,'multiple')">
  337. <option value="%">--</option>
  338. <?php
  339. echo Display :: get_alphabet_options();
  340. echo Display :: get_numeric_options(0,9,'');
  341. ?>
  342. </select>
  343. </td>
  344. <td>&nbsp;</td></tr>
  345. <?php } ?>
  346. <tr>
  347. <td width="45%" align="center">
  348. <?php
  349. if(!($add_type == 'multiple')){
  350. ?>
  351. <input type="text" id="course_to_add" onkeyup="xajax_search_courses(this.value,'single')" />
  352. <div id="ajax_list_courses_single"></div>
  353. <?php
  354. }
  355. else
  356. {
  357. ?>
  358. <div id="ajax_list_courses_multiple">
  359. <select id="origin" name="NoSessionCoursesList[]" multiple="multiple" size="20" style="width:300px;"> <?php
  360. foreach($nosessionCourses as $enreg)
  361. {
  362. ?>
  363. <option value="<?php echo $enreg['code']; ?>" <?php if(in_array($enreg['code'],$CourseList)) echo 'selected="selected"'; ?>><?php echo $enreg['title'].' ('.$enreg['visual_code'].')'; ?></option>
  364. <?php
  365. }
  366. ?> </select></div> <?php
  367. }
  368. unset($nosessionCourses);
  369. ?>
  370. </select></td>
  371. <td width="10%" valign="middle" align="center">
  372. <?php
  373. if($ajax_search)
  374. {
  375. ?>
  376. <input type="button" onclick="remove_item(document.getElementById('destination'))" value="<<" />
  377. <?php
  378. }
  379. else
  380. {
  381. ?>
  382. <input type="button" onclick="moveItem(document.getElementById('origin'), document.getElementById('destination'))" value=">>" />
  383. <br /><br />
  384. <input type="button" onclick="moveItem(document.getElementById('destination'), document.getElementById('origin'))" value="<<" />
  385. <?php
  386. }
  387. ?>
  388. <br /><br /><br /><br /><br /><br />
  389. <?php
  390. if(isset($_GET['add']))
  391. {
  392. echo '<button class="save" type="button" value="" onclick="valide()" >'.get_lang('NextStep').'</button>';
  393. }
  394. else
  395. {
  396. echo '<button class="save" type="button" value="" onclick="valide()" >'.get_lang('SubscribeCoursesToSession').'</button>';
  397. }
  398. ?>
  399. </td>
  400. <td width="45%" align="center"><select id='destination' name="SessionCoursesList[]" multiple="multiple" size="20" style="width:300px;">
  401. <?php
  402. foreach($sessionCourses as $enreg)
  403. {
  404. ?>
  405. <option value="<?php echo $enreg['code']; ?>"><?php echo $enreg['title'].' ('.$enreg['visual_code'].')'; ?></option>
  406. <?php
  407. }
  408. unset($sessionCourses);
  409. ?>
  410. </select></td>
  411. </tr>
  412. </table>
  413. </form>
  414. <script type="text/javascript">
  415. <!--
  416. function moveItem(origin , destination){
  417. for(var i = 0 ; i<origin.options.length ; i++) {
  418. if(origin.options[i].selected) {
  419. destination.options[destination.length] = new Option(origin.options[i].text,origin.options[i].value);
  420. origin.options[i]=null;
  421. i = i-1;
  422. }
  423. }
  424. destination.selectedIndex = -1;
  425. sortOptions(destination.options);
  426. }
  427. function sortOptions(options) {
  428. newOptions = new Array();
  429. for (i = 0 ; i<options.length ; i++) {
  430. newOptions[i] = options[i];
  431. }
  432. newOptions = newOptions.sort(mysort);
  433. options.length = 0;
  434. for(i = 0 ; i < newOptions.length ; i++){
  435. options[i] = newOptions[i];
  436. }
  437. }
  438. function mysort(a, b){
  439. if(a.text.toLowerCase() > b.text.toLowerCase()){
  440. return 1;
  441. }
  442. if(a.text.toLowerCase() < b.text.toLowerCase()){
  443. return -1;
  444. }
  445. return 0;
  446. }
  447. function valide(){
  448. var options = document.getElementById('destination').options;
  449. for (i = 0 ; i<options.length ; i++)
  450. options[i].selected = true;
  451. document.forms.formulaire.submit();
  452. }
  453. -->
  454. </script>
  455. <?php
  456. /*
  457. ==============================================================================
  458. FOOTER
  459. ==============================================================================
  460. */
  461. Display::display_footer();
  462. ?>