html5.php 47 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025
  1. <?php
  2. /**
  3. * Class that implements ilm_handle, in order to allow manipulation and management of HTML5 iLM
  4. *
  5. * @author Igor Moreira Félix
  6. * @author Patricia Alves Rodrigues
  7. * @author Leônidas O. Brandão
  8. * @version v 1 2017/17/10
  9. * @package mod_iassign_ilm_handlers
  10. * @copyright iMatica (<a href="http://www.matematica.br">iMath</a>) - Computer Science Dep. of IME-USP (Brazil)
  11. *
  12. * <b>License</b>
  13. * - http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  14. */
  15. global $CFG;
  16. require_once $CFG->dirroot . '/mod/iassign/ilm_handle.php';
  17. class html5 implements ilm_handle {
  18. /// Produce HTML code to load iLM
  19. public static function build_ilm_tags ($ilm_id, $options = array()) {
  20. global $DB, $OUTPUT;
  21. global $CONF_WWW; //TODO 1 => use iLM under WWW; otherwise use under MoodleData
  22. $html = "";
  23. if (empty($options['Proposition']))
  24. $options['Proposition'] = "";
  25. if (empty($options['addresPOST']))
  26. $options['addresPOST'] = "";
  27. if (empty($options['student_answer']))
  28. $options['student_answer'] = "";
  29. if (empty($options['notSEND']))
  30. $options['notSEND'] = "";
  31. else // Case it is authoring put 'notSEND' (important to iVProgH5 to present authoring tool)
  32. if ($options['type'] == "editor_update")
  33. $options['notSEND'] = "true";
  34. if (empty($options['id_iLM_security'])) // if defined, it is from 'iassign_security'
  35. $options['id_iLM_security'] = "";
  36. $id_iLM_security = $options['id_iLM_security'];
  37. $iassign_ilm = $DB->get_record('iassign_ilm', array('id' => $ilm_id));
  38. if ($iassign_ilm) {
  39. // md_files : filename
  40. $ilm_extension = $iassign_ilm->extension; // use local variavel to efficiency (several use)
  41. if ($ilm_extension) { // avoid problems
  42. $ilm_extension = strtolower($ilm_extension);
  43. }
  44. // Attention: in iAssign 2014 on, all the iLM is located on the Moodle filesystem (usually /var/moodledata/filedir/).
  45. // This means that '$iassign_ilm->file_jar' = '*_files.id'
  46. $file_url = array();
  47. $fs = get_file_storage();
  48. $files_jar = explode(",", $iassign_ilm->file_jar);
  49. $url = $iassign_ilm->file_class; // to HTML5 package, this 'file_class' must have the main HTML file
  50. array_push($file_url, $url);
  51. $lang = substr(current_language(), 0, 2);
  52. if ($options['type'] == "filter") { //leo
  53. $iassign_ilm_width = $options['width']; // or use? $iassign_ilm->width
  54. $iassign_ilm_height = $options['height']; // or use? $iassign_ilm->height
  55. } else { //leo
  56. $iassign_ilm_width = $iassign_ilm->width;
  57. $iassign_ilm_height = $iassign_ilm->height; // or use? $iassign_ilm->height
  58. }
  59. if (!empty($file_url)) { // There is an iLM file
  60. //TODO iLM_HTML5 :: Change to 'object', tag 'applet' was deprecated.
  61. $paramsStr = "?1=1";
  62. $html .= html5::show_ilm_commands();
  63. switch ($options['type']) {
  64. case "view":
  65. $paramsStr .= "&iLM_PARAM_Assignment=" . urlencode($options['Proposition']); //leo
  66. $paramsStr .= "&iLM_PARAM_SendAnswer=true";
  67. //TODO: REVIEW: this code is to insert iLM as HTML5 and to allow general parameter to any iLM
  68. //TODO: For now, 'iassign_ilm_config' is empty... let comment these lines
  69. //n $iassign_ilm_config = $DB->get_records('iassign_ilm_config', array('iassign_ilmid' => $ilm_id));
  70. //n foreach ($iassign_ilm_config as $ilm_config) {
  71. //n if (array_key_exists($ilm_config->param_name, $options)) {
  72. //n $ilm_config->param_value = $options[$ilm_config->param_name];
  73. //n $paramsStr .= "&" . $ilm_config->param_name . "=" . urlencode($ilm_config->param_value);
  74. //n }
  75. //n }
  76. break;
  77. case "filter":
  78. if ($options['toolbar'] == "disable")
  79. $paramsStr .= "&SOH_ADD=ADD";
  80. $paramsStr .= "&iLM_PARAM_AssignmentURL=true";
  81. $paramsStr .= "&iLM_PARAM_Assignment=" . urlencode($options['Proposition']);
  82. $paramsStr .= "&iLM_PARAM_SendAnswer=" . urlencode($options['notSEND']);
  83. $paramsStr .= "&iLM_PARAM_ServerToGetAnswerURL=" . urlencode($ilm_config->param_value);
  84. break; // static function build_ilm_tags($ilm_id, $options=array())
  85. case "activity": // build_ilm_tags
  86. //TODO To generalize to any HTML5 iLM, it is necessary to use 'iLM_PARAM_Assignment' and 'iLM_PARAM_SendAnswer'
  87. //TODO iLM_PARAM_Assignment=Proposition ; iLM_PARAM_SendAnswer=notSEND
  88. $paramsStr .= "&iLM_PARAM_AssignmentURL=true";
  89. // if ($options['special_param'] == 1) { }
  90. $paramsStr .= "&iLM_PARAM_Assignment=" . urlencode($options['Proposition']);
  91. $paramsStr .= "&iLM_PARAM_SendAnswer=" . urlencode($options['notSEND']);
  92. $paramsStr .= "&iLM_PARAM_ServerToGetAnswerURL=" . urlencode($options['addresPOST']);
  93. //TODO iLM_HTML5 :: To extend to any iLM in HTML5
  94. //TODO iLM_HTML5 :: it will allow to load dynamic parameters
  95. //T $iassign_activity_item_configs = $DB->get_records('iassign_statement_config', array('iassign_statementid' => $options['iassign_statement'] ));
  96. //T if ($iassign_activity_item_configs) {
  97. //T foreach ($iassign_activity_item_configs as $iassign_activity_item_config)
  98. //T $paramsStr .= "&" . $iassign_activity_item_config->param_name . "=" . urlencode($iassign_activity_item_config->param_value);
  99. //T }
  100. break;
  101. case "editor_new":
  102. $paramsStr .= "&iLM_PARAM_AssignmentURL=true";
  103. $paramsStr .= "&iLM_PARAM_SendAnswer=" . urlencode($options['notSEND']);
  104. $paramsStr .= "&iLM_PARAM_Authoring=true";
  105. break;
  106. case "editor_update":
  107. $paramsStr .= "&iLM_PARAM_AssignmentURL=true";
  108. $paramsStr .= "&iLM_PARAM_Assignment=" . urlencode($options['Proposition']);
  109. $paramsStr .= "&iLM_PARAM_SendAnswer=" . urlencode($options['notSEND']);
  110. $paramsStr .= "&iLM_PARAM_Authoring=true";
  111. break;
  112. default:
  113. $html .= iassign::warning_message_iassign('error_view_without_actiontype'); // $OUTPUT->notification(get_string('error_view_without_actiontype', 'iassign'), 'notifyproblem'); // The API allows for creation of four types of notification: error, warning, info, and success.
  114. } // switch($options['type'])
  115. $paramsStr .= "&lang=" . $lang; // get the language defined in Moodle
  116. $parameters = ' style="width: ' . $iassign_ilm_width . 'px; height: ' . $iassign_ilm_height . 'px;" ';
  117. $html .= '<iframe frameborder="0" name="iLM" id="iLM" src="' . $iassign_ilm->file_jar . $iassign_ilm->file_class . $paramsStr . '" ' . $parameters . '>' . "\n";
  118. $html .= '</iframe>' . "\n";
  119. } // if (!empty($file_url))
  120. } // if ($iassign_ilm)
  121. return $html;
  122. } // public static function build_ilm_tags($ilm_id, $options = array())
  123. public static function show_ilm_commands() {
  124. $html = "<script>function full_screen() {
  125. if('fullscreenEnabled' in document || 'webkitFullscreenEnabled' in document || 'mozFullScreenEnabled' in document || 'msFullscreenEnabled' in document) {
  126. if(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled) {
  127. var element = document.getElementsByName('iLM').item(0);
  128. //requestFullscreen is used to display an element in full screen mode.
  129. if('requestFullscreen' in element) {
  130. element.requestFullscreen();
  131. }
  132. else if ('webkitRequestFullscreen' in element) {
  133. element.webkitRequestFullscreen();
  134. }
  135. else if ('mozRequestFullScreen' in element) {
  136. element.mozRequestFullScreen();
  137. }
  138. else if ('msRequestFullscreen' in element) {
  139. element.msRequestFullscreen();
  140. }
  141. }
  142. } else {
  143. $('.expand_button').addClass('disabled');
  144. }
  145. }</script>";
  146. $html .= "<div style='width: 800px;text-align: right;'><div onClick='full_screen()' style='color: blue; cursor: pointer; display: contents;'>".get_string('full_screen', 'iassign')."</div></div>";
  147. return $html;
  148. }
  149. /// Exibe a atividade no iLM
  150. // @calledby locallib.php : view_iLM(...)
  151. public static function show_activity_in_ilm ($iassign_statement_activity_item, $student_answer, $enderecoPOST, $view_teacherfileversion) {
  152. global $USER, $CFG, $COURSE, $DB, $OUTPUT;
  153. $special_param1 = $iassign_statement_activity_item->special_param1;
  154. $ilm = $DB->get_record('iassign_ilm', array('id' => $iassign_statement_activity_item->iassign_ilmid));
  155. $context = context_module::instance($USER->cm);
  156. //TODO Given an activity => find its correspondent file in Moodle data. Bad solution!
  157. //TODO Change the meaning of 'iassign_statement.file' from insertion order to the ID in table 'files'.
  158. //TODO This demands update to each 'iassign_statement', find its corresponding on in 'files', and update 'iassign_statement.file = files.id'
  159. if ($view_teacherfileversion) { // get the exercise in Moodle data (teacher file)
  160. $fileid = "";
  161. $fs = get_file_storage();
  162. $files = $fs->get_area_files($context->id, 'mod_iassign', 'exercise', $iassign_statement_activity_item->file); // iassign_statement_activity_item = table 'iassign_statement'
  163. if ($files) {
  164. foreach ($files as $value) {
  165. if ($value->get_filename() != '.')
  166. $fileid = $value->get_id();
  167. }
  168. }
  169. if (!$fileid) { // 'Something is wrong. Maybe your teacher withdrew this exercise file. Please, inform your teacher.';
  170. print iassign::warning_message_iassign('error_exercise_removed') . "<br/>\n"; // I couldn't find the file in table 'files'!
  171. }
  172. }
  173. $ilm_name = strtolower($ilm->name);
  174. $extension = iassign_utils::filename_extension($ilm_name);
  175. if ($view_teacherfileversion) { // $view_teacherfileversion==1 => load the exercise ('activity') from the 'moodledata' (id in 'files')
  176. // $content_or_id_from_ilm_security = $this->context->id;
  177. $content_or_id_from_ilm_security = $fileid; // $iassign_statement_activity_item->file;
  178. }
  179. else { // $view_teacherfileversion==null => load the learner answer from the data base (iassign_submission)
  180. $content_or_id_from_ilm_security = $student_answer;
  181. }
  182. $allow_submission = false; // There is permission to 'submission' button?
  183. //VERIFICAR ESTE IF
  184. if ($USER->iassignEdit == 1 && $student_answer) { // for now, only iVProg2 and iVProgH5 allows editions of exercise already sent
  185. $allow_submission = true; // yes!
  186. $write_solution = 1;
  187. $enderecoPOST .= "&write_solution=1"; // complement POST address indicating that the learner could send edited solution
  188. }
  189. // Security: this avoid the student get a second access to the file content (usually an exercise)
  190. // Data are registered in the table '*_iassign_security' bellow and is erased by function 'view()' above.
  191. // IMPORTANT: the '$end_file' will receive the iLM content URL using the security filter './mod/iassign/ilm_security.php'
  192. // the iLM must request the content using this URL. Data are registered in the table '*_iassign_security'.
  193. // Attention : using iVProgH5 there are lot of " and the use of slashes (as '\"') will imply in iVProgH5 do not read the file!
  194. // do not use: $id_iLM_security = $this->write_iLM_security($iassign_statement_activity_item->id, addslashes($content_or_id_from_ilm_security));
  195. //2017 $id_iLM_security = $this->write_iLM_security($iassign_statement_activity_item->id, $content_or_id_from_ilm_security); // insert in 'iassign_security'
  196. //2017 $this->remove_old_iLM_security_entries($USER->id, $iassign_statement_activity_item->id); // additional security: erase eventually old entries
  197. require_once ($CFG->dirroot . '/mod/iassign/ilm_security.php');
  198. $timecreated = time();
  199. $token = md5($timecreated); // iassign_iLM_security->timecreated);
  200. $id_iLM_security = ilm_security::write_iLM_security($USER->id, $timecreated, $iassign_statement_activity_item->id, $content_or_id_from_ilm_security); // insert in 'iassign_security'
  201. // $iassign_iLM_security = $DB->get_record("iassign_security", array("id" => $id_iLM_security));
  202. $end_file = $CFG->wwwroot . '/mod/iassign/ilm_security.php?id=' . $id_iLM_security . '&token=' . $token . '&view=' . $view_teacherfileversion; // need full path...
  203. //
  204. $iassign = "
  205. <script type='text/javascript'>
  206. //<![CDATA[
  207. var strAnswer = '';
  208. var evaluationResult = '';
  209. var comment = '';
  210. function jsAnalyseAnswer () {
  211. // iVProgH5 will call function 'getEvaluationCallback(...)': /var/www/html/ivprogh5/js/services.js
  212. // 'getEvaluation()' calls 'js/services.js : endTest function(index)' that calls 'getEvaluationCallback(apro/100);'
  213. // sumEval = getSummation(); alert('mod/iassign/ilm/ifractions_5/index.html: sumEval = ' + sumEval);
  214. //CUIDADO 2017/11/22 - usar 'window.frames.iLM' resultava neste ponto 'TypeError: window.frames.iLM.getEvaluation is not a function'
  215. //CUIDADO resp = window.frames.iLM.getEvaluation();
  216. resp = window.frames[0].getEvaluation(); // pegar diretamente a primeir janela (nao pode haver outra!)
  217. if (resp == 'undefined') // in './mod/iassign/ilm/ivprog-html/js/services.js'; './mod/iassign/ilm/ivprog-html/main.html'
  218. return false;
  219. return true;
  220. }
  221. // ./mod/iassign/ilm/ivprog-html/js/services.js : call this to define the variable 'evaluationResult'
  222. function getEvaluationCallback (evaluation) {
  223. evaluationResult = evaluation;
  224. //leo 2017/11/22 strAnswer = window.frames.iLM.getAnswer();
  225. strAnswer = window.frames[0].getAnswer();
  226. // alert('getEvaluationCallback(...)' + evaluation + ', strAnswer=' + strAnswer);
  227. comment = document.formEnvio.submission_comment.value;
  228. //leo alert('getEvaluationCallback: enviando evaluationResult=' + evaluation + ', strAnswer=' + strAnswer);
  229. //leo
  230. if ((strAnswer==null || strAnswer=='' || strAnswer==-1) && (comment==null || comment=='')) { // undefined
  231. alert('" . get_string('activity_empty', 'iassign') . "'); // 'Activity sent without content.'
  232. return false; // error...
  233. }
  234. else {
  235. document.formEnvio.iLM_PARAM_ArchiveContent.value = strAnswer;
  236. document.formEnvio.iLM_PARAM_ActivityEvaluation.value = evaluationResult;
  237. document.formEnvio.iLM_PARAM_RealGrade.value = evaluation;
  238. //D alert(strAnswer);
  239. document.formEnvio.submit();
  240. return true; // success
  241. }
  242. }
  243. //]]>
  244. </script>\n";
  245. $iassign .= "\n<center>\n<form name='formEnvio' id='formEnvio' method='post' action='$enderecoPOST' enctype='multipart/form-data'>\n";
  246. // Attention: The actual iLM content will be provided by the indirect access in './mod/iassign/ilm_security.php',
  247. // bellow only the 'token' to the content will be shown in URL (by security reason). The iLM must use this URL on
  248. // 'MA_PARAM_Proposition' to request the content.
  249. // Calls static function bellow: parameters are data to store in table '*_iassign_submission'
  250. // In 'locallib.php ! class ilm_settings ! static function build_ilm_tags($ilm_id, $options = array())' that calls 'build_ilm_tags(.)' from here
  251. $iassign .= ilm_settings::build_ilm_tags($ilm->id, array(
  252. "type" => "activity",
  253. "notSEND" => "false",
  254. "addresPOST" => $enderecoPOST,
  255. "Proposition" => $end_file,
  256. "special_param" => $special_param1,
  257. "student_answer" => $student_answer,
  258. "id_iLM_security" => $id_iLM_security,
  259. "iassign_statement" => $iassign_statement_activity_item->id // MOOC 2016
  260. ));
  261. //DEBUG To verify iLM
  262. //D $iassign .= "
  263. //D <script type='text/javascript'>
  264. //D //alert('./mod/iassign/ilm_handlers/html5.php: 1 window.frames[0].getEvaluation()=' + window.frames[0].getEvaluation()); //
  265. //D alert('./mod/iassign/ilm_handlers/html5.php: 1 window.frames[0].getAnswer()=' + window.frames[0].getAnswer()); //
  266. //D </script>\n";
  267. if (!isguestuser() && $iassign_statement_activity_item->type_iassign != 1) {
  268. $iassign .= " <input type='hidden' name='iLM_PARAM_ArchiveContent' value=''>\n";
  269. $iassign .= " <input type='hidden' name='iLM_PARAM_ActivityEvaluation' value=''>\n";
  270. $iassign .= " <input type='hidden' name='iLM_PARAM_RealGrade' value=''>\n";
  271. if (!has_capability('mod/iassign:evaluateiassign', $USER->context, $USER->id))
  272. $iassign .= "<p><textarea rows='2' cols='60' name='submission_comment'></textarea></p>\n";
  273. else
  274. $iassign .= "<input type='hidden' name='submission_comment'>\n";
  275. if ($allow_submission) { // it is not iGeom
  276. $iassign .= "<center>\n<!-- load button -->\n" .
  277. " <input type=button value='" . get_string('submit_iassign', 'iassign') . "' onClick = 'javascript:window.jsAnalyseAnswer();' title='" .
  278. get_string('message_submit_iassign', 'iassign') . "'>\n" . "</center>\n";
  279. } else {
  280. // Works with 'javascript:window.jsAnalyseAnswer()' or simply 'jsAnalyseAnswer()'
  281. $iassign .= "<center>\n<!-- load button -->\n" .
  282. " <input type=button value='" . get_string('submit_iassign', 'iassign') . "' onClick = 'javascript:window.jsAnalyseAnswer();' title='" .
  283. get_string('message_submit_iassign', 'iassign') . "'>\n" . "</center>\n";
  284. }
  285. } // if (!isguestuser() && $iassign_statement_activity_item->type_iassign != 1)
  286. $iassign .= "</form></center>\n\n";
  287. return $iassign;
  288. } // public static function show_activity_in_ilm($iassign_statement_activity_item, $student_answer, $enderecoPOST, $view_teacherfileversion)
  289. /// Presents iLM information
  290. public static function view_ilm ($ilmid, $from) {
  291. global $DB;
  292. $url = new moodle_url('/admin/settings.php', array('section' => 'modsettingiassign'));
  293. $iassign_ilm = $DB->get_record('iassign_ilm', array('id' => $ilmid));
  294. $str = "";
  295. $str .= '<table id="outlinetable" cellpadding="5" width="100%" >' . "\n";
  296. $str .= '<tr>';
  297. $str .= '<td colspan=3 align=right>';
  298. if ($from != 'admin') {
  299. $str .= '<input type=button value="' . get_string('return', 'iassign') . '" onclick="javascript:window.location = \'' . $_SERVER['HTTP_REFERER'] . '\';">' . "\n";
  300. }
  301. $str .= '<input type=button value="' . get_string('close', 'iassign') . '" onclick="javascript:window.close();">';
  302. $str .= '</td>' . "\n";
  303. $str .= '</tr>' . "\n";
  304. if ($iassign_ilm) {
  305. $iassign_statement_activity_item = $DB->get_records('iassign_statement', array("iassign_ilmid" => $iassign_ilm->id));
  306. if ($iassign_statement_activity_item) {
  307. $total = count($iassign_statement_activity_item);
  308. } else {
  309. $total = 0;
  310. }
  311. if ($from == 'admin') {
  312. $str .= '<tr><td colspan=2>' . "\n";
  313. $str .= '<table width="100%" class="generaltable boxaligncenter" >' . "\n";
  314. $str .= '<tr>' . "\n";
  315. $str .= '<td class=\'cell c0 actvity\' ><strong>' . get_string('activities', 'iassign') . ':</strong>&nbsp;' . $total . '</td>' . "\n";
  316. $str .= '<td><strong>' . get_string('url_ilm', 'iassign') . '</strong>&nbsp;<a href="' . $iassign_ilm->url . '">' . $iassign_ilm->url . '</a></td>' . "\n";
  317. $str .= '</tr>' . "\n";
  318. $str .= '<tr><td colspan=2><strong>' . get_string('description', 'iassign') . ':</strong>&nbsp;' . iassign_language::get_description_lang(current_language(), $iassign_ilm->description) . '</td></tr>' . "\n";
  319. $str .= '<tr><td width="50%"><strong>' . get_string('type_ilm', 'iassign') . ':</strong>&nbsp;' . $iassign_ilm->type . '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>' . get_string('extension', 'iassign') . ':</strong>&nbsp;' . $iassign_ilm->extension . '</td>' . "\n";
  320. $str .= '<td width="50%"><strong>' . get_string('width', 'iassign') . ':</strong>&nbsp;' . $iassign_ilm->width;
  321. $str .= '&nbsp;&nbsp;<strong>' . get_string('height', 'iassign') . ':</strong>&nbsp;' . $iassign_ilm->height . '</td></tr>' . "\n";
  322. $date_jar = $iassign_ilm->file_jar;
  323. $str .= '<tr><td><strong>' . get_string('file_jar', 'iassign') . ':</strong>&nbsp;' . $date_jar . '</td>' . "\n";
  324. $str .= '<td ><strong>' . get_string('file_class', 'iassign') . ':</strong>&nbsp;' . $iassign_ilm->file_class . '</td></tr>' . "\n";
  325. if ($iassign_ilm->evaluate == 1) {
  326. $evaluate = get_string('yes', 'iassign');
  327. } else {
  328. $evaluate = get_string('no', 'iassign');
  329. }
  330. $str .= '<tr><td width="50%"><strong>' . get_string('evaluate', 'iassign') . ':</strong>&nbsp;' . $evaluate . '</td>' . "\n";
  331. if ($iassign_ilm->enable == 1) {
  332. $enable = get_string('yes', 'iassign');
  333. } else {
  334. $enable = get_string('no', 'iassign');
  335. }
  336. $str .= '<td width="50%"><strong>' . get_string('enable', 'iassign') . ':</strong>&nbsp;' . $enable . '</td></tr>' . "\n";
  337. $str .= '<tr>' . "\n";
  338. $str .= '<td width="50%"><strong>' . get_string('file_created', 'iassign') . ':</strong>&nbsp;' . userdate($iassign_ilm->timecreated) . '</td>' . "\n";
  339. $str .= '<td width="50%"><strong>' . get_string('file_modified', 'iassign') . ':</strong>&nbsp;' . userdate($iassign_ilm->timemodified) . '</td>' . "\n";
  340. $str .= '</tr>' . "\n";
  341. $user_ilm = $DB->get_record('user', array('id' => $iassign_ilm->author));
  342. if ($user_ilm) {
  343. $str .= '<tr>' . "\n";
  344. $str .= '<td colspan=2><strong>' . get_string('author', 'iassign') . ':</strong>&nbsp;' . $user_ilm->firstname . '&nbsp;' . $user_ilm->lastname . '</td>' . "\n";
  345. $str .= '</tr>' . "\n";
  346. }
  347. $str .= '</table>' . "\n";
  348. $str .= '</td></tr>' . "\n";
  349. }
  350. if (!empty($iassign_ilm->file_jar)) {
  351. //TODO: REVIEW: to be used for parameters of "applet" from DB
  352. $options = array("type" => "view"); //MOOC2014: start
  353. $str .= '<tr class=\'cell c0 actvity\'><td colspan=3 align=center bgcolor="#F5F5F5">' . "\n";
  354. // Second parameter null since 'iassign_security' are not define yet
  355. $str .= ilm_settings::build_ilm_tags($iassign_ilm->id, $options);
  356. //TODO: REVIEW: missing code to manage parameters
  357. //MOOC2014: tem este codigo!
  358. } else {
  359. $str .= '<tr class=\'cell c0 actvity\'>' . "\n";
  360. $str .= '<td colspan=2 align=center>' . get_string('null_file', 'iassign') . '</td>' . "\n";
  361. $str .= '<td align=center><a href="' . $url . '</a></td>' . "\n";
  362. $str .= '</tr>' . "\n";
  363. }
  364. $str .= '</td></tr>' . "\n";
  365. }
  366. $str .= '</table>' . "\n";
  367. return $str;
  368. } // public static function view_ilm($ilmid, $from)
  369. /// Make a copy or produce a new version of an iLM
  370. // @see locallib.php : copy_new_version_ilm($param)
  371. public static function copy_new_version_ilm ($param, $files_extract) {
  372. global $DB, $CFG;
  373. $iassign_ilm = new stdClass();
  374. $iassign_ilm->name = $param->name;
  375. $iassign_ilm->version = $param->version;
  376. $iassign_ilm->file_jar = null;
  377. $application_xml = @simplexml_load_file($CFG->dataroot . '/temp/' . 'ilm-application.xml', null, LIBXML_NOCDATA); //2019
  378. $file_jar = self::save_ilm_by_xml($application_xml, $files_extract); // iLM ṕath (since iAssign)> ./ilm/...
  379. if ($file_jar == null) { // 'save_ilm_by_xml(...)' detected a problem (perhaps no write permission)
  380. return false;
  381. }
  382. $file_jar = str_replace("./", "", $file_jar) . "/";
  383. // From a single text in default language => generate multi-language
  384. //R $description = json_decode($param->description_lang);
  385. //R $description->{$param->set_lang} = $param->description;
  386. $description_json_lang = $param->description_lang;
  387. $newentry = new stdClass();
  388. $newentry->name = $param->name;
  389. $newentry->version = $param->version;
  390. $newentry->type = 'HTML5';
  391. $newentry->url = $param->url;
  392. $newentry->description = $description_json_lang; //R strip_tags(json_encode($description));
  393. $newentry->extension = strtolower($param->extension);
  394. $newentry->file_jar = $file_jar;
  395. $newentry->file_class = $param->file_class;
  396. $newentry->width = $param->width;
  397. $newentry->height = $param->height;
  398. $newentry->enable = 0;
  399. $newentry->timemodified = $param->timemodified;
  400. $newentry->timecreated = $param->timecreated;
  401. $newentry->evaluate = $param->evaluate;
  402. $newentry->author = $param->author;
  403. $newentry->parent = $param->parent;
  404. $newentry->id = $DB->insert_record("iassign_ilm", $newentry);
  405. // log event --------------------------------------------------------------------------------------
  406. iassign_log::add_log('copy_iassign_ilm', 'name: ' . $param->name . ' ' . $param->version, 0, $newentry->id);
  407. // log event --------------------------------------------------------------------------------------
  408. } // public static function copy_new_version_ilm($param, $files_extract)
  409. /// Export the iLM to the IPZ package
  410. public static function export_ilm ($ilm_id) {
  411. global $DB, $CFG;
  412. $iassign_ilm = $DB->get_record('iassign_ilm', array('id' => $ilm_id));
  413. $iassign_ilm_configs = $DB->get_records('iassign_ilm_config', array('iassign_ilmid' => $ilm_id)); //MOOC 2016
  414. if (!$iassign_ilm_configs) return;
  415. $files_jar = $iassign_ilm->file_jar;
  416. $zip_filename = $CFG->dataroot . '/temp/ilm-' . iassign_utils::format_pathname($iassign_ilm->name . '-v' . $iassign_ilm->version) . '_' . date("Ymd-Hi") . '.ipz';
  417. $zip = new zip_archive;
  418. $zip->open($zip_filename);
  419. $rootdir = $CFG->dirroot . '/mod/iassign/' . $files_jar;
  420. $first_folder = str_replace($CFG->dirroot . '/mod/iassign/ilm/', "", $rootdir);
  421. $zip->add_directory($first_folder);
  422. $allfiles = self::list_directory($rootdir);
  423. $i = 0;
  424. foreach ($allfiles as $file) {
  425. $mini = str_replace($CFG->dirroot . '/mod/iassign/ilm/', "", $file);
  426. $mini = str_replace('//', "/", $mini);
  427. if (is_dir($file)) {
  428. $zip->add_directory($mini);
  429. } else {
  430. $zip->add_file_from_pathname($mini, $file);
  431. }
  432. }
  433. $folder = str_replace('ilm/', "", $files_jar);
  434. $application_descriptor = '<?xml version="1.0" encoding="utf-8"?>' . "\n";
  435. $application_descriptor .= '<application xmlns="http://line.ime.usp.br/application/1.5">' . "\n";
  436. $application_descriptor .= ' <name>' . $iassign_ilm->name . '</name>' . "\n";
  437. $application_descriptor .= ' <url>' . $iassign_ilm->url . '</url>' . "\n";
  438. $application_descriptor .= ' <version>' . $iassign_ilm->version . '</version>' . "\n";
  439. $application_descriptor .= ' <type>' . $iassign_ilm->type . '</type>' . "\n";
  440. $application_descriptor .= ' <description>' . html_entity_decode(str_replace(array('<p>', '</p>'), array('', ''), $iassign_ilm->description)) . '</description>' . "\n";
  441. $application_descriptor .= ' <extension>' . $iassign_ilm->extension . '</extension>' . "\n";
  442. $application_descriptor .= ' <file_jar>' . $folder . '</file_jar>' . "\n";
  443. $application_descriptor .= ' <file_class>' . $iassign_ilm->file_class . '</file_class>' . "\n";
  444. $application_descriptor .= ' <width>' . $iassign_ilm->width . '</width>' . "\n";
  445. $application_descriptor .= ' <height>' . $iassign_ilm->height . '</height>' . "\n";
  446. $application_descriptor .= ' <evaluate>' . $iassign_ilm->evaluate . '</evaluate>' . "\n";
  447. $application_descriptor .= ' <reevaluate>' . $iassign_ilm->reevaluate . '</reevaluate>' . "\n";
  448. if ($iassign_ilm_configs) { //MOOC 2016
  449. $application_descriptor .= ' <params>' . "\n";
  450. foreach ($iassign_ilm_configs as $iassign_ilm_config) {
  451. $application_descriptor .= ' <param>' . "\n";
  452. $application_descriptor .= ' <type>' . $iassign_ilm_config->param_type . '</type>' . "\n";
  453. $application_descriptor .= ' <name>' . $iassign_ilm_config->param_name . '</name>' . "\n";
  454. $application_descriptor .= ' <value>' . $iassign_ilm_config->param_value . '</value>' . "\n";
  455. $application_descriptor .= ' <description>' . htmlentities(str_replace("\n", "", $iassign_ilm_config->description)) . '</description>' . "\n";
  456. $application_descriptor .= ' <visible>' . $iassign_ilm_config->visible . '</visible>' . "\n";
  457. $application_descriptor .= ' </param>' . "\n";
  458. }
  459. $application_descriptor .= ' </params>' . "\n";
  460. } //MOOC 2016
  461. $application_descriptor .= '</application>' . "\n";
  462. $zip->add_file_from_string('ilm-application.xml', $application_descriptor);
  463. $zip->close();
  464. header("Pragma: public");
  465. header("Expires: 0");
  466. header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
  467. header("Cache-Control: private", false);
  468. header("Content-Type: application/zip");
  469. header("Content-Disposition: attachment; filename=\"" . basename($zip_filename) . "\";");
  470. header("Content-Transfer-Encoding: binary");
  471. header("Content-Length: " . (filesize($zip_filename)));
  472. set_time_limit(0);
  473. readfile($zip_filename) || die("File not found.");
  474. unlink($zip_filename);
  475. exit;
  476. } // public static function export_ilm($ilm_id)
  477. /// Function for list the directory where iLM is allocated.
  478. // @param type $dir
  479. // @return type
  480. static function list_directory ($dir) {
  481. $files = array();
  482. $cont = 0;
  483. $ffs = scandir($dir);
  484. unset($ffs[array_search('.', $ffs, true)]);
  485. unset($ffs[array_search('..', $ffs, true)]);
  486. if (count($ffs) < 1) {
  487. return;
  488. }
  489. foreach ($ffs as $ff) {
  490. $files[$cont] = $dir . "/" . $ff;
  491. $cont++;
  492. if (is_dir($dir . '/' . $ff)) {
  493. $temp = self::list_directory($dir . '/' . $ff);
  494. foreach ($temp as $t) {
  495. $files[$cont] = $t;
  496. $cont++;
  497. }
  498. }
  499. }
  500. return $files;
  501. }
  502. public static function delete_ilm($ilm_id) {
  503. global $DB, $CFG, $OUTPUT;
  504. $iassign_ilm = $DB->get_record('iassign_ilm', array('id' => $ilm_id));
  505. // Prepare the path of directory to be removed
  506. $path_w = rtrim($iassign_ilm->file_jar, "/");
  507. $folder_to_remove = substr($path_w, 0, strrpos($path_w, '/') + 1);
  508. // Check if the iLM directory is writable
  509. if (!is_writable($iassign_ilm->file_jar)) {
  510. return null;
  511. }
  512. self::delete_dir($folder_to_remove);
  513. $ilm_folder = "ilm/" . $iassign_ilm->name . "/";
  514. $k = 0;
  515. // Verify if iLM parent directory is empty, if yes, remove it
  516. foreach(glob($ilm_folder . "*", GLOB_ONLYDIR) as $dir) {
  517. $k ++;
  518. break;
  519. }
  520. if ($k == 0) {
  521. self::delete_dir($ilm_folder);
  522. }
  523. $DB->delete_records("iassign_ilm", array('id' => $ilm_id));
  524. $DB->delete_records("iassign_ilm_config", array('iassign_ilmid' => $ilm_id)); //MOOC 2016
  525. // log event --------------------------------------------------------------------------------------
  526. iassign_log::add_log('delete_iassign_ilm', 'name: ' . $iassign_ilm->name . ' ' . $iassign_ilm->version, 0, $iassign_ilm->id);
  527. // log event --------------------------------------------------------------------------------------
  528. return $iassign_ilm->parent;
  529. }
  530. /// Receive the updated data from an iLM to process it
  531. // @calledby locallib.php: static function edit_ilm($param,$itemid): $typec::edit_ilm($param,$itemid,$files_extract,$contextuser);
  532. public static function edit_ilm ($param, $itemid, $files_extract, $contextuser) {
  533. global $DB, $CFG;
  534. $iassign_ilm = new stdClass();
  535. $iassign_ilm->name = $param->name;
  536. $iassign_ilm->version = $param->version;
  537. $iassign_ilm->file_jar = $param->file_jar;
  538. $file_jar = null;
  539. if (!is_null($files_extract)) { // if there is a new iLM (from IPZ pachage)
  540. $file_jar = self::save_ilm_by_xml(null, $files_extract);
  541. if ($file_jar == null) {
  542. return false;
  543. }
  544. $file_jar = str_replace("./", "", $file_jar) . "/";
  545. }
  546. if (is_null($file_jar)) {
  547. // there is not definition to 'file_jar' in the IPZ packege, use eventually something entered by the form
  548. $file_jar = $param->file_jar;
  549. }
  550. $description = json_decode($param->description_lang);
  551. $description->{$param->set_lang} = $param->description;
  552. $updentry = new stdClass();
  553. $updentry->id = $param->id;
  554. $updentry->version = $param->version;
  555. $updentry->url = $param->url;
  556. // $updentry->description = json_encode($description); //R strip_tags(json_encode($description)); // will replace any special character by tags
  557. // $updentry->description = html_entity_decode((String)$param->description_lang); - the same as above
  558. $updentry->description = json_encode($description, JSON_UNESCAPED_UNICODE); // encode using UTF8
  559. $updentry->extension = strtolower($param->extension);
  560. if (!is_null($file_jar)) {
  561. $updentry->file_jar = $file_jar;
  562. }
  563. $updentry->file_class = $param->file_class;
  564. $updentry->width = $param->width;
  565. $updentry->height = $param->height;
  566. $updentry->enable = $param->enable;
  567. $updentry->timemodified = $param->timemodified;
  568. $updentry->evaluate = $param->evaluate;
  569. //D echo "./ilm_handlers/html5.php: edit_ilm(...): file_jar=$file_jar, file_class=" . $updentry->file_class . "<br/>"; //D exit;
  570. $DB->update_record("iassign_ilm", $updentry);
  571. // log event --------------------------------------------------------------------------------------
  572. iassign_log::add_log('update_iassign_ilm', 'name: ' . $param->name . ' ' . $param->version, 0, $param->id);
  573. // log event --------------------------------------------------------------------------------------
  574. } // public static function edit_ilm($param, $itemid, $files_extract, $contextuser)
  575. /// Function for save iLM file in moodledata
  576. // @param int $itemid Itemid of file save in draft (upload file)
  577. // @param int $ilm_id Id of iLM
  578. // @return string Return an string with ids of iLM files
  579. static function new_file_ilm ($itemid, $fs, $contextuser, $contextsystem, $files_ilm) {
  580. global $CFG, $USER, $DB;
  581. if ($files_ilm) {
  582. foreach ($files_ilm as $value) {
  583. // Check if it is an HTML5 iLM
  584. // Copy:
  585. $destination = 'ilm_debug/' . $value->get_filename();
  586. $value->copy_content_to($destination);
  587. // Extract the content:
  588. $zip = new ZipArchive();
  589. $extracted = './ilm';
  590. $dir = "";
  591. if ($zip->open($destination) === TRUE) {
  592. $dir = './ilm/' . trim($zip->getNameIndex(0));
  593. if (is_dir($dir)) {
  594. $i = 1;
  595. $previous = str_replace("/", "", $zip->getNameIndex(0));
  596. while (file_exists('./ilm/' . $previous . "_" . $i)) {
  597. $i ++;
  598. }
  599. $name = $previous . "_" . $i;
  600. $dir = './ilm/' . $name . "/";
  601. $j = 0;
  602. while ($item_name = $zip->getNameIndex($j)) {
  603. $zip->renameIndex($j, str_replace($previous, $name, $item_name));
  604. $j++;
  605. }
  606. $zip->close();
  607. }
  608. $zip->open($destination);
  609. $zip->extractTo($extracted);
  610. $zip->close();
  611. // After extract, remove from debug:
  612. unlink($destination);
  613. } else { // if ($zip->open($destination) === TRUE)
  614. // After trying to extract, occurring error, erase ZIP file:
  615. unlink($destination);
  616. print_error('error_add_ilm_zip', 'iassign');
  617. }
  618. return $dir;
  619. } // foreach ($files_ilm as $value)
  620. } // if ($files_ilm)
  621. } // static function new_file_ilm($itemid, $fs, $contextuser, $contextsystem, $files_ilm)
  622. /// Register data to the new iLM (in database and in proper directory)
  623. public static function new_ilm ($itemid, $files_extract, $application_xml, $contextuser, $fs) {
  624. global $DB, $CFG, $USER, $OUTPUT;
  625. $description_str = str_replace(array('<description>', '</description>'), array('', ''), $application_xml->description->asXML());
  626. $iassign_ilm = $DB->get_record('iassign_ilm', array("name" => (String) $application_xml->name, "version" => (String) $application_xml->version));
  627. if ($iassign_ilm) {
  628. foreach ($files_extract as $key => $value) {
  629. $rootfolder = $CFG->dataroot . '/temp/' . $key;
  630. self::delete_dir($rootfolder);
  631. break;
  632. }
  633. print($OUTPUT->notification(get_string('error_import_ilm_version', 'iassign'), 'notifyproblem')); // There is another iLM with the sama version!
  634. return false;
  635. }
  636. else {
  637. $file_jar = self::save_ilm_by_xml($application_xml, $files_extract);
  638. if ($file_jar == null) {
  639. return false;
  640. }
  641. $file_jar = str_replace("./", "", $file_jar);
  642. if (empty($file_jar)) {
  643. $msg_error = get_string('error_add_ilm', 'iassign') . "<br/>In new_ilm: file_jar empty, files_extract=" . $files_extract . "<br/>\n";
  644. print_error($msg_error);
  645. //xx print_error('error_add_ilm', 'iassign');
  646. //print("New file = " . file_jar . "<br/>");
  647. }
  648. else { // if (empty($file_jar))
  649. $iassign_ilm = $DB->get_record('iassign_ilm', array("parent" => 0, "name" => (String) $application_xml->name));
  650. if (!$iassign_ilm) {
  651. $iassign_ilm = new stdClass(); //MOOC 2016
  652. $iassign_ilm->id = 0;
  653. }
  654. $newentry = new stdClass();
  655. $newentry->name = (String) $application_xml->name;
  656. $newentry->version = (String) $application_xml->version;
  657. $newentry->type = (String) $application_xml->type;
  658. $newentry->url = (String) $application_xml->url;
  659. $newentry->description = strip_tags($description_str);
  660. $newentry->extension = strtolower((String) $application_xml->extension);
  661. $newentry->file_jar = $file_jar . "/";
  662. $newentry->file_class = (String) $application_xml->file_class;
  663. $newentry->width = (String) $application_xml->width;
  664. $newentry->height = (String) $application_xml->height;
  665. $newentry->enable = 0;
  666. $newentry->timemodified = time();
  667. $newentry->author = $USER->id;
  668. $newentry->timecreated = time();
  669. $newentry->evaluate = (String) $application_xml->evaluate;
  670. $newentry->reevaluate = (String) $application_xml->reevaluate;
  671. $newentry->parent = $iassign_ilm->id;
  672. $newentry->id = $DB->insert_record("iassign_ilm", $newentry);
  673. // log event --------------------------------------------------------------------------------------
  674. iassign_log::add_log('add_iassign_ilm', 'name: ' . $newentry->name . ' ' . $newentry->version, 0, $newentry->id);
  675. // log event --------------------------------------------------------------------------------------
  676. if ($application_xml->params->param) {
  677. foreach ($application_xml->params->param as $value) {
  678. $newentry = new stdClass();
  679. $newentry->iassign_ilmid = $iassign_ilmid;
  680. $newentry->param_type = (String) $value->type;
  681. $newentry->param_name = (String) $value->name;
  682. $newentry->param_value = (String) $value->value;
  683. $newentry->description = html_entity_decode((String) $value->description);
  684. $newentry->visible = (String) $value->visible;
  685. $newentry->id = $DB->insert_record("iassign_ilm", $newentry);
  686. if (!$newentry->id) {
  687. print_error('error_add_param', 'iassign');
  688. }
  689. }
  690. }
  691. }
  692. }
  693. $fs->delete_area_files($contextuser->id, 'user', 'draft', $itemid);
  694. return true;
  695. } // public static function new_ilm($itemid, $files_extract, $application_xml, $contextuser, $fs)
  696. /// Import an iLM
  697. public static function import_ilm ($itemid, $files_extract, $application_xml, $contextuser, $fs) {
  698. global $DB, $CFG, $USER, $OUTPUT;
  699. $description_str = str_replace(array('<description>', '</description>'), array('', ''), $application_xml->description->asXML());
  700. $iassign_ilm = $DB->get_record('iassign_ilm', array("name" => (String) $application_xml->name, "version" => (String) $application_xml->version));
  701. if ($iassign_ilm) {
  702. foreach ($files_extract as $key => $value) {
  703. $rootfolder = $CFG->dataroot . '/temp/' . $key;
  704. self::delete_dir($rootfolder);
  705. break;
  706. }
  707. print($OUTPUT->notification(get_string('error_import_ilm_version', 'iassign'), 'notifyproblem'));
  708. }
  709. else {
  710. $file_jar = self::save_ilm_by_xml($application_xml, $files_extract);
  711. if ($file_jar == null) {
  712. return false;
  713. }
  714. $file_jar = str_replace("./", "", $file_jar);
  715. if (empty($file_jar)) {
  716. $msg_error = get_string('error_add_ilm', 'iassign') . "<br/>In import_ilm: file_jar empty, files_extract=" . $files_extract . "<br/>\n";
  717. print_error($msg_error);
  718. //xx print_error('error_add_ilm', 'iassign');
  719. //print("Import file = " . file_jar . "<br/>");
  720. }
  721. else { // if (empty($file_jar))
  722. $iassign_ilm = $DB->get_record('iassign_ilm', array("parent" => 0, "name" => (String) $application_xml->name));
  723. if (!$iassign_ilm) {
  724. $iassign_ilm = new stdClass(); //MOOC 2016
  725. $iassign_ilm->id = 0;
  726. }
  727. $newentry = new stdClass();
  728. $newentry->name = (String) $application_xml->name;
  729. $newentry->version = (String) $application_xml->version;
  730. $newentry->type = (String) $application_xml->type;
  731. $newentry->url = (String) $application_xml->url;
  732. $newentry->description = strip_tags($description_str);
  733. $newentry->extension = strtolower((String) $application_xml->extension);
  734. $newentry->file_jar = $file_jar . "/";
  735. $newentry->file_class = (String) $application_xml->file_class;
  736. $newentry->width = (String) $application_xml->width;
  737. $newentry->height = (String) $application_xml->height;
  738. $newentry->enable = 0;
  739. $newentry->timemodified = time();
  740. $newentry->author = $USER->id;
  741. $newentry->timecreated = time();
  742. $newentry->evaluate = (String) $application_xml->evaluate;
  743. $newentry->reevaluate = (String) $application_xml->reevaluate;
  744. $newentry->parent = $iassign_ilm->id;
  745. //MOOC 2016 $newentry->id = $DB->insert_record("iassign_ilm", $newentry);
  746. $iassign_ilmid = $DB->insert_record("iassign_ilm", $newentry);
  747. if ($application_xml->params->param) {
  748. foreach ($application_xml->params->param as $value) {
  749. $newentry = new stdClass();
  750. $newentry->iassign_ilmid = $iassign_ilmid;
  751. $newentry->param_type = (String) $value->type;
  752. $newentry->param_name = (String) $value->name;
  753. $newentry->param_value = (String) $value->value;
  754. $newentry->description = html_entity_decode((String) $value->description);
  755. $newentry->visible = (String) $value->visible;
  756. $newentry->id = $DB->insert_record("iassign_ilm", $newentry);
  757. if (!$newentry->id) {
  758. print_error('error_add_param', 'iassign');
  759. }
  760. }
  761. } // if ($application_xml->params->param)
  762. } // else if (empty($file_jar))
  763. print($OUTPUT->notification(get_string('ok_import_ilm_version', 'iassign'), 'notifysuccess'));
  764. }
  765. $fs->delete_area_files($contextuser->id, 'user', 'draft', $itemid);
  766. } // public static function import_ilm($itemid, $files_extract, $application_xml, $contextuser, $fs)
  767. // static function export_update_ilm($ilm_id) //MOOC 2016
  768. /// Function for save iLM from XML descriptor
  769. // @see html5.php : copy_new_version_ilm($param,$files_extract); edit_ilm($param,$itemid,$files_extract,$contextuser); new_ilm($itemid,$files_extract,$application_xml,$contextuser,$fs); import_ilm($itemid,$files_extract,$application_xml,$contextuser,$fs);
  770. // @param array $application_xml Data of XML descriptor
  771. // @param array $files_extract Filenames of extract files
  772. // @return string with the iLM path (since ./ilm/...)
  773. static function save_ilm_by_xml ($application_xml, $files_extract) {
  774. global $CFG, $USER, $OUTPUT;
  775. $source = "";
  776. $diretorio = "";
  777. // Check if the iLM directory is writable
  778. if (!is_writable("ilm/")) {
  779. print($OUTPUT->notification(get_string('error_folder_permission_denied', 'iassign'), 'notifyproblem'));
  780. exit;
  781. // return null; // Is safer to stop the processing in order to allow the reader of this error!
  782. }
  783. // The filter 'filename_from_iLM_name(...)' is essential to clear the name for directory from the iLM original name
  784. $application_file_name = iassign_utils::filename_from_iLM_name($application_xml->name, false); //2019
  785. // Check if iLM directory already exists
  786. if (!file_exists("ilm/" . $application_file_name)) {
  787. mkdir("ilm/" . $application_file_name, 0755, true); // 755 = rwxr-xr-x
  788. touch("ilm/" . $application_file_name . DIRECTORY_SEPARATOR . "index.html");
  789. }
  790. // Check if iLM version already exists in directory
  791. if (!file_exists("ilm/" . $application_file_name . "/" . $application_xml->version)) {
  792. mkdir("ilm/" . $application_file_name . DIRECTORY_SEPARATOR . $application_xml->version, 0755, true);
  793. touch("ilm/" . $application_file_name . DIRECTORY_SEPARATOR . $application_xml->version . DIRECTORY_SEPARATOR . "index.html");
  794. }
  795. else {
  796. $diretorio = "./" . "ilm/" . $application_file_name . DIRECTORY_SEPARATOR . $application_xml->version;
  797. //RR echo $diretorio."<br/>";
  798. print($OUTPUT->notification(get_string('error_import_ilm_version', 'iassign'), 'notifyproblem'));
  799. //RR return null;
  800. return $diretorio;
  801. }
  802. $root_ilm = "ilm/" . $application_file_name . "/" . $application_xml->version;
  803. // Extract iLM files to directory
  804. foreach ($files_extract as $key => $value) {
  805. $file = $CFG->dataroot . '/temp/' . $key;
  806. if (is_dir($file)) {
  807. $source = $file;
  808. $diretorio = $root_ilm . "/" . basename($file);
  809. // mkdir($diretorio, 0777, true);
  810. mkdir($diretorio, 0755, true);
  811. touch($diretorio . DIRECTORY_SEPARATOR . "index.html");
  812. break;
  813. }
  814. } // foreach ($files_extract as $key => $value)
  815. // Write in the MoodleData 'temp' directory, also in the WWW 'mod/iassign/ilm/'
  816. //D foreach ($iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($source, \RecursiveDirectoryIterator::SKIP_DOTS), \RecursiveIteratorIterator::SELF_FIRST) as $item
  817. foreach ($iterator = new RecursiveIteratorIterator(
  818. new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS), RecursiveIteratorIterator::SELF_FIRST) as $item) {
  819. $directory_name = $diretorio . DIRECTORY_SEPARATOR . $iterator->getSubPathName();
  820. if ($item->isDir()) {
  821. mkdir($directory_name);
  822. touch($directory_name . DIRECTORY_SEPARATOR . "index.html");
  823. }
  824. else {
  825. copy($item, $directory_name);
  826. }
  827. }
  828. self::delete_dir($source);
  829. return "./" . $diretorio;
  830. } // static function save_ilm_by_xml($application_xml, $files_extract)
  831. /// Function for delete directory where the iLM is allocated.
  832. // @param string $dirPath
  833. // @throws InvalidArgumentException
  834. public static function delete_dir ($dirPath) {
  835. if (substr($dirPath, strlen($dirPath) - 1, 1) != '/') {
  836. $dirPath .= '/';
  837. }
  838. $files = glob($dirPath . '*', GLOB_MARK); //TODO This option 'glob' do not get file with dot (like '.versions'), chang to 'scandir($dir)'...
  839. foreach ($files as $file) {
  840. if (is_dir($file)) { //TODO if ($file != '.' && $file != '..')
  841. self::delete_dir($file);
  842. }
  843. else {
  844. unlink($file);
  845. }
  846. }
  847. if (is_dir($dirPath))
  848. rmdir($dirPath); //TODO Warning: rmdir(/var/data/moodle_data_saw/temp/ivprog-html/js/semantic/): Directory not empty in /var/www/html/saw_clone/mod/iassign/ilm_handlers/html5.php on line 962
  849. else
  850. print($OUTPUT->notification(get_string('error_file_jar_exists', 'iassign'), 'notifyproblem')); // just warning the user
  851. }
  852. } // class html5 implements ilm_handle
  853. ?>