";
*/
}
/**
* Displays the form where course admins can specify wether uploaded documents
* are visible or invisible by default.
*
* @param $uploadvisibledisabled
* @param $origin
*/
function display_default_visibility_form($uploadvisibledisabled)
{
?>
/>
/>
, Ghent University
* @version march 2006
*/
function display_user_link($user_id, $name='')
{
global $_otherusers;
if ($user_id<>0)
{
if ($name=='')
{
$table_user = Database::get_main_table(TABLE_MAIN_USER);
$sql="SELECT * FROM $table_user WHERE user_id='".Database::escape_string($user_id)."'";
$result=api_sql_query($sql,__FILE__,__LINE__);
$row=mysql_fetch_array($result);
return "".$row['firstname']." ".$row['lastname']."";
}
else
{
return "".$name."";
}
}
else
{
return $name.' ('.get_lang('Anonymous').')';
}
}
/**
* Display the list of student publications, taking into account the user status
*
* @param $currentCourseRepositoryWeb, the web location of the course folder
* @param $link_target_parameter - should there be a target parameter for the links
* @param $dateFormatLong - date format
* @param $origin - typically empty or 'learnpath'
*/
function display_student_publications_list($work_dir,$sub_course_dir,$currentCourseRepositoryWeb, $link_target_parameter, $dateFormatLong, $origin)
{
global $charset;
// Database table names
$work_table = Database::get_course_table(TABLE_STUDENT_PUBLICATION);
$iprop_table = Database::get_course_table(TABLE_ITEM_PROPERTY);
$is_allowed_to_edit = api_is_allowed_to_edit();
$user_id = api_get_user_id();
$publications_list = array();
$sort_params = array();
if( isset($_GET['column']))
{
$sort_params[] = 'column='.Security::remove_XSS($_GET['column']);
}
if( isset($_GET['page_nr']))
{
$sort_params[] = 'page_nr='.Security::remove_XSS($_GET['page_nr']);
}
if( isset($_GET['per_page']))
{
$sort_params[] = 'per_page='.Security::remove_XSS($_GET['per_page']);
}
if( isset($_GET['direction']))
{
$sort_params[] = 'direction='.Security::remove_XSS($_GET['direction']);
}
$sort_params = implode('&',$sort_params);
$origin=Security::remove_XSS($origin);
if(substr($sub_course_dir,-1,1)!='/' && !empty($sub_course_dir))
{
$sub_course_dir = $sub_course_dir.'/';
}
if($sub_course_dir == '/')
{
$sub_course_dir='';
}
//Get list from database
if($is_allowed_to_edit)
{
$sql_get_publications_list = "SELECT * " .
"FROM ".$work_table." " .
"WHERE url LIKE BINARY '$sub_course_dir%' " .
"AND url NOT LIKE BINARY '$sub_course_dir%/%' " .
"ORDER BY id";
$sql_get_publications_num = "SELECT count(*) " .
"FROM ".$work_table." " .
"WHERE url LIKE BINARY '$sub_course_dir%' " .
"AND url NOT LIKE BINARY '$sub_course_dir%/%' " .
"ORDER BY id";
}
else
{
if (!empty($_SESSION['toolgroup']))
{
$group_query = " WHERE post_group_id = '".$_SESSION['toolgroup']."' "; // set to select only messages posted by the user's group
$subdirs_query = "AND url NOT LIKE BINARY '$sub_course_dir%/%' AND url LIKE BINARY '$sub_course_dir%'";
}
else
{
$group_query = '';
$subdirs_query = "WHERE url NOT LIKE '$sub_course_dir%/%' AND url LIKE '$sub_course_dir%'";
}
$sql_get_publications_list = "SELECT * FROM $work_table $group_query $subdirs_query ORDER BY id";
$sql_get_publications_num = "SELECT count(url) " .
"FROM ".$work_table." " .
"WHERE url LIKE BINARY '$sub_course_dir%' " .
"AND url NOT LIKE BINARY '$sub_course_dir%/%' " .
"ORDER BY id";
}
$sql_result = api_sql_query($sql_get_publications_list,__FILE__,__LINE__);
$sql_result_num = api_sql_query($sql_get_publications_num,__FILE__,__LINE__);
$row=Database::fetch_array($sql_result_num);
$count_files=$row[0];
$table_header[] = array(get_lang('Type'),true,'style="width:40px"');
$table_header[] = array(get_lang('Title'),true);
if ($count_files!=0)
{
$table_header[] = array(get_lang('Authors'),true);
}
$table_header[] = array(get_lang('Date'),true);
if( $is_allowed_to_edit)
{
$table_header[] = array(get_lang('Modify'),true);
}
$table_header[] = array('RealDate',false);
// An array with the setting of the columns -> 1: columns that we will show, 0:columns that will be hide
$column_show[]=1; // type
$column_show[]=1; // title
if ($count_files!=0)
{
$column_show[]=1; // authors
}
$column_show[]=1; //date
if( $is_allowed_to_edit)
{
$column_show[]=1; //modify
}
$column_show[]=0; //real date in correct format
// Here we change the way how the colums are going to be sort
// in this case the the column of LastResent ( 4th element in $column_header) we will be order like the column RealDate
// because in the column RealDate we have the days in a correct format "2008-03-12 10:35:48"
$column_order[]=1; //type
$column_order[]=2; // title
if ($count_files!=0)
{
$column_order[]=3; //authors
}
$column_order[]=6; // date
if( $is_allowed_to_edit)
{
$column_order[]=5;
}
$column_order[]=6;
$table_data = array();
$dirs_list = get_subdirs_list($work_dir);
$my_sub_dir = str_replace('work/','',$sub_course_dir);
// List of all folders
foreach($dirs_list as $dir)
{
if ($my_sub_dir=='')
{
$mydir_temp = '/'.$dir;
}
else
{
$mydir_temp = '/'.$my_sub_dir.$dir;
}
// select the directory's date
/*$sql_select_directory= "SELECT sent_date FROM ".$work_table." WHERE " .
"url LIKE BINARY '".$mydir_temp."' AND filetype = 'folder'";
*/
$sql_select_directory= "SELECT prop.lastedit_date, author FROM ".$iprop_table." prop INNER JOIN ".$work_table." work ON (prop.ref=work.id) WHERE " .
"work.url LIKE BINARY '".$mydir_temp."' AND work.filetype = 'folder' AND prop.tool='work' ";
$result=api_sql_query($sql_select_directory,__FILE__,__LINE__);
$row=Database::fetch_array($result);
$direc_date= $row['lastedit_date']; //directory's date
$author= $row['author']; //directory's author
$mydir = $my_sub_dir.$dir;
if ($is_allowed_to_edit)
{
$clean_edit_dir=Security :: remove_XSS(Database::escape_string($_GET['edit_dir']));
// form edit directory
if(isset($clean_edit_dir) && $clean_edit_dir==$mydir)
{
$form_folder = new FormValidator('edit_dir', 'post', api_get_self().'?curdirpath='.$my_sub_dir.'&origin='.$origin.'&edit_dir='.$mydir);
$group_name[] = FormValidator :: createElement('text','dir_name');
$group_name[] = FormValidator :: createElement('submit','submit_edit_dir',get_lang('Ok'));
$form_folder -> addGroup($group_name,'my_group');
$form_folder -> addGroupRule('my_group',get_lang('ThisFieldIsRequired'),'required');
$form_folder -> setDefaults(array('my_group[dir_name]'=>$dir));
$display_edit_form=true;
if($form_folder -> validate())
{
$values = $form_folder -> exportValues();
$values = $values['my_group'];
update_dir_name($mydir,$values['dir_name']);
$mydir = $my_sub_dir.$values['dir_name'];
$dir = $values['dir_name'];
$display_edit_form=false;
}
}
}
$action = '';
$row = array();
$class = '';
$row[] = ''; //image
$a_count_directory=count_dir($work_dir.'/'.$dir,false);
$cant_files=$a_count_directory[0];
$cant_dir=$a_count_directory[1];
$text_file=get_lang('FilesUpload');
$text_dir=get_lang('Directories');
if ($cant_files==1)
{
$text_file=strtolower(get_lang('FileUpload'));
}
if ($cant_dir==1)
{
$text_dir=get_lang('directory');
}
if ($cant_dir!=0)
{
$dirtext=' ('.$cant_dir.' '.$text_dir.')';
}
else
{
$dirtext='';
}
if($display_edit_form && isset($clean_edit_dir) && $clean_edit_dir==$mydir)
{
$row[] = ''.$dir.''.$form_folder->toHtml(); // form to edit the directory's name
}
else
{
$row[] = ''.$dir.' '.$cant_files.' '.$text_file.$dirtext;
}
if ($count_files!=0)
{
$row[] = "";
}
if ($direc_date!='' && $direc_date!='0000-00-00 00:00:00')
{
$row[]= date_to_str_ago($direc_date).' '.$direc_date.'';
}
else
{
$row[]='';
}
if( $is_allowed_to_edit)
{
$action .= '';
$action .= '';
$row[] = $action;
}
else
{
$row[] = "";
}
$table_data[] = $row;
}
while( $work = mysql_fetch_object($sql_result))
{
//Get the author ID for that document from the item_property table
$is_author = false;
$author_sql = "SELECT * FROM $iprop_table WHERE tool = 'work' AND insert_user_id='$user_id' AND ref=".$work->id;
$author_qry = api_sql_query($author_sql,__FILE__,__LINE__);
if(Database::num_rows($author_qry)==1)
{
$is_author = true;
}
//display info depending on the permissions
if( $work->accepted == '1' || $is_allowed_to_edit)
{
$row = array();
if($work->accepted == '0')
{
$class='class="invisible"';
}
else
{
$class='';
}
$url = implode("/", array_map("rawurlencode", explode("/", $work->url)));
$row[]= build_document_icon_tag('file',$work->url);
$row[]= ''.$work->title.' '.$work->description;
$row[]= display_user_link($user_id,$work->author);// $work->author;
$row[]= date_to_str_ago($work->sent_date).' '.$work->sent_date.'';
if( $is_allowed_to_edit)
{
$action = '';
$action .= '';
$action .= '';
$action .= '';
if($work->accepted == '1')
{
$action .= '';
}
else
{
$action .= '';
}
$row[] = $action;
}
elseif($is_author)
{
$action = '';
$action .= '';
$action .= '';
$row[] = $action;
}
else
{
$row[] = " ";
}
$table_data[] = $row;
}
}
$sorting_options=array();
$sorting_options['column']=1;
$paging_options=array();
Display::display_sortable_config_table($table_header,$table_data,$sorting_options, $paging_options,NULL,$column_show,$column_order);
}
/**
* Returns a list of subdirectories found in the given directory.
*
* The list return starts from the given base directory.
* If you require the subdirs of /var/www/ (or /var/www), you will get 'abc/', 'def/', but not '/var/www/abc/'...
* @param string Base dir
* @param integer 0 if we only want dirs from this level, 1 if we want to recurse into subdirs
* @return strings_array The list of subdirs in 'abc/' form, -1 on error, and 0 if none found
* @todo Add a session check to see if subdirs_list doesn't exist yet (cached copy)
*/
function get_subdirs_list($basedir='',$recurse=0){
//echo "Looking for subdirs of $basedir";
if(empty($basedir) or !is_dir($basedir)){return -1;}
if(substr($basedir,-1,1)!='/'){$basedir = $basedir.'/';}
$dirs_list = array();
$dh = opendir($basedir);
while($entry = readdir($dh)){
if(is_dir($basedir.$entry) && $entry!='..' && $entry!='.'){
$dirs_list[] = $entry;
if($recurse==1){
foreach(get_subdirs_list($basedir.$entry) as $subdir){
$dirs_list[] = $entry.'/'.$subdir;
}
}
}
}
closedir($dh);
return $dirs_list;
}
/**
* Builds the form thats enables the user to
* select a directory to browse/upload in
* This function has been copied from the document/document.inc.php library
*
* @param array $folders
* @param string $curdirpath
* @param string $group_dir
* @return string html form
*/
function build_work_directory_selector($folders,$curdirpath,$group_dir='')
{
$form = '';
return $form;
}
/**
* Builds the form thats enables the user to
* move a document from one directory to another
* This function has been copied from the document/document.inc.php library
*
* @param array $folders
* @param string $curdirpath
* @param string $move_file
* @return string html form
*/
function build_work_move_to_selector($folders,$curdirpath,$move_file,$group_dir='')
{
$form = '';
return $form;
}
/**
* Checks if the first given directory exists as a subdir of the second given directory
* This function should now be deprecated by Security::check_abs_path()
* @param string Subdir
* @param string Base dir
* @return integer -1 on error, 0 if not subdir, 1 if subdir
*/
function is_subdir_of($subdir,$basedir){
if(empty($subdir) or empty($basedir)){return -1;}
if(substr($basedir,-1,1)!='/'){$basedir=$basedir.'/';}
if(substr($subdir,0,1)=='/'){$subdir = substr($subdir,1);}
if(is_dir($basedir.$subdir)){
return 1;
}else{
return 0;
}
}
/**
* creates a new directory trying to find a directory name
* that doesn't already exist
* (we could use unique_name() here...)
*
* @author Hugues Peeters
* @author Bert Vanderkimpen
* @author Yannick Warnier Adaptation for work tool
* @param string Base work dir (.../work)
* @param string $desiredDirName complete path of the desired name
* @return string actual directory name if it succeeds,
* boolean false otherwise
*/
function create_unexisting_work_directory($base_work_dir,$desired_dir_name)
{
$nb = '';
$base_work_dir = (substr($base_work_dir,-1,1)=='/'?$base_work_dir:$base_work_dir.'/');
while ( file_exists($base_work_dir.$desired_dir_name.$nb) )
{
$nb += 1;
}
//echo "creating ".$base_work_dir.$desired_dir_name.$nb."#...";
$perm = api_get_setting('permissions_for_new_directories');
$perm = octdec(!empty($perm)?$perm:'0770');
if ( mkdir($base_work_dir.$desired_dir_name.$nb, $perm))
{
chmod($base_work_dir.$desired_dir_name.$nb, $perm);
return $desired_dir_name.$nb;
}
else
{
return false;
}
}
/**
* Delete a work-tool directory
* @param string Base "work" directory for this course as /var/www/dokeos/courses/ABCD/work/
* @param string The directory name as the bit after "work/", without trailing slash
* @return integer -1 on error
*/
function del_dir($base_work_dir,$dir)
{
if(empty($dir) or $dir=='/'){return -1;}//not authorized
//escape hacks
/*
$dir = str_replace('../','',$dir);
$dir = str_replace('..','',$dir);
$dir = str_replace('./','',$dir);
$dir = str_replace('.','',$dir);
*/
$check = Security::check_abs_path($base_work_dir.$dir,$base_work_dir);
if (!$check || !is_dir($base_work_dir.$dir)) return -1;
$table = Database::get_course_table(TABLE_STUDENT_PUBLICATION);
$sql = "DELETE FROM $table WHERE url LIKE BINARY 'work/".$dir."/%'";
$res = api_sql_query($sql,__FILE__,__LINE__);
//delete from DB the directories
$sql = "DELETE FROM $table WHERE filetype = 'folder' AND url LIKE BINARY '/".$dir."%'";
$res = api_sql_query($sql,__FILE__,__LINE__);
require_once(api_get_path(LIBRARY_PATH).'/fileManage.lib.php');
my_delete($base_work_dir.$dir);
}
/**
* Get the path of a document in the student_publication table (path relative to the course directory)
* @param integer Element ID
* @return string Path (or -1 on error)
*/
function get_work_path($id){
$table = Database::get_course_table(TABLE_STUDENT_PUBLICATION);
$sql = "SELECT * FROM $table WHERE id=$id";
$res = api_sql_query($sql);
if(Database::num_rows($res)!=1){
return -1;
}else{
$row = Database::fetch_array($res);
return $row['url'];
}
}
/**
* Update the url of a work in the student_publication table
* @param integer ID of the work to update
* @param string Destination directory where the work has been moved (must end with a '/')
* @return -1 on error, sql query result on success
*/
function update_work_url($id,$new_path)
{
if(empty($id)) return -1;
$table = Database::get_course_table(TABLE_STUDENT_PUBLICATION);
$sql = "SELECT * FROM $table WHERE id=$id";
$res = api_sql_query($sql);
if(Database::num_rows($res)!=1){
return -1;
}else{
$row = Database::fetch_array($res);
$filename = basename($row['url']);
$new_url = $new_path.$filename;
$sql2 = "UPDATE $table SET url = '$new_url' WHERE id=$id";
$res2 = api_sql_query($sql2);
return $res2;
}
}
/**
* Update the url of a dir in the student_publication table
* @param string old path
* @param string new path
*/
function update_dir_name($path, $new_name)
{
global $base_work_dir;
include_once(api_get_path(LIBRARY_PATH) . "/fileManage.lib.php");
include_once(api_get_path(LIBRARY_PATH) . "/fileUpload.lib.php");
$path_to_dir = dirname($path);
if($path_to_dir=='.')
{
$path_to_dir = '';
}
else
{
$path_to_dir .= '/';
}
my_rename($base_work_dir.'/'.$path,$new_name);
$table = Database::get_course_table(TABLE_STUDENT_PUBLICATION);
//update all the files in the other directories according with the next query
$sql = 'SELECT id, url FROM '.$table.' WHERE url LIKE BINARY "work/'.$path.'/%"'; // like binary (Case Sensitive)
$rs = api_sql_query($sql, __FILE__, __LINE__);
$work_len=strlen('work/'.$path);
while($work = Database :: fetch_array($rs))
{
$new_dir=$work['url'];
$name_with_directory=substr($new_dir,$work_len,strlen($new_dir));
$sql = 'UPDATE '.$table.' SET url="work/'.$path_to_dir.$new_name.$name_with_directory.'" WHERE id= '.$work['id'];
api_sql_query($sql, __FILE__, __LINE__);
}
//update all the directory's children according with the next query
$sql = 'SELECT id, url FROM '.$table.' WHERE url LIKE BINARY "/'.$path.'%"';
$rs = api_sql_query($sql, __FILE__, __LINE__);
$work_len=strlen('/'.$path);
while($work = Database :: fetch_array($rs))
{
$new_dir=$work['url'];
$name_with_directory=substr($new_dir,$work_len,strlen($new_dir));
$sql = 'UPDATE '.$table.' SET url="/'.$path_to_dir.$new_name.$name_with_directory.'" WHERE id= '.$work['id'];
api_sql_query($sql, __FILE__, __LINE__);
}
}
/**
* Return an array with all the folder's ids that are in the given path
* @param string Path of the directory
* @return array The list of ids of all the directories in the path
* @author Julio Montoya Dokeos
* @version April 2008
*/
function get_parent_directories($my_cur_dir_path)
{
$list_parents = explode('/', $my_cur_dir_path);
$dir_acum = '';
global $work_table;
$list_id=array();
for ($i = 0; $i < count($list_parents) - 1; $i++)
{
$where_sentence = "url LIKE BINARY '" . $dir_acum . "/" . $list_parents[$i]."'";
$dir_acum .= '/' . $list_parents[$i];
$sql = "SELECT id FROM ". $work_table . " WHERE ". $where_sentence;
$result = api_sql_query($sql, __FILE__, __LINE__);
$row= Database::fetch_array($result);
$list_id[]=$row['id'];
}
return $list_id;
}
/**
* Transform an all directory structure (only directories) in an array
* @param string path of the directory
* @return array the directory structure into an array
* @author Julio Montoya Dokeos
* @version April 2008
*/
function directory_to_array($directory)
{
$array_items = array();
if ($handle = opendir($directory))
{
while (false !== ($file = readdir($handle)))
{
if ($file != "." && $file != "..")
{
if (is_dir($directory. "/" . $file))
{
$array_items = array_merge($array_items, directory_to_array($directory. "/" . $file));
$file = $directory . "/" . $file;
$array_items[] = preg_replace("/\/\//si", "/", $file);
}
}
}
closedir($handle);
}
return $array_items;
}
/**
* Insert into the DB of the course all the directories
* @param string path of the /work directory of the course
* @return -1 on error, sql query result on success
* @author Julio Montoya Dokeos
* @version April 2008
*/
function insert_all_directory_in_course_table($base_work_dir)
{
$dir_to_array =directory_to_array($base_work_dir,true);
$only_dir=array();
for($i=0;$i";
print_r($only_dir);
echo "