PageRenderTime 49ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/modules/learning/admin/learn_export.php

https://gitlab.com/alexprowars/bitrix
PHP | 294 lines | 240 code | 48 blank | 6 comment | 45 complexity | 2f0d22f9da3d0844f43aca0e0b2cd025 MD5 | raw file
  1. <?
  2. require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php");
  3. if (!CModule::IncludeModule('learning'))
  4. {
  5. require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_admin_after.php'); // second system's prolog
  6. if (IsModuleInstalled('learning') && defined('LEARNING_FAILED_TO_LOAD_REASON'))
  7. echo LEARNING_FAILED_TO_LOAD_REASON;
  8. else
  9. CAdminMessage::ShowMessage(GetMessage('LEARNING_MODULE_NOT_FOUND'));
  10. require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/epilog_admin.php'); // system's epilog
  11. exit();
  12. }
  13. require_once($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/learning/prolog.php");
  14. IncludeModuleLangFile(__FILE__);
  15. ClearVars();
  16. require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/tar_gz.php");
  17. set_time_limit(0);
  18. $STEP = intval($STEP);
  19. if ($STEP <= 0)
  20. $STEP = 1;
  21. if ($REQUEST_METHOD == "POST" && $backButton <> '')
  22. $STEP = $STEP - 2;
  23. if ($REQUEST_METHOD == "POST" && $backButton2 <> '')
  24. $STEP = 1;
  25. $COURSE_ID = intval($COURSE_ID);
  26. $strError = "";
  27. if ($_SERVER["REQUEST_METHOD"] == "POST" && $STEP > 1 && check_bitrix_sessid())
  28. {
  29. if ($STEP > 1)
  30. {
  31. // was: $res = CCourse::GetList(Array("sort" => "asc"),Array("ID" => $COURSE_ID,"MIN_PERMISSION" => "W"));
  32. // TODO: think about better way of rights check (for every exported lesson, I think).
  33. $res = CCourse::GetList(Array("sort" => "asc"),Array("ID" => $COURSE_ID,'ACCESS_OPERATIONS' => CLearnAccess::OP_LESSON_READ | CLearnAccess::OP_LESSON_WRITE));
  34. if (!$arCourse = $res->GetNext())
  35. $strError .= GetMessage("LEARNING_BAD_COURSE")."<br>";
  36. if ($strError <> '')
  37. $STEP = 1;
  38. }
  39. if ($STEP > 2)
  40. {
  41. // Check filename
  42. $pattern = '#^[0-9a-zA-Z_.-/]+$#';
  43. $antiPattern = '#[^0-9a-zA-Z_.-/]#';
  44. if (preg_match($pattern, $DATA_FILE_NAME) !== 1)
  45. {
  46. $DATA_FILE_NAME = preg_replace($antiPattern, '', $DATA_FILE_NAME);
  47. $strError .= GetMessage('LEARNING_BAD_FILENAME');
  48. $STEP = 2;
  49. }
  50. }
  51. if ($STEP > 2)
  52. {
  53. $tmp_dir = BX_PERSONAL_ROOT."/tmp/learning/".uniqid(rand());
  54. CheckDirPath($_SERVER["DOCUMENT_ROOT"].$tmp_dir);
  55. $exportFolder = '/upload/learning_export/';
  56. if ( ! file_exists($_SERVER["DOCUMENT_ROOT"] . $exportFolder) )
  57. mkdir ($_SERVER["DOCUMENT_ROOT"] . $exportFolder);
  58. $DATA_FILE_NAME = $exportFolder . BX_basename($DATA_FILE_NAME);
  59. if ($DATA_FILE_NAME == '')
  60. {
  61. $strError .= GetMessage("LEARNING_NO_DATA_FILE")."<br>";
  62. }
  63. else
  64. {
  65. $bUseCompression = true;
  66. if(!extension_loaded('zlib') || !function_exists("gzcompress"))
  67. $bUseCompression = false;
  68. if (mb_substr($DATA_FILE_NAME, -6) != "tar.gz")
  69. $DATA_FILE_NAME .= ".tar.gz";
  70. if (is_file($_SERVER["DOCUMENT_ROOT"].$DATA_FILE_NAME))
  71. @unlink($_SERVER["DOCUMENT_ROOT"].$DATA_FILE_NAME);
  72. if ($arCourse["SCORM"] == "Y")
  73. {
  74. $dir = "/".(COption::GetOptionString("main", "upload_dir", "upload"))."/learning/scorm/".$COURSE_ID."/";
  75. $arc = new CArchiver($_SERVER["DOCUMENT_ROOT"].$DATA_FILE_NAME, $bUseCompression);
  76. $res = $arc->Add("\"".$_SERVER["DOCUMENT_ROOT"].$dir."\"", false, $_SERVER["DOCUMENT_ROOT"].$dir);
  77. if (!$res)
  78. {
  79. $arErrors = &$arc->GetErrors();
  80. foreach ($arErrors as $value)
  81. $strError .= "[".$value[0]."] ".$value[1]."<br>";
  82. }
  83. }
  84. else
  85. {
  86. $package = new CCoursePackage($COURSE_ID);
  87. if ($package->LAST_ERROR == '')
  88. {
  89. $success = $package->CreatePackage($tmp_dir);
  90. if ($success)
  91. {
  92. $arc = new CArchiver($_SERVER["DOCUMENT_ROOT"].$DATA_FILE_NAME, $bUseCompression);
  93. $res = $arc->Add("\"".$_SERVER['DOCUMENT_ROOT'].$tmp_dir."\"", false, $_SERVER['DOCUMENT_ROOT'].$tmp_dir);
  94. if (!$res)
  95. {
  96. $arErrors = &$arc->GetErrors();
  97. foreach ($arErrors as $value)
  98. $strError .= "[".$value[0]."] ".$value[1]."<br>";
  99. }
  100. DeleteDirFilesEx($tmp_dir);
  101. }
  102. else
  103. {
  104. $strError .= $package->LAST_ERROR;
  105. }
  106. }
  107. else
  108. {
  109. $strError .= $package->LAST_ERROR;
  110. }
  111. }
  112. }
  113. if ($strError <> '')
  114. $STEP = 2;
  115. }
  116. }
  117. $APPLICATION->SetTitle(GetMessage("LEARNING_PAGE_TITLE")." ".$STEP);
  118. require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_after.php");
  119. if (defined("LEARNING_ADMIN_ACCESS_DENIED"))
  120. $APPLICATION->AuthForm(GetMessage("ACCESS_DENIED"), false);
  121. CAdminMessage::ShowMessage($strError);
  122. ?>
  123. <form method="POST" action="<?echo $APPLICATION->GetCurPage()?>?lang=<?echo LANG ?>" ENCTYPE="multipart/form-data">
  124. <input type="hidden" name="STEP" value="<?echo $STEP + 1;?>">
  125. <?=bitrix_sessid_post()?>
  126. <?
  127. if ($STEP > 1)
  128. {
  129. ?><input type="hidden" name="COURSE_ID" value="<?echo $COURSE_ID ?>"><?
  130. }
  131. ?>
  132. <?
  133. $aTabs = array(
  134. array("DIV" => "edit1", "TAB" => GetMessage("LEARNING_ADMIN_TAB1"), "TITLE" => GetMessage("LEARNING_ADMIN_TAB1_EX")),
  135. array("DIV" => "edit2", "TAB" => GetMessage("LEARNING_ADMIN_TAB2"), "TITLE" => GetMessage("LEARNING_ADMIN_TAB2_EX")),
  136. array("DIV" => "edit3", "TAB" => GetMessage("LEARNING_ADMIN_TAB3"), "TITLE" => GetMessage("LEARNING_ADMIN_TAB3_EX"))
  137. );
  138. $tabControl = new CAdminTabControl("tabControl", $aTabs, false, true);
  139. $tabControl->Begin();
  140. ?>
  141. <?
  142. $tabControl->BeginNextTab();
  143. if ($STEP < 2)
  144. {
  145. ?>
  146. <tr>
  147. <td><?echo GetMessage("LEARNING_COURSES") ?>:</td>
  148. <td>
  149. <select name="COURSE_ID" style="width:300px;">
  150. <?
  151. // was: $course = CCourse::GetList(array("SORT" => "ASC"), array("MIN_PERMISSION" => "W"));
  152. // TODO: think about better way of rights check (for every exported lesson, I think).
  153. $course = CCourse::GetList(array("SORT" => "ASC"), array('ACCESS_OPERATIONS' => CLearnAccess::OP_LESSON_READ | CLearnAccess::OP_LESSON_WRITE));
  154. while ($course->ExtractFields("f_"))
  155. {
  156. ?><option value="<?echo $f_ID ?>" <?if (intval($f_ID)==$COURSE_ID) echo "selected";?>><?echo $f_NAME ?></option><?
  157. }
  158. ?>
  159. </select>
  160. </td>
  161. </tr>
  162. <?
  163. }
  164. $tabControl->EndTab();
  165. ?>
  166. <?
  167. $tabControl->BeginNextTab();
  168. if ($STEP == 2)
  169. {
  170. ?>
  171. <tr class="heading">
  172. <td colspan="2"><?echo GetMessage("LEARNING_DATA_FILE_NAME") ?></td>
  173. </tr>
  174. <tr>
  175. <td><?echo GetMessage("LEARNING_DATA_FILE_NAME1") ?>:<br>&nbsp;</td>
  176. <td valign="top">
  177. <input type="text" name="DATA_FILE_NAME" size="40" value="<?echo ($DATA_FILE_NAME <> '')?htmlspecialcharsbx($DATA_FILE_NAME):"package".$COURSE_ID.".tar.gz"?>"><br>
  178. <small><?echo GetMessage("LEARNING_DATA_FILE_NAME1_DESC") ?></small>
  179. </td>
  180. </tr>
  181. <?
  182. }
  183. $tabControl->EndTab();
  184. ?>
  185. <?
  186. $tabControl->BeginNextTab();
  187. if ($STEP > 2)
  188. {
  189. ?>
  190. <tr>
  191. <td colspan="2"><b><?echo GetMessage("LEARNING_SUCCESS") ?></b></td>
  192. </tr>
  193. <tr>
  194. <td colspan="2">
  195. <?php
  196. $tmp = '/' . $DATA_FILE_NAME;
  197. $arAllowedPrefixes = array('http://', 'ftp://', 'https://', '/');
  198. foreach ($arAllowedPrefixes as $prefix)
  199. {
  200. if (mb_substr($DATA_FILE_NAME, 0, mb_strlen($prefix)) === $prefix)
  201. {
  202. $tmp = $DATA_FILE_NAME;
  203. break;
  204. }
  205. }
  206. echo str_replace("%DATA_URL%", "<a href=\"".htmlspecialcharsbx($tmp)."\" target=\"_blank\">".htmlspecialcharsbx($DATA_FILE_NAME)."</a>", GetMessage("LEARNING_SU_ALL1"));
  207. ?>
  208. </td>
  209. </tr>
  210. <?
  211. }
  212. $tabControl->EndTab();
  213. ?>
  214. <?
  215. $tabControl->Buttons();
  216. ?>
  217. <?if ($STEP < 3):?>
  218. <?if ($STEP > 1):?>
  219. <input type="submit" name="backButton" value="&lt;&lt; <?echo GetMessage("LEARNING_BACK") ?>">
  220. <?endif?>
  221. <input type="submit" class="adm-btn-green" value="<?echo ($STEP==2)?GetMessage("LEARNING_NEXT_STEP_F"):GetMessage("LEARNING_NEXT_STEP") ?> &gt;&gt;" name="submit_btn">
  222. <?else:?>
  223. <input type="submit" name="backButton2" value="&lt;&lt; <?echo GetMessage("LEARNING_2_1_STEP") ?>">
  224. <?endif;?>
  225. <?
  226. $tabControl->End();
  227. ?>
  228. </form>
  229. <script language="JavaScript">
  230. <!--
  231. <?if ($STEP < 2):?>
  232. tabControl.SelectTab("edit1");
  233. tabControl.DisableTab("edit2");
  234. tabControl.DisableTab("edit3");
  235. <?elseif ($STEP == 2):?>
  236. tabControl.SelectTab("edit2");
  237. tabControl.DisableTab("edit1");
  238. tabControl.DisableTab("edit3");
  239. <?elseif ($STEP > 2):?>
  240. tabControl.SelectTab("edit3");
  241. tabControl.DisableTab("edit1");
  242. tabControl.DisableTab("edit2");
  243. <?endif;?>
  244. //-->
  245. </script>
  246. <?require($DOCUMENT_ROOT."/bitrix/modules/main/include/epilog_admin.php");?>