PageRenderTime 42ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/manager/actions/export_site.static.php

https://github.com/good-web-master/modx.evo.custom
PHP | 311 lines | 266 code | 29 blank | 16 comment | 66 complexity | 37610b821ceefc906dbb12b18f7730d8 MD5 | raw file
Possible License(s): LGPL-2.1, AGPL-1.0, GPL-2.0, MIT, BSD-3-Clause
  1. <?php
  2. if(IN_MANAGER_MODE!="true") die("<b>INCLUDE_ORDERING_ERROR</b><br /><br />Please use the MODx Content Manager instead of accessing this file directly.");
  3. if(!$modx->hasPermission('export_static')) {
  4. $e->setError(3);
  5. $e->dumpError();
  6. }
  7. // figure out the base of the server, so we know where to get the documents in order to export them
  8. $base = MODX_SITE_URL;
  9. ?>
  10. <script type="text/javascript">
  11. function reloadTree() {
  12. // redirect to welcome
  13. document.location.href = "index.php?r=1&a=7";
  14. }
  15. </script>
  16. <h1><?php echo $_lang['export_site_html']; ?></h1>
  17. <div class="sectionBody">
  18. <?php
  19. if(!isset($_POST['export'])) {
  20. echo '<p>'.$_lang['export_site_message'].'</p>';
  21. ?>
  22. <fieldset style="padding:10px"><legend><?php echo $_lang['export_site']; ?></legend>
  23. <form action="index.php" method="post" name="exportFrm">
  24. <input type="hidden" name="export" value="export" />
  25. <input type="hidden" name="a" value="83" />
  26. <table border="0" cellspacing="0" cellpadding="2">
  27. <tr>
  28. <td valign="top"><b><?php echo $_lang['export_site_cacheable']; ?></b></td>
  29. <td width="30">&nbsp;</td>
  30. <td><input type="radio" name="includenoncache" value="1" checked="checked"><?php echo $_lang['yes'];?><br />
  31. <input type="radio" name="includenoncache" value="0"><?php echo $_lang['no'];?></td>
  32. </tr>
  33. <tr>
  34. <td><b><?php echo $_lang['export_site_prefix']; ?></b></td>
  35. <td>&nbsp;</td>
  36. <td><input type="text" name="prefix" value="<?php echo $friendly_url_prefix; ?>" /></td>
  37. </tr>
  38. <tr>
  39. <td><b><?php echo $_lang['export_site_suffix']; ?></b></td>
  40. <td>&nbsp;</td>
  41. <td><input type="text" name="suffix" value="<?php echo $friendly_url_suffix; ?>" /></td>
  42. </tr>
  43. <tr>
  44. <td valign="top"><b><?php echo $_lang['export_site_maxtime']; ?></b></td>
  45. <td>&nbsp;</td>
  46. <td><input type="text" name="maxtime" value="60" />
  47. <br />
  48. <small><?php echo $_lang['export_site_maxtime_message']; ?></small>
  49. </td>
  50. </tr>
  51. </table>
  52. <ul class="actionButtons">
  53. <li><a href="#" onclick="document.exportFrm.submit();"><img src="<?php echo $_style["icons_save"] ?>" /> <?php echo $_lang["export_site_start"]; ?></a></li>
  54. </ul>
  55. </form>
  56. </fieldset>
  57. <?php
  58. } else {
  59. $maxtime = $_POST['maxtime'];
  60. if(!is_numeric($maxtime)) {
  61. $maxtime = 30;
  62. }
  63. @set_time_limit($maxtime);
  64. $mtime = microtime(); $mtime = explode(" ",$mtime); $mtime = $mtime[1] + $mtime[0]; $exportstart = $mtime;
  65. $filepath = "../assets/export/";
  66. if(!is_writable($filepath)) {
  67. echo $_lang['export_site_target_unwritable'];
  68. include "footer.inc.php";
  69. exit;
  70. }
  71. $prefix = $_POST['prefix'];
  72. $suffix = $_POST['suffix'];
  73. $noncache = $_POST['includenoncache']==1 ? "" : "AND $dbase.`".$table_prefix."site_content`.cacheable=1";
  74. // Support export alias path
  75. function removeDirectoryAll($directory) {
  76. // if the path has a slash at the end, remove it
  77. if(substr($directory,-1) == '/') {
  78. $directory = substr($directory,0,-1);
  79. }
  80. // if the path is not valid or is not a directory ...
  81. if(!file_exists($directory) || !is_dir($directory)) {
  82. return FALSE;
  83. } elseif(!is_readable($directory)) {
  84. return FALSE;
  85. } else {
  86. $dh = opendir($directory);
  87. while (FALSE !== ($file = @readdir($dh))) {
  88. if($file != '.' && $file != '..') {
  89. $path = $directory.'/'.$file;
  90. if(is_dir($path)) {
  91. // call myself
  92. removeDirectoryAll($path);
  93. } else {
  94. @unlink($path);
  95. }
  96. }
  97. }
  98. closedir($dh);
  99. }
  100. return (@rmdir($directory));
  101. }
  102. function writeAPage($baseURL, $docid, $filepath) {
  103. global $_lang;
  104. global $base;
  105. if(@$handle = fopen($baseURL."/index.php?id=".$docid, "r")) {
  106. $buffer = "";
  107. while (!feof ($handle)) {
  108. $buffer .= fgets($handle, 4096);
  109. }
  110. fclose ($handle);
  111. $somecontent = $buffer;
  112. if (!$handle = fopen($filepath, 'w')) {
  113. echo '<p><span class="fail">'.$_lang["export_site_failed"]."</span> ".$_lang["export_site_failed_no_open_filepath"].'</p>';
  114. return FALSE;
  115. } else {
  116. // Write $somecontent to our opened file.
  117. if(fwrite($handle, $somecontent) === FALSE) {
  118. echo '<p><span class="fail">'.$_lang["export_site_failed"]."</span> ".$_lang["export_site_failed_no_write"].'</p>';
  119. return FALSE;
  120. }
  121. fclose($handle);
  122. echo '<p class="success">'.$_lang["export_site_success"].'</p>';
  123. }
  124. } else {
  125. echo '<p><span class="fail">'.$_lang["export_site_failed"]."</span> ".$_lang["export_site_failed_no_retrieve"].'</p>';
  126. // return FALSE;
  127. }
  128. return TRUE;
  129. }
  130. function getPageName($docid, $alias, $prefix, $suffix) {
  131. if(empty($alias)) {
  132. $filename = $prefix.$docid.$suffix;
  133. } else {
  134. $pa = pathinfo($alias); // get path info array
  135. $tsuffix = !empty($pa['extension']) ? '':$suffix;
  136. $filename = $prefix.$alias.$tsuffix;
  137. }
  138. return $filename;
  139. }
  140. function scanDirectory($path, $files) {
  141. // if the path has a slash at the end, remove it
  142. if(substr($path, -1) == '/') {
  143. $path = substr($path, 0, -1);
  144. }
  145. // if the path is not valid or is not a directory ...
  146. if(!file_exists($path) || !is_dir($path)) {
  147. return FALSE;
  148. } elseif(!is_readable($path)) {
  149. return FALSE;
  150. } else {
  151. $dh = opendir($path);
  152. while (FALSE !== ($filename = @readdir($dh))) {
  153. if($filename != '.' && $filename != '..' && substr($filename, 1) != '.') {
  154. if (!in_array($filename, $files)) {
  155. $file = $path."/".$filename;
  156. if (is_dir($file)) {
  157. removeDirectoryAll($file);
  158. } else {
  159. @unlink($file);
  160. }
  161. }
  162. }
  163. }
  164. closedir($dh);
  165. return TRUE;
  166. }
  167. }
  168. function exportDir($dirid, $dirpath, &$i) {
  169. global $_lang;
  170. global $base;
  171. global $modx;
  172. global $limit;
  173. global $dbase;
  174. global $table_prefix;
  175. global $sqlcond;
  176. $sql = "SELECT id, alias, pagetitle, isfolder, (content = '' AND template = 0) AS wasNull, editedon FROM $dbase.`".$table_prefix."site_content` WHERE $dbname.`".$table_prefix."site_content`.parent = ".$dirid." AND ".$sqlcond;
  177. $rs = mysql_query($sql);
  178. $dircontent = array();
  179. while($row = mysql_fetch_assoc($rs)) {
  180. if (!$row['wasNull']) { // needs writing a document
  181. $docname = getPageName($row['id'], $row['alias'], $modx->config['friendly_url_prefix'], $suffix = $modx->config['friendly_url_suffix']);
  182. printf($_lang['export_site_exporting_document'], $i++, $limit, $row['pagetitle'], $row['id']);
  183. $filename = $dirpath.$docname;
  184. if (is_dir($filename)) {
  185. removeDirectoryAll($filename);
  186. }
  187. if (!file_exists($filename) || (filemtime($filename) < $row['editedon'])) {
  188. if (!writeAPage($base, $row['id'], $filename)) exit;
  189. } else {
  190. echo '<p><span class="success">'.$_lang['export_site_success']."</span> ".$_lang["export_site_success_skip_doc"].'</p>';
  191. }
  192. $dircontent[] = $docname;
  193. }
  194. if ($row['isfolder']) { // needs making a folder
  195. $dirname = $dirpath.$row['alias'];
  196. if (!is_dir($dirname)) {
  197. if (file_exists($dirname)) @unlink($dirname);
  198. mkdir($dirname);
  199. if ($row['wasNull']) {
  200. printf($_lang['export_site_exporting_document'], $i++, $limit, $row['pagetitle'], $row['id']);
  201. echo '<p class="success">'.$_lang['export_site_success'].'</p>';
  202. }
  203. } else {
  204. if ($row['wasNull']) {
  205. printf($_lang['export_site_exporting_document'], $i++, $limit, $row['pagetitle'], $row['id']);
  206. echo '<p><span class="success">'.$_lang['export_site_success'].$_lang["export_site_success_skip_dir"].'</p>';
  207. }
  208. }
  209. exportDir($row['id'], $dirname."/", $i);
  210. $dircontent[] = $row['alias'];
  211. }
  212. }
  213. // remove No-MODx files/dirs
  214. if (!scanDirectory($dirpath, $dircontent)) exit;
  215. // print_r ($dircontent);
  216. }
  217. if($modx->config['friendly_urls']==1 && $modx->config['use_alias_path']==1) {
  218. $sqlcond = "$dbase.`".$table_prefix."site_content`.deleted=0 AND (($dbase.`".$table_prefix."site_content`.published=1 AND $dbase.`".$table_prefix."site_content`.type='document') OR ($dbase.`".$table_prefix."site_content`.isfolder=1)) $noncache";
  219. $sql = "SELECT count(*) as count1 FROM $dbase.`".$table_prefix."site_content` WHERE ".$sqlcond;
  220. $rs = mysql_query($sql);
  221. $row = mysql_fetch_row($rs);
  222. $prefix = $modx->config['friendly_url_prefix'];
  223. $suffix = $modx->config['friendly_url_suffix'];
  224. $limit = $row[0];
  225. printf($_lang['export_site_numberdocs'], $limit);
  226. $n = 1;
  227. exportDir(0, $filepath, $n);
  228. } else {
  229. // Modified for export alias path 2006/3/24 end
  230. $sql = "SELECT id, alias, pagetitle FROM $dbase.`".$table_prefix."site_content` WHERE $dbase.`".$table_prefix."site_content`.deleted=0 AND $dbase.`".$table_prefix."site_content`.published=1 AND $dbase.`".$table_prefix."site_content`.type='document' $noncache";
  231. $rs = mysql_query($sql);
  232. $limit = mysql_num_rows($rs);
  233. printf($_lang['export_site_numberdocs'], $limit);
  234. for($i=0; $i<$limit; $i++) {
  235. $row=mysql_fetch_assoc($rs);
  236. $id = $row['id'];
  237. printf($_lang['export_site_exporting_document'], $i, $limit, $row['pagetitle'], $id);
  238. $alias = $row['alias'];
  239. if(empty($alias)) {
  240. $filename = $prefix.$id.$suffix;
  241. } else {
  242. $pa = pathinfo($alias); // get path info array
  243. $tsuffix = !empty($pa[extension]) ? '':$suffix;
  244. $filename = $prefix.$alias.$tsuffix;
  245. }
  246. // get the file
  247. if(@$handle = fopen("$base/index.php?id=$id", "r")) {
  248. $buffer = "";
  249. while (!feof ($handle)) {
  250. $buffer .= fgets($handle, 4096);
  251. }
  252. fclose ($handle);
  253. // save it
  254. $filename = "$filepath$filename";
  255. $somecontent = $buffer;
  256. if(!$handle = fopen($filename, 'w')) {
  257. echo '<p><span class="fail">'.$_lang["export_site_failed"]."</span> ".$_lang["export_site_failed_no_open_filename"].'</p>';
  258. exit;
  259. } else {
  260. // Write $somecontent to our opened file.
  261. if(fwrite($handle, $somecontent) === FALSE) {
  262. echo '<p><span class="fail">'.$_lang["export_site_failed"]."</span> ".$_lang["export_site_failed_no_writee"].'</p>';
  263. exit;
  264. }
  265. fclose($handle);
  266. echo '<p class="success">'.$_lang['export_site_success'].'</p>';
  267. }
  268. } else {
  269. echo '<p><span class="fail">'.$_lang["export_site_failed"]."</span> ".$_lang["export_site_failed_no_retrieve"].'</p>';
  270. }
  271. }
  272. }
  273. $mtime = microtime(); $mtime = explode(" ",$mtime); $mtime = $mtime[1] + $mtime[0]; $exportend = $mtime;
  274. $totaltime = ($exportend - $exportstart);
  275. printf ('<p>'.$_lang["export_site_time"].'</p>', round($totaltime, 3));
  276. ?>
  277. <ul class="actionButtons">
  278. <li><a href="#" onclick="reloadTree();"><img src="<?php echo $_style["icons_cancel"] ?>" /> <?php echo $_lang["close"]; ?></a></li>
  279. </ul>
  280. <?php
  281. }
  282. ?>