/** * Garbage collector */ function HotPotGCt($folder, $flag, $userID) { // Garbage Collector $filelist = array(); if ($dir = @opendir($folder)) { while (($file = readdir($dir)) !== false) { if ($file != ".") { if ($file != "..") { $full_name = $folder . "/" . $file; if (is_dir($full_name)) { HotPotGCt($folder . "/" . $file, $flag); } else { $filelist[] = $file; } } } } closedir($dir); } while (list($key, $val) = each($filelist)) { if (stristr($val, $userID . ".t.html")) { if ($flag == 1) { FileManager::my_delete($folder . "/" . $val); } else { echo $folder . "/" . $val . "<br />"; } } } }
/** * Exports the current SCORM object's files as a zip. Excerpts taken from learnpath_functions.inc.php::exportpath() * @param integer Learnpath ID (optional, taken from object context if not defined) */ function export_zip($lp_id = null) { if ($this->debug > 0) { error_log('In scorm::export_zip method(' . $lp_id . ')', 0); } if (empty($lp_id)) { if (!is_object($this)) { return false; } else { $id = $this->get_id(); if (empty($id)) { return false; } else { $lp_id = $this->get_id(); } } } //error_log('New LP - in export_zip()',0); //zip everything that is in the corresponding scorm dir //write the zip file somewhere (might be too big to return) require_once 'learnpath_functions.inc.php'; $course_id = api_get_course_int_id(); $tbl_lp = Database::get_course_table(TABLE_LP_MAIN); $_course = api_get_course_info(api_get_course_id()); $sql = "SELECT * FROM {$tbl_lp} WHERE c_id = " . $course_id . " AND id=" . $lp_id; $result = Database::query($sql); $row = Database::fetch_array($result); $LPname = $row['path']; $list = split('/', $LPname); $LPnamesafe = $list[0]; //$zipfoldername = '/tmp'; //$zipfoldername = '../../courses/'.$_course['directory'].'/temp/'.$LPnamesafe; $zipfoldername = api_get_path(SYS_COURSE_PATH) . $_course['directory'] . '/temp/' . $LPnamesafe; $scormfoldername = api_get_path(SYS_COURSE_PATH) . $_course['directory'] . '/scorm/' . $LPnamesafe; $zipfilename = $zipfoldername . '/' . $LPnamesafe . '.zip'; // Get a temporary dir for creating the zip file. //error_log('New LP - cleaning dir '.$zipfoldername, 0); deldir($zipfoldername); // Make sure the temp dir is cleared. $res = mkdir($zipfoldername, api_get_permissions_for_new_directories()); //error_log('New LP - made dir '.$zipfoldername, 0); // Create zipfile of given directory. $zip_folder = new PclZip($zipfilename); $zip_folder->create($scormfoldername . '/', PCLZIP_OPT_REMOVE_PATH, $scormfoldername . '/'); //$zipfilename = '/var/www/chamilo/courses/TEST2/scorm/example_document.html'; //This file sending implies removing the default mime-type from php.ini //DocumentManager :: file_send_for_download($zipfilename, true, $LPnamesafe.'.zip'); DocumentManager::file_send_for_download($zipfilename, true); // Delete the temporary zip file and directory in fileManager.lib.php FileManager::my_delete($zipfilename); FileManager::my_delete($zipfoldername); return true; }
/** * Unset a document as template * * @param int $document_id * @param string $couse_code * @param int $user_id */ public static function unset_document_as_template($document_id, $course_code, $user_id) { $table_template = Database::get_main_table(TABLE_MAIN_TEMPLATES); $course_code = Database::escape_string($course_code); $user_id = Database::escape_string($user_id); $document_id = Database::escape_string($document_id); $sql = 'SELECT id FROM ' . $table_template . ' WHERE course_code="' . $course_code . '" AND user_id="' . $user_id . '" AND ref_doc="' . $document_id . '"'; $result = Database::query($sql); $template_id = Database::result($result, 0, 0); FileManager::my_delete(api_get_path(SYS_CODE_PATH) . 'upload/template_thumbnails/' . $template_id . '.jpg'); $sql = 'DELETE FROM ' . $table_template . ' WHERE course_code="' . $course_code . '" AND user_id="' . $user_id . '" AND ref_doc="' . $document_id . '"'; Database::query($sql); }
/** * Export SCORM content into a zip file * * Basically, all this function does is put the scorm directory back into a zip file (like the one * that was most probably used to import the course at first) * @deprecated this function is only called in the newscorm/scorm_admin.php which is deprecated * * @param string Name of the SCORM path (or the directory under which it resides) * @param array Not used right now. Should replace the use of global $_course * @return void * @author imandak80 */ function exportSCORM($scormname, $course) { $_course = api_get_course_info(); // Initialize. $tmpname = api_get_path(SYS_COURSE_PATH) . $_course['path'] . '/scorm'; $zipfoldername = $tmpname . $scormname; $zipfilename = $zipfoldername . '.zip'; // Create zipfile of given directory. include_once api_get_path(LIBRARY_PATH) . 'pclzip/pclzip.lib.php'; $zip_folder = new PclZip($zipfilename); $list = 1; //$list = $zip_folder->create($zipfoldername.'/',PCLZIP_OPT_REMOVE_PATH,$tmpname.$scormname."/"); // whitout folder $list = $zip_folder->create($zipfoldername . '/', PCLZIP_OPT_REMOVE_PATH, $tmpname); if ($list == 0) { //echo "Error : ".$zip_folder->errorInfo(true); } // Send to client. DocumentManager::file_send_for_download($zipfilename, false, basename($scormname . '.zip')); FileManager::my_delete($zipfilename); }
case 'delete': // deletes an exercise $imgparams = array(); $imgcount = 0; GetImgParams($file, $documentPath, $imgparams, $imgcount); $fld = GetFolderName($file); for ($i = 0; $i < $imgcount; $i++) { FileManager::my_delete($documentPath . $uploadPath . "/" . $fld . "/" . $imgparams[$i]); FileManager::update_db_info("delete", $uploadPath . "/" . $fld . "/" . $imgparams[$i]); } if (FileManager::my_delete($documentPath . $file)) { FileManager::update_db_info("delete", $file); } // hotpotatoes folder may contains several tests so don't delete folder if not empty : #2165 if (!(strstr($uploadPath, DIR_HOTPOTATOES) && !FileManager::folder_is_empty($documentPath . $uploadPath . "/" . $fld . "/"))) { FileManager::my_delete($documentPath . $uploadPath . "/" . $fld . "/"); } break; case 'enable': // enables an exercise $newVisibilityStatus = "1"; //"visible" $query = "SELECT id FROM {$TBL_DOCUMENT} WHERE c_id = {$course_id} AND path='" . Database::escape_string($file) . "'"; $res = Database::query($query); $row = Database::fetch_array($res, 'ASSOC'); api_item_property_update($_course, TOOL_DOCUMENT, $row['id'], 'visible', $_user['user_id']); break; case 'disable': // disables an exercise $newVisibilityStatus = "0"; //"invisible"
* Included libraries */ //require_once '../inc/global.inc.php'; require_once api_get_path(SYS_CODE_PATH) . 'exercice/hotpotatoes.lib.php'; $time = time(); $doc_url = str_replace(array('../', '\\', '\\0', '..'), array('', '', '', ''), urldecode($_GET['file'])); $cid = api_get_course_id(); $document_path = api_get_path(SYS_COURSE_PATH) . $_course['path'] . '/document'; $document_web_path = api_get_path(WEB_COURSE_PATH) . $_course['path'] . '/document'; $origin = $_REQUEST['origin']; $learnpath_id = $_REQUEST['learnpath_id']; $learnpath_item_id = $_REQUEST['learnpath_item_id']; $time = isset($_REQUEST['time']) ? $_REQUEST['time'] : null; $user_id = api_get_user_id(); $full_file_path = $document_path . $doc_url; FileManager::my_delete($full_file_path . $user_id . '.t.html'); $content = ReadFileCont($full_file_path . $user_id . '.t.html'); if ($content == '') { $url = api_get_path(WEB_CODE_PATH) . "exercice/savescores.php?origin={$origin}&learnpath_id={$learnpath_id}&learnpath_item_id={$learnpath_item_id}&time=" . Security::remove_XSS($time) . "&test=" . $doc_url . "&uid=" . $user_id . "&cid=" . $cid . "&score='+Score"; $content = ReadFileCont($full_file_path); $mit = "function Finish(){"; $js_content = "\n //Code added - start\n\n var SaveScoreVariable = 0;\n function mySaveScore() {\n if (SaveScoreVariable==0) {\n SaveScoreVariable = 1;\n if (C.ie) {\n document.location.href = '" . $url . ";\n //window.alert(Score);\n } else {\n window.location.href = '" . $url . ";\n }\n }\n }\n function Finish() {\n mySaveScore();\n\n //Code added - end\n "; $newcontent = str_replace($mit, $js_content, $content); $prehref = "<!-- BeginTopNavButtons -->"; $posthref = "<!-- BeginTopNavButtons -->"; $newcontent = str_replace($prehref, $posthref, $newcontent); if (CheckSubFolder($full_file_path . $user_id . '.t.html') == 0) { $newcontent = ReplaceImgTag($newcontent); } } else { $newcontent = $content;
$doc_id = FileManager::add_document($_course, '/HotPotatoes_files/' . $fld, 'folder', 0, $fld); api_item_property_update($_course, TOOL_DOCUMENT, $doc_id, 'FolderCreated', api_get_user_id()); } else { // It is not the first step... get the filename directly from the system params. $filename = $_FILES['userFile']['name']; } $allow_output_on_success = false; if (FileManager::handle_uploaded_document($_course, $_FILES['userFile'], $document_sys_path, $uploadPath . '/' . $fld, api_get_user_id(), null, null, $unzip, '', $allow_output_on_success)) { if ($finish == 2) { $imgparams = $_POST['imgparams']; $checked = CheckImageName($imgparams, $filename); if ($checked) { $imgcount = $imgcount - 1; } else { $dialogBox .= $filename . ' ' . get_lang('NameNotEqual'); FileManager::my_delete($document_sys_path . $uploadPath . '/' . $fld . '/' . $filename); FileManager::update_db_info('delete', $uploadPath . '/' . $fld . '/' . $filename); } if ($imgcount == 0) { // all image uploaded $finish = 1; } } else { // If we are (still) on the first step of the upload process. if ($finish == 0) { $finish = 2; // Get number and name of images from the files contents. GetImgParams('/' . $filename, $document_sys_path . $uploadPath . '/' . $fld, $imgparams, $imgcount); if ($imgcount == 0) { $finish = 1; } else {
require_once '../newscorm/learnpath.class.php'; require_once '../newscorm/learnpathItem.class.php'; require_once '../newscorm/scorm.class.php'; require_once '../newscorm/scormItem.class.php'; require_once '../newscorm/aicc.class.php'; require_once '../newscorm/aiccItem.class.php'; } require_once '../inc/global.inc.php'; $this_section = SECTION_COURSES; $_cid = api_get_course_id(); $test = $_REQUEST['test']; $score = $_REQUEST['score']; $origin = $_REQUEST['origin']; $documentPath = api_get_path(SYS_COURSE_PATH) . $_course['path'] . "/document"; $full_file_path = $documentPath . $test; FileManager::my_delete($full_file_path . $_user['user_id'] . ".t.html"); $TABLETRACK_HOTPOTATOES = Database::get_main_table(TABLE_STATISTIC_TRACK_E_HOTPOTATOES); $tbl_learnpath_user = Database::get_course_table(TABLE_LEARNPATH_USER); $TABLE_LP_ITEM_VIEW = Database::get_course_table(TABLE_LP_ITEM_VIEW); $jscript2run = ''; /** * Save the score for a HP quiz. Can be used by the learnpath tool as well * for HotPotatoes quizzes. When coming from the learning path, we * use the session variables telling us which item of the learning path has to * be updated (score-wise) * @param string File is the exercise name (the file name for a HP) * @param integer Score to save inside the tracking tables (HP and learnpath) * @return void */ function save_scores($file, $score) {
/** * main function to import an exercise, * * @return an array as a backlog of what was really imported, and error or debug messages to display */ function import_exercise($file) { global $exercise_info; global $element_pile; global $non_HTML_tag_to_avoid; global $record_item_body; // used to specify the question directory where files could be found in relation in any question global $questionTempDir; $archive_path = api_get_path(SYS_ARCHIVE_PATH) . 'qti2'; $baseWorkDir = $archive_path; if (!is_dir($baseWorkDir)) { mkdir($baseWorkDir, api_get_permissions_for_new_directories(), true); } $uploadPath = '/'; // set some default values for the new exercise $exercise_info = array(); $exercise_info['name'] = preg_replace('/.zip$/i', '', $file); $exercise_info['question'] = array(); $element_pile = array(); // create parser and array to retrieve info from manifest $element_pile = array(); //pile to known the depth in which we are //$module_info = array (); //array to store the info we need // if file is not a .zip, then we cancel all if (!preg_match('/.zip$/i', $file)) { Display::display_error_message(get_lang('You must upload a zip file')); return false; } // unzip the uploaded file in a tmp directory if (!get_and_unzip_uploaded_exercise($baseWorkDir, $uploadPath)) { Display::display_error_message(get_lang('You must upload a zip file')); return false; } // find the different manifests for each question and parse them. $exerciseHandle = opendir($baseWorkDir); //$question_number = 0; $file_found = false; $operation = false; $result = false; // parse every subdirectory to search xml question files while (false !== ($file = readdir($exerciseHandle))) { if (is_dir($baseWorkDir . '/' . $file) && $file != "." && $file != "..") { //find each manifest for each question repository found $questionHandle = opendir($baseWorkDir . '/' . $file); while (false !== ($questionFile = readdir($questionHandle))) { if (preg_match('/.xml$/i', $questionFile)) { $result = parse_file($baseWorkDir, $file, $questionFile); $file_found = true; } } } elseif (preg_match('/.xml$/i', $file)) { $result = parse_file($baseWorkDir, '', $file); $file_found = true; } // else ignore file } if (!$file_found) { Display::display_error_message(get_lang('No XML file found in the zip')); return false; } if ($result == false) { return false; } //add exercise in tool //1.create exercise $exercise = new Exercise(); $exercise->exercise = $exercise_info['name']; $exercise->save(); $last_exercise_id = $exercise->selectId(); if (!empty($last_exercise_id)) { //For each question found... foreach ($exercise_info['question'] as $key => $question_array) { //2.create question $question = new Ims2Question(); $question->type = $question_array['type']; $question->setAnswer(); $question->updateTitle($question_array['title']); // question ... $type = $question->selectType(); $question->type = constant($type); // type ... $question->save($last_exercise_id); // save computed grade $last_question_id = $question->selectId(); //3.create answer $answer = new Answer($last_question_id); $answer->new_nbrAnswers = count($question_array['answer']); foreach ($question_array['answer'] as $key => $answers) { $split = explode('_', $key); $i = $split[1]; $answer->new_answer[$i] = $answers['value']; // answer ... $answer->new_comment[$i] = $answers['feedback']; // comment ... $answer->new_position[$i] = $i; // position ... // correct answers ... if (in_array($key, $question_array['correct_answers'])) { $answer->new_correct[$i] = 1; } else { $answer->new_correct[$i] = 0; } $answer->new_weighting[$i] = $question_array['weighting'][$key]; } $answer->save(); } // delete the temp dir where the exercise was unzipped FileManager::my_delete($baseWorkDir . $uploadPath); $operation = true; } return $operation; }
/** * Hotpotato Garbage Collector * @param string Path * @param integer Flag * @param integer User id * @return void No return value, but echoes results */ function HotPotGCt($folder, $flag, $user_id) { // Garbage Collector $filelist = array(); if ($dir = @opendir($folder)) { while (($file = readdir($dir)) !== false) { if ($file != '.') { if ($file != '..') { $full_name = $folder . '/' . $file; if (is_dir($full_name)) { HotPotGCt($folder . '/' . $file, $flag, $user_id); } else { $filelist[] = $file; } } } } closedir($dir); } while (list($key, $val) = each($filelist)) { if (stristr($val, $user_id . '.t.html')) { if ($flag == 1) { FileManager::my_delete($folder . '/' . $val); } else { echo $folder . '/' . $val . '<br />'; } } } }