diff --git a/main/newscorm/learnpath.class.php b/main/newscorm/learnpath.class.php
index 1a787fbae8..d2d82ba302 100644
--- a/main/newscorm/learnpath.class.php
+++ b/main/newscorm/learnpath.class.php
@@ -7497,9 +7497,10 @@ function display_thread_form($action = 'add', $id = 0, $extra_info = '')
//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;
+ $tmp_file_path = $garbage_path.$temp_dir_short.'/'.$my_file_path;
+ $res = file_put_contents($tmp_file_path,$contents);
+ if($res === false){error_log('Could not write into file '.$tmp_file_path.' '.__FILE__.' '.__LINE__,0);}
+ $files_cleanup[] = $tmp_file_path;
//error_log($tmp_path);die();
$my_xml_file_path = htmlentities($my_file_path);
$my_sub_dir = dirname($my_file_path);
@@ -7517,7 +7518,141 @@ function display_thread_form($action = 'add', $id = 0, $extra_info = '')
$my_file = $xmldoc->createElement('file');
$my_file->setAttribute('href',$my_xml_file_path);
$my_resource->appendChild($my_file);
+
+ //get included docs
+ $inc_docs = $item->get_resources_from_source(null,$tmp_file_path);
+ //dependency to other files - not yet supported
+ $i = 1;
+ foreach($inc_docs as $doc_info)
+ {
+ if(count($doc_info)<1 or empty($doc_info[0])){continue;}
+ $my_dep = $xmldoc->createElement('resource');
+ $res_id = 'RESOURCE_'.$item->get_id().'_'.$i;
+ $my_dep->setAttribute('identifier',$res_id);
+ $my_dep->setAttribute('type','webcontent');
+ $my_dep->setAttribute('adlcp:scormtype','asset');
+ $my_dep_file = $xmldoc->createElement('file');
+ //check type of URL
+ //error_log('Now dealing with '.$doc_info[0].' of type '.$doc_info[1].'-'.$doc_info[2],0);
+ if($doc_info[1] == 'remote')
+ { //remote file. Save url as is
+ $my_dep_file->setAttribute('href',$doc_info[0]);
+ $my_dep->setAttribute('xml:base','');
+ }elseif($doc_info[1] == 'local'){
+ switch($doc_info[2])
+ {
+ case 'url': //local URL - save path as url for now, don't zip file
+ $my_dep_file->setAttribute('href',$doc_info[0]);
+ $my_dep->setAttribute('xml:base','');
+ //save file but as local file (retrieve from URL)
+ $abs_path = api_get_path(SYS_PATH).str_replace(api_get_path(WEB_PATH),'',$doc_info[0]);
+ $current_dir = dirname($abs_path);
+ $file_path = realpath($abs_path);
+ if(strstr($file_path,$main_path) !== false)
+ {//the calculated real path is really inside the dokeos root path
+ //reduce file path to what's under the DocumentRoot
+ $file_path = substr($file_path,strlen($root_path));
+ //echo $file_path;echo '
';
+ //error_log('Reduced path: '.$file_path,0);
+ $zip_files_abs[] = $file_path;
+ $link_updates[$my_file_path][] = array('orig'=>$doc_info[0],'dest'=>'document/'.$file_path);
+ $my_dep_file->setAttribute('href','document/'.$file_path);
+ $my_dep->setAttribute('xml:base','');
+ }
+ else if (empty($file_path))
+ {
+ /*$document_root = substr(api_get_path(SYS_PATH), 0, strpos(api_get_path(SYS_PATH),api_get_path(REL_PATH)));
+ if(strpos($document_root,-1)=='/')
+ {
+ $document_root = substr(0, -1, $document_root);
+ }*/
+ $file_path = $_SERVER['DOCUMENT_ROOT'].$abs_path;
+ $file_path = str_replace('//','/',$file_path);
+ if(file_exists($file_path))
+ {
+ $file_path = substr($file_path,strlen($current_dir)); // we get the relative path
+ $zip_files[] = $my_sub_dir.'/'.$file_path;
+ $link_updates[$my_file_path][] = array('orig'=>$doc_info[0],'dest'=>'document/'.$file_path);
+ $my_dep_file->setAttribute('href','document/'.$file_path);
+ $my_dep->setAttribute('xml:base','');
+ }
+ }
+ break;
+ case 'abs': //absolute path from DocumentRoot. Save file and leave path as is in the zip
+ $my_dep_file->setAttribute('href',$doc_info[0]);
+ $my_dep->setAttribute('xml:base','');
+
+ $current_dir = dirname($current_course_path.'/'.$item->get_file_path()).'/';
+
+ $file_path = realpath($doc_info[0]);
+
+ if(strstr($file_path,$main_path) !== false)
+ {//the calculated real path is really inside the dokeos root path
+ //reduce file path to what's under the DocumentRoot
+ $file_path = substr($file_path,strlen($root_path));
+ //echo $file_path;echo '
';
+ //error_log('Reduced path: '.$file_path,0);
+ $zip_files_abs[] = $file_path;
+ $link_updates[$my_file_path][] = array('orig'=>$doc_info[0],'dest'=>$file_path);
+ $my_dep_file->setAttribute('href','document/'.$file_path);
+ $my_dep->setAttribute('xml:base','');
+ }
+ else if (empty($file_path))
+ {
+ /*$document_root = substr(api_get_path(SYS_PATH), 0, strpos(api_get_path(SYS_PATH),api_get_path(REL_PATH)));
+ if(strpos($document_root,-1)=='/')
+ {
+ $document_root = substr(0, -1, $document_root);
+ }*/
+ $file_path = $_SERVER['DOCUMENT_ROOT'].$doc_info[0];
+ $file_path = str_replace('//','/',$file_path);
+ if(file_exists($file_path))
+ {
+ $file_path = substr($file_path,strlen($current_dir)); // we get the relative path
+ $zip_files[] = $my_sub_dir.'/'.$file_path;
+ $link_updates[$my_file_path][] = array('orig'=>$doc_info[0],'dest'=>$file_path);
+ $my_dep_file->setAttribute('href','document/'.$file_path);
+ $my_dep->setAttribute('xml:base','');
+ }
+ }
+ break;
+ case 'rel': //path relative to the current document. Save xml:base as current document's directory and save file in zip as subdir.file_path
+ if(substr($doc_info[0],0,2)=='..')
+ { //relative path going up
+ $current_dir = dirname($current_course_path.'/'.$item->get_file_path()).'/';
+ $file_path = realpath($current_dir.$doc_info[0]);
+ //error_log($file_path.' <-> '.$main_path,0);
+ if(strstr($file_path,$main_path) !== false)
+ {//the calculated real path is really inside the dokeos root path
+ //reduce file path to what's under the DocumentRoot
+ $file_path = substr($file_path,strlen($root_path));
+ //error_log('Reduced path: '.$file_path,0);
+ $zip_files_abs[] = $file_path;
+ $link_updates[$my_file_path][] = array('orig'=>$doc_info[0],'dest'=>$file_path);
+ $my_dep_file->setAttribute('href','document/'.$file_path);
+ $my_dep->setAttribute('xml:base','');
+ }
+ }else{
+ $zip_files[] = $my_sub_dir.'/'.$doc_info[0];
+ $my_dep_file->setAttribute('href',$doc_info[0]);
+ $my_dep->setAttribute('xml:base',$my_xml_sub_dir);
+ }
+ break;
+ default:
+ $my_dep_file->setAttribute('href',$doc_info[0]);
+ $my_dep->setAttribute('xml:base','');
+ break;
+ }
+ }
+ $my_dep->appendChild($my_dep_file);
+ $resources->appendChild($my_dep);
+ $dependency = $xmldoc->createElement('dependency');
+ $dependency->setAttribute('identifierref',$res_id);
+ $my_resource->appendChild($dependency);
+ $i++;
+ }
$resources->appendChild($my_resource);
+ $zip_files[] = $my_file_path;
}
else
diff --git a/main/newscorm/learnpathItem.class.php b/main/newscorm/learnpathItem.class.php
index 947dcec6ee..b8afe2b531 100644
--- a/main/newscorm/learnpathItem.class.php
+++ b/main/newscorm/learnpathItem.class.php
@@ -523,7 +523,9 @@ class learnpathItem{
$type = $this->get_type();
switch($type)
{
- case TOOL_DOCUMENT : case 'sco':
+ case TOOL_DOCUMENT :
+ case TOOL_QUIZ:
+ case 'sco':
//get the document and, if HTML, open it
if(is_file($abs_path))
@@ -539,23 +541,6 @@ class learnpathItem{
case 'css':
$wanted_attributes = array('src','url','@import','href','value');
//parse it for included resources
- /*
- $fh = fopen($abs_path,'r');
- if($fh !== false)
- {
- while($line = fread($fh,1024))
- {
- if(preg_match('expression',$line))
- {
- //do something
- }
- }
- $close = fclose($fh);
- if($close === false)
- {
- //do nothing yet
- }
- }*/
$file_content = file_get_contents($abs_path);
//get an array of attributes from the HTML source
$attributes = learnpathItem::parse_HTML_attributes($file_content,$wanted_attributes);
@@ -569,7 +554,11 @@ class learnpathItem{
foreach($sources as $source)
{
-
+ //skip what is obviously not a resource
+ if(strpos($source,"+this.")) continue; //javascript code - will still work unaltered
+ if(!strpos($source,'.')) continue; //no dot, should not be an external file anyway
+ if(strpos($source,'mailto:')) continue; //mailto link
+ if(strpos($source,';')) continue; //avoid code - that should help
if($attr == 'value')
{
if(strpos($source , 'mp3file'))
@@ -582,10 +571,10 @@ class learnpathItem{
$files_list[] = array($mp3file,'local','rel');
}
}
- if(strstr($source,'://') > 0)
+ if(strpos($source,'://') > 0)
{
//found some protocol there
- if(strstr($source,api_get_path(WEB_PATH))!==false)
+ if(strpos($source,api_get_path(WEB_PATH))!==false)
{
//we found the current portal url
$files_list[] = array($source,'local','url');
@@ -655,8 +644,6 @@ class learnpathItem{
return false;
}
break;
- case TOOL_QUIZ:
- break;
default: //ignore
break;
}