lp_ajax_save_item.php 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. <?php //$id$
  2. /**
  3. * This script contains the server part of the xajax interaction process. The client part is located
  4. * in lp_api.php or other api's.
  5. * This is a first attempt at using xajax and AJAX in general, so the code might be a bit unsettling.
  6. * @package dokeos.learnpath
  7. * @author Yannick Warnier <ywarnier@beeznest.org>
  8. */
  9. /**
  10. * Script
  11. */
  12. //flag to allow for anonymous user - needs to be set before global.inc.php
  13. $use_anonymous = true;
  14. // name of the language file that needs to be included
  15. $language_file[] = 'learnpath';
  16. require_once('back_compat.inc.php');
  17. /**
  18. * Writes an item's new values into the database and returns the operation result
  19. * @param integer Learnpath ID
  20. * @param integer User ID
  21. * @param integer View ID
  22. * @param integer Item ID
  23. * @param double Current score
  24. * @param double Maximum score
  25. * @param double Minimum score
  26. * @param string Lesson status
  27. * @param string Session time
  28. * @param string Suspend data
  29. * @param string Lesson location
  30. * @param array Interactions array
  31. * @param string Core exit SCORM string
  32. */
  33. function save_item($lp_id,$user_id,$view_id,$item_id,$score=-1,$max=-1,$min=-1,$status='',$time=0,$suspend='',$location='',$interactions=array(),$core_exit='none')
  34. {
  35. global $_configuration;
  36. $debug=0;
  37. $return = '';
  38. if($debug>0){error_log('In save_item('.$lp_id.','.$user_id.','.$view_id.','.$item_id.','.$score.','.$max.','.$min.',"'.$status.'",'.$time.',"'.$suspend.'","'.$location.'","'.(count($interactions)>0?$interactions[0]:'').'","'.$core_exit.'")',0);}
  39. //$objResponse = new xajaxResponse();
  40. require_once('learnpath.class.php');
  41. require_once('scorm.class.php');
  42. require_once('aicc.class.php');
  43. require_once('learnpathItem.class.php');
  44. require_once('scormItem.class.php');
  45. require_once('aiccItem.class.php');
  46. $mylp = '';
  47. if(isset($_SESSION['lpobject']))
  48. {
  49. if($debug>1){error_log('////$_SESSION[lpobject] is set',0);}
  50. $oLP =& unserialize($_SESSION['lpobject']);
  51. if(!is_object($oLP)){
  52. if($debug>2){error_log(print_r($oLP,true),0);}
  53. if($debug>2){error_log('////Building new lp',0);}
  54. unset($oLP);
  55. $code = api_get_course_id();
  56. $mylp = & new learnpath($code,$lp_id,$user_id);
  57. }else{
  58. if($debug>2){error_log('////Reusing session lp',0);}
  59. $mylp = & $oLP;
  60. }
  61. }
  62. //$objResponse->addAlert(api_get_path(REL_CODE_PATH).'newscorm/learnpathItem.class.php');
  63. $prereq_check = $mylp->prerequisites_match($item_id);
  64. if($prereq_check === true) //launch the prerequisites check and set error if needed
  65. {
  66. $mylpi =& $mylp->items[$item_id];
  67. //$mylpi->set_lp_view($view_id);
  68. if($max!=-1)
  69. {
  70. $mylpi->max_score=$max;
  71. }
  72. if($min!=-1)
  73. {
  74. $mylpi->min_score=$min;
  75. }
  76. if($score!=-1)
  77. {
  78. $mylpi->set_score($score);
  79. }
  80. if($status!='')
  81. {
  82. if($debug>1){error_log('Calling set_status('.$status.') from xajax',0);}
  83. $mylpi->set_status($status);
  84. if($debug>1){error_log('Done calling set_status from xajax',0);}
  85. }
  86. if($time!='')
  87. {
  88. //if big integer, then it's a timestamp, otherwise it's normal scorm time
  89. if($time == intval(strval($time)) && $time>1000000){
  90. $real_time = time() - $time;
  91. //$real_time += $mylpi->get_total_time();
  92. $mylpi->set_time($real_time,'int');
  93. }else{
  94. $mylpi->set_time($time);
  95. }
  96. }
  97. if($suspend!='')
  98. {
  99. $mylpi->current_data = $suspend;//escapetxt($suspend);
  100. }
  101. if($location!='')
  102. {
  103. $mylpi->set_lesson_location($location);
  104. }
  105. //deal with interactions provided in arrays in the following format
  106. //id(0), type(1), time(2), weighting(3),correct_responses(4),student_response(5),result(6),latency(7)
  107. if(is_array($interactions) && count($interactions)>0){
  108. foreach($interactions as $index=>$interaction){
  109. //$mylpi->add_interaction($index,$interactions[$index]);
  110. //fix DT#4444
  111. $clean_interaction = str_replace('@.|@',',',$interactions[$index]);
  112. $mylpi->add_interaction($index,$clean_interaction);
  113. }
  114. }
  115. $mylpi->set_core_exit($core_exit);
  116. $mylp->save_item($item_id,false);
  117. }else{
  118. //return $objResponse;
  119. return $return;
  120. }
  121. $mystatus_in_db = $mylpi->get_status(true);
  122. if ($mystatus_in_db<>'completed' && $mystatus_in_db<>'passed' && $mystatus_in_db<>'browsed') {
  123. $mystatus_in_memory = $mylpi->get_status(false);
  124. if ($mystatus_in_memory<>$mystatus_in_db) {
  125. $mystatus=$mystatus_in_memory;
  126. } else {
  127. $mystatus=$mystatus_in_db;
  128. }
  129. } else {
  130. $mystatus=$mystatus_in_db;
  131. }
  132. $mytotal = $mylp->get_total_items_count_without_chapters();
  133. $mycomplete = $mylp->get_complete_items_count();
  134. $myprogress_mode = $mylp->get_progress_bar_mode();
  135. $myprogress_mode = ($myprogress_mode==''?'%':$myprogress_mode);
  136. //$mylpi->write_to_db();
  137. $_SESSION['lpobject'] = serialize($mylp);
  138. if($mylpi->get_type()!='sco')
  139. { //if this object's JS status has not been updated by the SCORM API, update now
  140. //$objResponse->addScript("lesson_status='".$mystatus."';");
  141. $return .= "lesson_status='".$mystatus."';";
  142. }
  143. //$objResponse->addScript("update_toc('".$mystatus."','".$item_id."');");
  144. $return .= "update_toc('".$mystatus."','".$item_id."');";
  145. $update_list = $mylp->get_update_queue();
  146. foreach($update_list as $my_upd_id => $my_upd_status)
  147. {
  148. if($my_upd_id != $item_id){ //only update the status from other items (i.e. parents and brothers), do not update current as we just did it already
  149. //$objResponse->addScript("update_toc('".$my_upd_status."','".$my_upd_id."');");
  150. $return .= "update_toc('".$my_upd_status."','".$my_upd_id."');";
  151. }
  152. }
  153. //$objResponse->addScript("update_progress_bar('$mycomplete','$mytotal','$myprogress_mode');");
  154. $return .= "update_progress_bar('$mycomplete','$mytotal','$myprogress_mode');";
  155. if($debug>0){
  156. //$objResponse->addScript("logit_lms('Saved data for item ".$item_id.", user ".$user_id." (status=".$mystatus.")',2);");
  157. $return .= "logit_lms('Saved data for item ".$item_id.", user ".$user_id." (status=".$mystatus.")',2);";
  158. if($debug>1){error_log('End of xajax_save_item()',0);}
  159. }
  160. if($_configuration['tracking_enabled'] && !isset($_SESSION['login_as']))
  161. { // if $_SESSION['login_as'] is set, then the user is an admin logged as the user
  162. $tbl_track_login = Database :: get_statistic_table(TABLE_STATISTIC_TRACK_E_LOGIN);
  163. $sql_last_connection="SELECT login_id, login_date FROM $tbl_track_login WHERE login_user_id='".api_get_user_id()."' ORDER BY login_date DESC LIMIT 0,1";
  164. $q_last_connection=api_sql_query($sql_last_connection);
  165. if(Database::num_rows($q_last_connection) > 0) {
  166. $current_time=date('Y-m-d H:i:s');
  167. $row = Database::fetch_array($q_last_connection);
  168. $i_id_last_connection=$row['login_id'];
  169. $s_sql_update_logout_date="UPDATE $tbl_track_login SET logout_date='".$current_time."' WHERE login_id='$i_id_last_connection'";
  170. api_sql_query($s_sql_update_logout_date);
  171. }
  172. }
  173. if ($mylp->get_type()==2) {
  174. $return .="update_stats();";
  175. }
  176. return $return;
  177. //return $objResponse;
  178. }
  179. $interactions = array();
  180. if(isset($_GET['interact'])) {
  181. if (is_array($_GET['interact'])) {
  182. foreach($_GET['interact'] as $idx=>$interac)
  183. {
  184. $interactions[$idx] = split(',',substr($interac,1,-1));
  185. if(!isset($interactions[$idx][7])){ //make sure there are 7 elements
  186. $interactions[$idx][7]='';
  187. }
  188. }
  189. }
  190. }
  191. echo save_item(
  192. $_GET['lid'],
  193. $_GET['uid'],
  194. $_GET['vid'],
  195. $_GET['iid'],
  196. $_GET['s'],
  197. $_GET['max'],
  198. $_GET['min'],
  199. $_GET['status'],
  200. $_GET['t'],
  201. $_GET['suspend'],
  202. $_GET['loc'],
  203. $interactions,
  204. $_GET['core_exit']);