PageRenderTime 27ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/core/model/modx/processors/system/import/html.php

https://github.com/francisreboucas/revolution
PHP | 230 lines | 200 code | 20 blank | 10 comment | 49 complexity | d84e9ddbe97880483592d5833e1248c4 MD5 | raw file
  1. <?php
  2. /**
  3. * @package modx
  4. * @subpackage processors.system.import
  5. */
  6. if (!$modx->hasPermission('import_static')) return $modx->error->failure($modx->lexicon('permission_denied'));
  7. $modx->lexicon->load('import');
  8. if (!function_exists('getFiles')) {
  9. function getFiles(& $modx, & $results, & $filesfound, $directory, $listing= array (), $count= 0) {
  10. $dummy= $count;
  11. if (@ $handle= opendir($directory)) {
  12. while ($file= readdir($handle)) {
  13. if ($file == '.' || $file == '..' || strpos($file, '.') === 0)
  14. continue;
  15. else
  16. if ($h= @ opendir($directory . $file . "/")) {
  17. closedir($h);
  18. $count= -1;
  19. $listing["$file"]= getFiles($modx, $results, $filesfound, $directory . $file . "/", array (), $count +1);
  20. } else {
  21. $listing[$dummy]= $file;
  22. $dummy= $dummy +1;
  23. $filesfound++;
  24. }
  25. }
  26. } else {
  27. $results .= $modx->lexicon('import_site_failed') . " Could not open '$directory'.<br />";
  28. }
  29. @ closedir($handle);
  30. return ($listing);
  31. }
  32. }
  33. if (!function_exists('importFiles')) {
  34. function importFiles(& $modx, & $results, $allowedfiles, $parent, $filepath, $files, $context= 'web') {
  35. if (!is_array($files))
  36. return;
  37. if ($parent > 0) {
  38. if ($parentResource= $modx->getObject('modResource', $parent)) {
  39. $parentResource->set('isfolder', true);
  40. $parentResource->save();
  41. } else {
  42. $results .= "Could not get parent ({$parent}) resource to set isfolder attribute after import.";
  43. return;
  44. }
  45. }
  46. foreach ($files as $id => $value) {
  47. if (is_array($value)) {
  48. /* create folder */
  49. $resource= $modx->newObject('modDocument');
  50. $resource->set('context_key', $context);
  51. $resource->set('content_type', 1);
  52. $resource->set('pagetitle', $id);
  53. $resource->set('parent', $parent);
  54. $resource->set('isfolder', true);
  55. $alias= getResourceAlias($modx, $resource, $results, $id, $parent, $context);
  56. $resource->set('alias', $alias);
  57. $resource->set('published', false);
  58. $resource->set('template', $modx->getOption('default_template'));
  59. $resource->set('menuindex', $modx->getCount('modResource', array (
  60. 'parent' => $parent
  61. )));
  62. $resource->set('searchable', $modx->getOption('search_default'));
  63. $resource->set('cacheable', $modx->getOption('cache_default'));
  64. $results .= sprintf($modx->lexicon('import_site_importing_document'), $alias);
  65. if (!$resource->save()) {
  66. $results .= "Could not import resource from {$filepath}/{$filename}: <br />" . nl2br(print_r($modx->errorInfo(), true));
  67. } else {
  68. $results .= $modx->lexicon('import_site_success') . "<br />";
  69. importFiles($modx, $results, $allowedfiles, $resource->get('id'), $filepath . "/{$id}/", $value, $context);
  70. }
  71. } else {
  72. /* create resource */
  73. $filename= $value;
  74. $fparts= explode(".", $value);
  75. $value= $fparts[0];
  76. $ext= (count($fparts) > 1) ? $fparts[count($fparts) - 1] : "";
  77. $results .= sprintf($modx->lexicon('import_site_importing_document'), $filename);
  78. if (!in_array($ext, $allowedfiles))
  79. $results .= $modx->lexicon('import_site_skip') . "<br />";
  80. else {
  81. $file= getFileContent($modx, $results, "$filepath/$filename");
  82. if (preg_match("/<title>(.*)<\/title>/i", $file, $matches)) {
  83. $pagetitle= $matches[1];
  84. } else
  85. $pagetitle= $value;
  86. if (!$pagetitle)
  87. $pagetitle= $value;
  88. if (preg_match("/<body[^>]*>(.*)[^<]+<\/body>/is", $file, $matches)) {
  89. $content= $matches[1];
  90. } else
  91. $content= $file;
  92. $resource= $modx->newObject('modDocument');
  93. $resource->set('context_key', $context);
  94. $resource->set('content_type', 1);
  95. $resource->set('pagetitle', $pagetitle);
  96. $resource->set('parent', $parent);
  97. $resource->set('isfolder', false);
  98. $alias= getResourceAlias($modx, $resource, $results, $value, $parent, $context);
  99. $resource->set('alias', $alias);
  100. $resource->set('published', false);
  101. $resource->set('template', $modx->getOption('default_template'));
  102. $resource->set('menuindex', $modx->getCount('modResource', array ('parent' => $parent)));
  103. $resource->set('searchable', $modx->getOption('search_default'));
  104. $resource->set('cacheable', $modx->getOption('cache_default'));
  105. $resource->set('content', $content);
  106. if (!$resource->save()) {
  107. $results .= $modx->lexicon('import_site_failed') . "Could not import resource from {$filepath}/{$filename}: <br />" . nl2br(print_r($modx->errorInfo(), true));
  108. } else {
  109. $results .= $modx->lexicon('import_site_success') . "<br />";
  110. }
  111. }
  112. }
  113. }
  114. }
  115. }
  116. if (!function_exists('getFileContent')) {
  117. function getFileContent(& $modx, & $results, $file) {
  118. /* get the file */
  119. if (@ $handle= fopen($file, "r")) {
  120. $buffer= "";
  121. while (!feof($handle)) {
  122. $buffer .= fgets($handle, 4096);
  123. }
  124. fclose($handle);
  125. } else {
  126. $results .= $modx->lexicon('import_site_failed') . " Could not retrieve document '$file'.<br />";
  127. }
  128. return $buffer;
  129. }
  130. }
  131. if (!function_exists('aliasCheck')) {
  132. function getResourceAlias(& $modx, & $resource, & $results, $alias, $parent, $context= 'web') {
  133. /* auto assign alias */
  134. if ($alias == '' && $modx->getOption('automatic_alias')) {
  135. $alias= strtolower(trim($resource->cleanAlias($resource->get('pagetitle'))));
  136. } else {
  137. $alias= $resource->cleanAlias($alias);
  138. }
  139. $resourceContext= $modx->getObject('modContext', $context);
  140. $resourceContext->prepare(true);
  141. $isHtml= true;
  142. $extension= '';
  143. $containerSuffix= $modx->getOption('container_suffix',null,'');
  144. if ($contentType= $modx->getObject('modContentType', 1)) {
  145. $extension= $contentType->getExtension();
  146. $isHtml= (strpos($contentType->get('mime_type'), 'html') !== false);
  147. }
  148. if ($resource->get('isfolder') && $isHtml && !empty ($containerSuffix)) {
  149. $extension= $containerSuffix;
  150. }
  151. $aliasPath= '';
  152. if ($modx->getOption('use_alias_path')) {
  153. $pathParentId= intval($parent);
  154. $parentResources= array ();
  155. $currResource= $modx->getObject('modResource', $pathParentId);
  156. while ($currResource) {
  157. $parentAlias= $currResource->get('alias');
  158. if (empty ($parentAlias))
  159. $parentAlias= "{$pathParentId}";
  160. $parentResources[]= "{$parentAlias}";
  161. $pathParentId= $currResource->get('parent');
  162. $currResource= $currResource->getOne('Parent');
  163. }
  164. $aliasPath= !empty ($parentResources) ? implode('/', array_reverse($parentResources)) : '';
  165. }
  166. $fullAlias= $aliasPath . $alias . $extension;
  167. $iterations= 3;
  168. $origAlias= $alias;
  169. while (isset ($resourceContext->aliasMap[$fullAlias]) && $iterations > 0) {
  170. $iterations--;
  171. $duplicateId= $resourceContext->aliasMap[$fullAlias];
  172. $results .= $modx->lexicon('import_duplicate_alias_found',array(
  173. 'id' => $duplicateId,
  174. 'alias' => $fullAlias
  175. ));
  176. $alias= $origAlias . '-' . substr(uniqid(''), -3);
  177. $fullAlias= $aliasPath . $alias . $extension;
  178. }
  179. return $alias;
  180. }
  181. }
  182. $importstart= $modx->getMicroTime();
  183. $results= '';
  184. $allowedfiles= array (
  185. 'html',
  186. 'htm',
  187. 'xml'
  188. );
  189. $context= 'web';
  190. $parent= 0;
  191. if (isset ($scriptProperties['import_context'])) {
  192. $context= $scriptProperties['import_context'];
  193. }
  194. if (isset ($scriptProperties['import_parent'])) {
  195. $parent= intval($scriptProperties['import_parent']);
  196. }
  197. $element= isset ($scriptProperties['content_element']) ? $scriptProperties['content_element'] : 'body';
  198. $filepath= isset ($scriptProperties['filepath']) ? $scriptProperties['filepath'] : $modx->getOption('core_path') . 'import/';
  199. $filesfound= 0;
  200. $files= getFiles($modx, $results, $filesfound, $filepath);
  201. /* no. of files to import */
  202. $results .= sprintf($modx->lexicon('import_files_found'), $filesfound);
  203. /* import files */
  204. if (count($files) > 0) {
  205. importFiles($modx, $results, $allowedfiles, $parent, $filepath, $files, $context);
  206. }
  207. $importend= $modx->getMicroTime();
  208. $totaltime= ($importend - $importstart);
  209. $results .= sprintf("<p />" . $modx->lexicon('import_site_time'), round($totaltime, 3));
  210. return $modx->error->success($results);