special_exports.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. <?php
  2. /* For licensing terms, see /license.txt */
  3. /**
  4. * Special exports
  5. *
  6. * @author Jhon Hinojosa
  7. * @author Julio Montoya Fixing pclzip folder + some clean <gugli100@gmail.com>
  8. * @package chamilo.include.export
  9. */
  10. // including the global file
  11. $cidReset = true;
  12. require_once '../inc/global.inc.php';
  13. use Chamilo\CourseBundle\Component\CourseCopy\CourseBuilder;
  14. use Chamilo\CourseBundle\Component\CourseCopy\CourseSelectForm;
  15. // setting the section (for the tabs)
  16. $this_section = SECTION_PLATFORM_ADMIN;
  17. // setting breadcrumbs
  18. $interbreadcrumb[] = array ("url" => 'index.php', "name" => get_lang('PlatformAdmin'));
  19. // Access restrictions
  20. api_protect_admin_script(true);
  21. $nameTools = get_lang('SpecialExports');
  22. $export = '';
  23. // include additional libraries
  24. if (function_exists('ini_set')) {
  25. api_set_memory_limit('256M');
  26. ini_set('max_execution_time',0);
  27. }
  28. // Displaying the header
  29. Display::display_header($nameTools);
  30. // Display the tool title
  31. echo Display::page_header($nameTools);
  32. if (count($_POST) == 0) {
  33. Display::display_normal_message(get_lang('SpecialExportsIntroduction'));
  34. }
  35. $error =0;
  36. /* MAIN CODE */
  37. $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION);
  38. $tbl_session_course = Database::get_main_table(TABLE_MAIN_SESSION_COURSE);
  39. if ((isset($_POST['action']) && $_POST['action'] == 'course_select_form') ||
  40. (isset ($_POST['backup_option']) && $_POST['backup_option'] == 'full_backup')
  41. ) {
  42. $export = false;
  43. if (isset ($_POST['action']) && $_POST['action'] == 'course_select_form') {
  44. $FileZip = create_zip();
  45. $to_group_id = 0;
  46. $sql_session = "SELECT id, name FROM $tbl_session ";
  47. $query_session = Database::query($sql_session);
  48. $ListSession = array();
  49. while ($rows_session = Database::fetch_assoc($query_session)) {
  50. $ListSession[$rows_session['id']] = $rows_session['name'];
  51. }
  52. $groupCondition = " props.to_group_id = $to_group_id";
  53. if (empty($to_group_id)) {
  54. $groupCondition = " (props.to_group_id = 0 OR props.to_group_id IS NULL)";
  55. }
  56. $zip_folder=new PclZip($FileZip['TEMP_FILE_ZIP']);
  57. if(!isset($_POST['resource']) || count($_POST['resource']) == 0 ) {
  58. Display::display_error_message(get_lang('ErrorMsgSpecialExport'));
  59. } else {
  60. $Resource = $_POST['resource'];
  61. foreach ($Resource as $Code_course => $Sessions) {
  62. $_course = api_get_course_info($Code_course);
  63. $tbl_document = Database::get_course_table(TABLE_DOCUMENT);
  64. $tbl_property = Database::get_course_table(TABLE_ITEM_PROPERTY);
  65. $course_id = $_course['real_id'];
  66. //Add item to the zip file course
  67. $sql = "SELECT path FROM $tbl_document AS docs, $tbl_property AS props
  68. WHERE props.tool='".TOOL_DOCUMENT."'
  69. AND docs.id=props.ref
  70. AND docs.path LIKE '".$querypath."/%'
  71. AND docs.filetype='file'
  72. AND (docs.session_id = '0' OR docs.session_id IS NULL)
  73. AND props.visibility<>'2'
  74. AND $groupCondition
  75. AND docs.c_id = $course_id
  76. AND props.c_id = $course_id";
  77. $query = Database::query($sql );
  78. while ($rows_course_file = Database::fetch_assoc($query)) {
  79. $zip_folder->add(
  80. $FileZip['PATH_COURSE'].$_course['directory']."/document".$rows_course_file['path'],
  81. PCLZIP_OPT_ADD_PATH,
  82. $_course['directory'],
  83. PCLZIP_OPT_REMOVE_PATH,
  84. $FileZip['PATH_COURSE'].$_course['directory']."/document".$FileZip['PATH_REMOVE']
  85. );
  86. }
  87. foreach ($Sessions as $IdSession => $value){
  88. $session_id = Security::remove_XSS($IdSession);
  89. //Add tem to the zip file session course
  90. $sql_session_doc = "SELECT path FROM $tbl_document AS docs, $tbl_property AS props
  91. WHERE props.tool='".TOOL_DOCUMENT."'
  92. AND docs.id=props.ref
  93. AND docs.path LIKE '".$querypath."/%'
  94. AND docs.filetype='file'
  95. AND docs.session_id = '$session_id'
  96. AND props.visibility<>'2'
  97. AND $groupCondition
  98. AND docs.c_id = $course_id
  99. AND props.c_id = $course_id";
  100. $query_session_doc = Database::query($sql_session_doc);
  101. while ($rows_course_session_file = Database::fetch_assoc($query_session_doc)) {
  102. $zip_folder->add(
  103. $FileZip['PATH_COURSE'].$_course['directory'].'/document'.$rows_course_session_file['path'],
  104. PCLZIP_OPT_ADD_PATH,
  105. $_course['directory']."/".$ListSession[$session_id],
  106. PCLZIP_OPT_REMOVE_PATH,
  107. $FileZip['PATH_COURSE'].$_course['directory'].'/document'.$FileZip['PATH_REMOVE']
  108. );
  109. }
  110. }
  111. }
  112. $name = rename_zip($FileZip);
  113. $export = true;
  114. }
  115. } else {
  116. $name = fullexportspecial();
  117. }
  118. ?>
  119. <!-- Manual download <script language="JavaScript">
  120. // setTimeout(\'download_backup()\',2000);
  121. function download_backup()
  122. {
  123. window.location="../course_info/download.php?archive=<?php echo $name; ?>&session=true";
  124. }
  125. </script> //-->
  126. <?php
  127. }
  128. if ($export && $name) {
  129. Display::display_confirmation_message(get_lang('BackupCreated'));
  130. echo '<br /><a class="btn btn-default" href="'.api_get_path(WEB_CODE_PATH).'course_info/download.php?archive='.urlencode($name).'&session=true">'.get_lang('Download').'</a>';
  131. } else {
  132. // Display forms especial export
  133. if (isset ($_POST['backup_option']) && $_POST['backup_option'] == 'select_items') {
  134. $cb = new CourseBuilder();
  135. $course = $cb->build_session_course();
  136. if($course === false){
  137. Display::display_error_message(get_lang('ErrorMsgSpecialExport'));
  138. form_special_export();
  139. } else {
  140. Display::display_normal_message(get_lang('ToExportSpecialSelect'));
  141. CourseSelectForm :: display_form_session_export($course);
  142. }
  143. } else {
  144. form_special_export();
  145. }
  146. }
  147. /* FOOTER */
  148. Display::display_footer();
  149. function form_special_export() {
  150. $form = new FormValidator('special_exports','post');
  151. $renderer = $form->defaultRenderer();
  152. $renderer->setCustomElementTemplate('<div>{element}</div> ');
  153. $form->addElement('radio', 'backup_option', '', get_lang('SpecialCreateFullBackup'), 'full_backup');
  154. $form->addElement('radio', 'backup_option', '', get_lang('SpecialLetMeSelectItems'), 'select_items');
  155. $form->addElement('html','<br />');
  156. $form->addButtonExport(get_lang('CreateBackup'));
  157. $form->add_progress_bar();
  158. $values['backup_option'] = 'full_backup';
  159. $form->setDefaults($values);
  160. $form->display();
  161. }
  162. function create_zip(){
  163. $path = '';
  164. if(empty($path)) { $path='/'; }
  165. $remove_dir = ($path!='/') ? substr($path,0,strlen($path) - strlen(basename($path))) : '/';
  166. $sys_archive_path = api_get_path(SYS_ARCHIVE_PATH);
  167. $sys_course_path = api_get_path(SYS_COURSE_PATH);
  168. $temp_zip_dir = $sys_archive_path."temp";
  169. if(!is_dir($temp_zip_dir)) {
  170. mkdir($temp_zip_dir, api_get_permissions_for_new_directories());
  171. } else {
  172. $handle=opendir($temp_zip_dir);
  173. while (false!==($file = readdir($handle))) {
  174. if ($file != "." && $file != "..") {
  175. $Diff = (time() - filemtime("$temp_zip_dir/$file"))/60/60; //the "age" of the file in hours
  176. if ($Diff > 4) unlink("$temp_zip_dir/$file"); //delete files older than 4 hours
  177. }
  178. }
  179. closedir($handle);
  180. }
  181. $temp_zip_file = $temp_zip_dir."/".md5(time()).".zip"; //create zipfile of given directory
  182. return array('PATH' => $path,
  183. 'PATH_TEMP_ARCHIVE' => $temp_zip_dir,
  184. 'PATH_COURSE' => $sys_course_path,
  185. 'TEMP_FILE_ZIP' => $temp_zip_file,
  186. 'PATH_REMOVE' => $remove_dir);
  187. }
  188. function rename_zip($FileZip) {
  189. Event::event_download(($FileZip['PATH'] == '/')?'full_export_'.date('Ymd').'.zip (folder)': basename($FileZip['PATH']).'.zip (folder)');
  190. $name = ($FileZip['PATH']=='/')? 'full_export_'.date('Ymd').'.zip':basename($FileZip['PATH']).'.zip';
  191. if(file_exists($FileZip['PATH_TEMP_ARCHIVE'].'/'.$name)){ unlink($FileZip['PATH_TEMP_ARCHIVE'].'/'.$name); }
  192. if(file_exists($FileZip['TEMP_FILE_ZIP'])) {
  193. rename($FileZip['TEMP_FILE_ZIP'], $FileZip['PATH_TEMP_ARCHIVE'].'/'.$name);
  194. return $name;
  195. } else { return false; }
  196. }
  197. function fullexportspecial(){
  198. global $tbl_session, $tbl_session_course, $export;
  199. $FileZip = create_zip();
  200. $to_group_id = 0;
  201. $code_course = '';
  202. $list_course = array();
  203. $zip_folder = new PclZip($FileZip['TEMP_FILE_ZIP']);
  204. $list_course = CourseManager::get_course_list();
  205. $tbl_document = Database::get_course_table(TABLE_DOCUMENT);
  206. $tbl_property = Database::get_course_table(TABLE_ITEM_PROPERTY);
  207. $groupCondition = " props.to_group_id = $to_group_id";
  208. if (empty($to_group_id)) {
  209. $groupCondition = " (props.to_group_id = 0 OR props.to_group_id IS NULL)";
  210. }
  211. if (count($list_course) >0 ) {
  212. foreach($list_course as $_course) {
  213. if($FileZip['PATH'] == '/') {
  214. $querypath=''; // to prevent ...path LIKE '//%'... in query
  215. } else {
  216. $querypath = $FileZip['PATH'];
  217. }
  218. $course_id = $_course['real_id'];
  219. //Add tem to the zip file course
  220. $sql = "SELECT path FROM $tbl_document AS docs, $tbl_property AS props
  221. WHERE props.tool='".TOOL_DOCUMENT."'
  222. AND docs.id=props.ref
  223. AND docs.path LIKE '".$querypath."/%'
  224. AND docs.filetype='file'
  225. AND (docs.session_id = '0' OR docs.session_id IS NULL)
  226. AND props.visibility<>'2'
  227. AND $groupCondition
  228. AND docs.c_id = $course_id
  229. AND props.c_id = $course_id";
  230. $query = Database::query($sql );
  231. while ($rows_course_file = Database::fetch_assoc($query)) {
  232. $rows_course_file['path'];
  233. $zip_folder->add($FileZip['PATH_COURSE'].$_course['directory']."/document".$rows_course_file['path'],
  234. PCLZIP_OPT_ADD_PATH, $_course['directory'],
  235. PCLZIP_OPT_REMOVE_PATH, $FileZip['PATH_COURSE'].$_course['directory']."/document".$FileZip['PATH_REMOVE']
  236. );
  237. }
  238. //Add tem to the zip file session course
  239. $code_course = $_course['code'];
  240. $sql_session = "SELECT s.id, name, c_id
  241. FROM $tbl_session_course sc
  242. INNER JOIN $tbl_session s
  243. ON sc.session_id = s.id
  244. WHERE c_id = '$course_id' ";
  245. $query_session = Database::query($sql_session);
  246. while ($rows_session = Database::fetch_assoc($query_session)) {
  247. $session_id = $rows_session['id'];
  248. $sql_session_doc = "SELECT path FROM $tbl_document AS docs, $tbl_property AS props
  249. WHERE props.tool='".TOOL_DOCUMENT."'
  250. AND docs.id=props.ref
  251. AND docs.path LIKE '".$querypath."/%'
  252. AND docs.filetype='file'
  253. AND docs.session_id = '$session_id'
  254. AND props.visibility<>'2'
  255. AND $groupCondition
  256. AND docs.c_id = $course_id
  257. AND props.c_id = $course_id ";
  258. $query_session_doc = Database::query($sql_session_doc);
  259. while ($rows_course_session_file = Database::fetch_assoc($query_session_doc)) {
  260. $zip_folder->add($FileZip['PATH_COURSE'].$_course['directory'].'/document'.$rows_course_session_file['path'],
  261. PCLZIP_OPT_ADD_PATH, $_course['directory']."/".$rows_session['name'],
  262. PCLZIP_OPT_REMOVE_PATH, $FileZip['PATH_COURSE'].$_course['directory'].'/document'.$FileZip['PATH_REMOVE']
  263. );
  264. }
  265. }
  266. }
  267. $name = rename_zip($FileZip);
  268. if ($name === false){
  269. $export = false;
  270. return false;
  271. } else {
  272. $export = true;
  273. return $name;
  274. }
  275. } else {
  276. Display::display_error_message(get_lang('ErrorMsgSpecialExport')); //main API
  277. $export = false;
  278. return false;
  279. }
  280. }