[svn r11750] Including files recursively (a limit should probably be set as to what maximum level of recursivity is allowed)

skala
Yannick Warnier 19 years ago
parent 530797b472
commit 972dae8df1
  1. 29
      main/newscorm/learnpathItem.class.php

@ -464,18 +464,27 @@ class learnpathItem{
* The list will generally include pictures, flash objects, java applets, or any other * The list will generally include pictures, flash objects, java applets, or any other
* stuff included in the source of the current item. The current item is expected * stuff included in the source of the current item. The current item is expected
* to be an HTML file. If it is not, then the function will return and empty list. * to be an HTML file. If it is not, then the function will return and empty list.
* @param string type (one of the Dokeos tools) - optional (otherwise takes the current item's type)
* @param string path (absolute file path) - optional (otherwise takes the current item's path)
* @return array List of file paths. An additional field containing 'local' or 'remote' helps determine if the file should be copied into the zip or just linked * @return array List of file paths. An additional field containing 'local' or 'remote' helps determine if the file should be copied into the zip or just linked
*/ */
function get_resources_from_source() function get_resources_from_source($type=null,$abs_path=null)
{ {
if(!isset($type))
{
$type = $this->get_type();
}
if(!isser($abs_path))
{
$path = $this->get_file_path();
$abs_path = api_get_path(SYS_COURSE_PATH).api_get_course_path().'/'.$path;
}
$files_list = array(); $files_list = array();
$type = $this->get_type(); $type = $this->get_type();
switch($type) switch($type)
{ {
case TOOL_DOCUMENT: case TOOL_DOCUMENT:
//get the document and, if HTML, open it //get the document and, if HTML, open it
$path = $this->get_file_path();
$abs_path = api_get_path(SYS_COURSE_PATH).api_get_course_path().'/'.$path;
if(is_file($abs_path)) if(is_file($abs_path))
{ {
//for now, read the whole file in one go (that's gonna be a problem when the file is too big) //for now, read the whole file in one go (that's gonna be a problem when the file is too big)
@ -507,7 +516,7 @@ class learnpathItem{
}*/ }*/
$file_content = file_get_contents($abs_path); $file_content = file_get_contents($abs_path);
//get an array of attributes from the HTML source //get an array of attributes from the HTML source
$attributes = $this->parse_HTML_attributes($file_content,$wanted_attributes); $attributes = learnpathItem::parse_HTML_attributes($file_content,$wanted_attributes);
//look at 'src' attributes in this file //look at 'src' attributes in this file
if(isset($attributes['src'])) if(isset($attributes['src']))
{ {
@ -522,6 +531,8 @@ class learnpathItem{
{ {
//we found the current portal url //we found the current portal url
$files_list[] = array($source,'local','url'); $files_list[] = array($source,'local','url');
$in_files_list[] = learnpathItem::get_resources_from_source(TOOL_DOCUMENT,$source);
$files_list = array_merge($files_list,$in_files_list);
} }
else else
{ {
@ -535,14 +546,24 @@ class learnpathItem{
if(strstr($source,'/') === 0) if(strstr($source,'/') === 0)
{ //link starts with a /, making it absolute (relative to DocumentRoot) { //link starts with a /, making it absolute (relative to DocumentRoot)
$files_list[] = array($source,'local','abs'); $files_list[] = array($source,'local','abs');
$in_files_list[] = learnpathItem::get_resources_from_source(TOOL_DOCUMENT,$source);
$files_list = array_merge($files_list,$in_files_list);
} }
elseif(strstr($source,'..') === 0) elseif(strstr($source,'..') === 0)
{ //link is relative but going back in the hierarchy { //link is relative but going back in the hierarchy
$files_list[] = array($source,'local','rel'); $files_list[] = array($source,'local','rel');
$dir = dirname($abs_path);
$new_abs_path = realpath($dir.'/'.$source);
$in_files_list[] = learnpathItem::get_resources_from_source(TOOL_DOCUMENT,$new_abs_path);
$files_list = array_merge($files_list,$in_files_list);
} }
else else
{ //no starting '/', making it relative to current document's path { //no starting '/', making it relative to current document's path
$files_list[] = array($source,'local','rel'); $files_list[] = array($source,'local','rel');
$dir = dirname($abs_path);
$new_abs_path = realpath($dir.'/'.$source);
$in_files_list[] = learnpathItem::get_resources_from_source(TOOL_DOCUMENT,$new_abs_path);
$files_list = array_merge($files_list,$in_files_list);
} }
} }
} }

Loading…
Cancel
Save