From 08f74e2fa5d2d9d6bab5d56382047eb721eb5fc1 Mon Sep 17 00:00:00 2001 From: Yannick Warnier Date: Mon, 24 Sep 2007 09:06:24 +0200 Subject: [PATCH] [svn r13205] First "running" version of SCORM quiz export. Still needs some improvements in JavaScript and formatting code. --- main/newscorm/learnpath.class.php | 89 +++++++++++++++++++++++++++++-- 1 file changed, 84 insertions(+), 5 deletions(-) diff --git a/main/newscorm/learnpath.class.php b/main/newscorm/learnpath.class.php index b9d5973fdf..9609fa8376 100644 --- a/main/newscorm/learnpath.class.php +++ b/main/newscorm/learnpath.class.php @@ -7105,12 +7105,15 @@ function display_thread_form($action = 'add', $id = 0, $extra_info = '') return null; } //Create the zip handler (this will remain available throughout the method) + $garbage_path = api_get_path(GARBAGE_PATH); + $sys_course_path = api_get_path(SYS_COURSE_PATH); $temp_dir_short = uniqid(); - $temp_zip_dir = api_get_path(GARBAGE_PATH)."/".$temp_dir_short; + $temp_zip_dir = $garbage_path."/".$temp_dir_short; $temp_zip_file = $temp_zip_dir."/".md5(time()).".zip"; $zip_folder=new PclZip($temp_zip_file); $current_course_path = api_get_path(SYS_COURSE_PATH).api_get_course_path(); $root_path = $main_path = api_get_path(SYS_PATH); + $files_cleanup = array(); //place to temporarily stash the zipfiles //create the temp dir if it doesn't exist //or do a cleanup befor creating the zipfile @@ -7431,6 +7434,80 @@ function display_thread_form($action = 'add', $id = 0, $extra_info = '') $resources->appendChild($my_resource); } } + elseif($item->type == TOOL_QUIZ) + { + require_once(api_get_path(SYS_CODE_PATH).'exercice/exercise.class.php'); + $exe_id = $item->path; //should be using ref when everything will be cleaned up in this regard + $exe = new Exercise(); + $exe->read($exe_id); + $my_item = $xmldoc->createElement('item'); + $my_item->setAttribute('identifier','ITEM_'.$item->get_id()); + $my_item->setAttribute('identifierref','RESOURCE_'.$item->get_id()); + $my_item->setAttribute('isvisible','true'); + //give a child element to the <item> element + $my_title = $xmldoc->createElement('title',htmlspecialchars($item->get_title(),ENT_QUOTES)); + $my_item->appendChild($my_title); + //give a child element <adlcp:prerequisite> to the <item> element + $my_prereqs = $xmldoc->createElement('adlcp:prerequisite',$item->get_prereq_string()); + $my_prereqs->setAttribute('type','aicc_script'); + $my_item->appendChild($my_prereqs); + //give a child element <adlcp:masteryscore> to the <item> element + $my_masteryscore = $xmldoc->createElement('adlcp:masteryscore',$item->masteryscore); + $my_item->appendChild($my_masteryscore); + + //attach this item to the organization element or hits parent if there is one + if(!empty($item->parent) && $item->parent!=0) + { + $children = $organization->childNodes; + for($i=0;$i<$children->length;$i++){ + $item_temp = $children->item($i); + if ($item_temp -> nodeName == 'item') + { + if($item_temp->getAttribute('identifier') == 'ITEM_'.$item->parent) + { + $item_temp -> appendChild($my_item); + } + + } + } + } + else + { + $organization->appendChild($my_item); + } + + //include export scripts + require_once(api_get_path(SYS_CODE_PATH).'exercice/export/scorm/scorm_export.php'); + + //get the path of the file(s) from the course directory root + //$my_file_path = $item->get_file_path('scorm/'.$this->path.'/'); + $my_file_path = 'quiz_'.$item->get_id().'.html'; + //write the contents of the exported exercise into a (big) html file + //to later pack it into the exported SCORM. The file will be removed afterwards + $contents = export_exercise($exe_id,true); + $res = file_put_contents($garbage_path.$temp_dir_short.'/'.$my_file_path,$contents); + if($res === false){error_log('Could not write into file '.$garbage_path.$temp_dir_short.'/'.$my_file_path.' '.__FILE__.' '.__LINE__,0);} + $files_cleanup[] = $garbage_path.$temp_dir_short.'/'.$my_file_path; + //error_log($tmp_path);die(); + $my_xml_file_path = htmlentities($my_file_path); + $my_sub_dir = dirname($my_file_path); + $my_xml_sub_dir = htmlentities($my_sub_dir); + //give a <resource> child to the <resources> element + $my_resource = $xmldoc->createElement('resource'); + $my_resource->setAttribute('identifier','RESOURCE_'.$item->get_id()); + $my_resource->setAttribute('type','webcontent'); + $my_resource->setAttribute('href',$my_xml_file_path); + //adlcp:scormtype can be either 'sco' or 'asset' + $my_resource->setAttribute('adlcp:scormtype','sco'); + //xml:base is the base directory to find the files declared in this resource + $my_resource->setAttribute('xml:base',''); + //give a <file> child to the <resource> element + $my_file = $xmldoc->createElement('file'); + $my_file->setAttribute('href',$my_xml_file_path); + $my_resource->appendChild($my_file); + $resources->appendChild($my_resource); + + } else { @@ -7463,9 +7540,6 @@ function display_thread_form($action = 'add', $id = 0, $extra_info = '') $xmldoc->appendChild($root); //error_log(print_r($zip_files,true),0); - $garbage_path = api_get_path(GARBAGE_PATH); - $sys_course_path = api_get_path(SYS_COURSE_PATH); - foreach($zip_files as $file_path) { if(empty($file_path)){continue;} @@ -7556,7 +7630,12 @@ EOD; $zip_folder->add($garbage_path.'/'.$temp_dir_short, PCLZIP_OPT_REMOVE_PATH, $garbage_path); - + //clean possible temporary files + foreach($files_cleanup as $file) + { + $res = unlink($file); + if($res === false){error_log('Could not delete temp file '.$file.' '.__FILE__.' '.__LINE__,0);} + } //Send file to client $name = 'scorm_export_'.$this->lp_id.'.zip'; DocumentManager::file_send_for_download($temp_zip_file,true,$name);