Themes.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. <?php
  2. /**
  3. * @copyright Copyright (c) 2017 https://www.sapixx.com All rights reserved.
  4. * @license Licensed (http://www.apache.org/licenses/LICENSE-2.0).
  5. * @author pillar<ltmn@qq.com>
  6. * 数据字典管理
  7. */
  8. namespace app\system\controller\cms;
  9. use util\Util;
  10. use filter\Filter;
  11. use think\Validate;
  12. use Exception;
  13. class Themes extends Common{
  14. /**
  15. * 首页
  16. */
  17. public function index(){
  18. $folder = Filter::filter_path_strict($this->request->param('folder'));
  19. $path[] = ['name'=>'根目录','url' => url('cms.themes/index')];
  20. if($this->isFolder($folder)){
  21. $folder_dir = Util::array_remove_empty(explode('/',$folder));
  22. $folder_name = '';
  23. foreach ($folder_dir as $key => $value) {
  24. $folder_name = $key ? $folder_name.'/'.$value : $value;
  25. $path[] = ['name'=>$value,'url' => url('cms.themes/index',['folder'=>$folder_name]),];
  26. }
  27. }
  28. $view['folder_path'] = $folder ? $folder.'/':'';
  29. $view['files'] = $this->folder($folder);
  30. $view['folder'] = $folder;
  31. $view['pathMaps'] = $path;
  32. return view()->assign($view);
  33. }
  34. /**
  35. * 创建目录
  36. * @return void
  37. */
  38. public function createFolder(){
  39. $folder = Filter::filter_path_strict($this->request->param('folder'));
  40. if($this->request->isPost()){
  41. if(!$this->isFolder($folder)){
  42. return enjson(0,'目录不存在');
  43. }
  44. $foldername = $this->request->param('foldername');
  45. if(!Validate::make()->rule(['foldername' => 'alpha|require'])->check(['foldername' => $foldername])){
  46. return enjson(0,'目录名称只能是字母');
  47. }
  48. $folderPath = $this->folderPath($folder).strtolower($foldername);
  49. if(Util::mkdir($folderPath)){
  50. return enjson(200,'目录创建成功');
  51. }
  52. return enjson(0,'目录创建失败');
  53. }else{
  54. if(!$this->isFolder($folder)){
  55. $this->error('目录不存在');
  56. }
  57. $view['folderpath'] = $folder.'/';
  58. $this->view->engine->layout('admin/main');
  59. return view()->assign($view);
  60. }
  61. }
  62. /**
  63. * 修改目录
  64. * @return void
  65. */
  66. public function editFolder(){
  67. $folder = Filter::filter_path_strict($this->request->param('folder'));
  68. if($this->request->isPost()){
  69. if(!$this->isFolder($folder)){
  70. return enjson(0,'目录不存在');
  71. }
  72. $folderpath = Filter::filter_path_strict($this->request->param('folderpath'));
  73. if(!$this->isFolder($folderpath)){
  74. return enjson(0,'目录不存在');
  75. }
  76. $foldername = $this->request->param('foldername');
  77. if(!Validate::make()->rule(['foldername' => 'alpha|require'])->check(['foldername' => $foldername])){
  78. return enjson(0,'目录名称只能是字母');
  79. }
  80. $folderPath = $this->folderPath($folderpath).strtolower($foldername);
  81. if(rename($this->folderPath($folder),$folderPath)){
  82. return enjson(200,'目录重命名成功');
  83. }
  84. return enjson(0,'目录重命名失败');
  85. }else{
  86. if(!$this->isFolder($folder)){
  87. $this->error('目录不存在');
  88. }
  89. $folder_dir = Util::array_remove_empty(explode('/',$folder));
  90. $foldername = $folder_dir[count($folder_dir)-1];
  91. $view['foldername'] = $foldername;
  92. $view['folderpath'] = substr_replace($folder,'',-strlen($foldername));
  93. $view['oldfolde'] = $folder;
  94. $this->view->engine->layout('admin/main');
  95. return view()->assign($view);
  96. }
  97. }
  98. /**
  99. * 删除空目录
  100. * @return void
  101. */
  102. public function deleteFolder(){
  103. $folder = Filter::filter_path_strict($this->request->param('folder'));
  104. if(!$this->isFolder($folder) || empty($folder)){
  105. return enjson(0,'目录不存在');
  106. }
  107. try {
  108. $folderPath = $this->folderPath($folder);
  109. if(rmdir($folderPath)){
  110. return enjson(200);
  111. }
  112. return enjson();
  113. }catch (\Exception $e) {
  114. return enjson(0,'目录非空或无操作775权限');
  115. }
  116. }
  117. /**
  118. * 编辑模板
  119. * @return void
  120. */
  121. public function createFile(){
  122. $folder = Filter::filter_path_strict($this->request->param('folder'));
  123. if(!$this->isFolder($folder)){
  124. $this->error('文件路径未找到');
  125. }
  126. if($this->request->isPost()){
  127. $filename = $this->request->param('filename');
  128. if(!Validate::make()->rule(['filename' => 'alpha|require'])->check(['filename' => $filename])){
  129. $this->error('文件名必须填写,且仅支持字母');
  130. }
  131. $folderPath = $this->folderPath($folder).strtolower($filename).'.html';
  132. if(is_file($folderPath)){
  133. $this->error('文件已经存在');
  134. }
  135. $filecontent = Filter::filter_phptag($this->request->param('filecontent','','htmlspecialchars_decode'));
  136. if(Util::mkfile($folderPath,$filecontent)){
  137. $this->error('文件创建成功',url('cms.themes/index',['folder' => $folder]));
  138. }
  139. $this->error('文件创建失败');
  140. }else{
  141. $path[] = ['name'=>'根目录','url' => url('cms.themes/index')];
  142. $folder_dir = Util::array_remove_empty(explode('/',$folder));
  143. $folder_name = '';
  144. foreach ($folder_dir as $key => $value) {
  145. $folder_name = $key ? $folder_name.'/'.$value : $value;
  146. $path[] = ['name'=>$value,'url' => url('cms.themes/index',['folder'=>$folder_name]),];
  147. }
  148. $view['filepath'] = $folder.'/';
  149. $view['pathMaps'] = $path;
  150. return view()->assign($view);
  151. }
  152. }
  153. /**
  154. * 编辑模板
  155. * @return void
  156. */
  157. public function editFile(){
  158. $file = Filter::filter_path_strict($this->request->param('file'));
  159. $folder = substr($file,0,strripos($file,"/"));
  160. if(!$this->isFolder($folder)){
  161. $this->error('文件路径未找到');
  162. }
  163. if($this->request->isPost()){
  164. $filecontent = Filter::filter_phptag($this->request->param('filecontent','','htmlspecialchars_decode'));
  165. $result = $this->tplEdit($file,$filecontent);
  166. if($result){
  167. return redirect('cms.themes/index',['folder' => $folder]);
  168. }
  169. $this->error('文件编辑失败');
  170. }else{
  171. $path[] = ['name'=>'根目录','url' => url('cms.themes/index')];
  172. $folder_dir = Util::array_remove_empty(explode('/',$folder));
  173. $folder_name = '';
  174. foreach ($folder_dir as $key => $value) {
  175. $folder_name = $key ? $folder_name.'/'.$value : $value;
  176. $path[] = ['name'=>$value,'url' => url('cms.themes/index',['folder'=>$folder_name]),];
  177. }
  178. $view['file'] = $file;
  179. $view['fileContent'] = $this->getFileContent($file);
  180. $view['filesname'] = basename($file);
  181. $view['filepath'] = $folder.'/';
  182. $view['pathMaps'] = $path;
  183. return view()->assign($view);
  184. }
  185. }
  186. /**
  187. * 删除文件
  188. * @return void
  189. */
  190. public function deleteFile(){
  191. $file = Filter::filter_path_strict($this->request->param('file'));
  192. $folder = substr($file,0,strripos($file,"/"));
  193. if(!$this->isFolder($folder) || empty($file)){
  194. $this->error('文件路径未找到');
  195. }
  196. try {
  197. $folder_dir = Util::array_remove_empty(explode('/',$file));
  198. $filepath = $this->folderPath($folder).$folder_dir[count($folder_dir)-1];
  199. if(file_exists($filepath)){
  200. if(unlink($filepath)){
  201. return enjson(200);
  202. }
  203. }
  204. return enjson();
  205. }catch (\Exception $e) {
  206. return enjson(0,'文件删除失败');
  207. }
  208. }
  209. /**
  210. * 查找包含目录
  211. * @param string $path
  212. * @return void
  213. */
  214. protected function isFolder($path = null){
  215. $path = realpath(PATH_THEMES.$path);
  216. return is_dir($path) ? true : false;
  217. }
  218. /**
  219. * 查找包含目录
  220. * @param string $path
  221. * @return void
  222. */
  223. protected function folderPath($path = null){
  224. $path = realpath(PATH_THEMES.$path);
  225. return is_dir($path) ? $path.DS : PATH_THEMES;
  226. }
  227. /**
  228. * 查找包含目录
  229. * @param string $path
  230. * @return void
  231. */
  232. protected function folder($path = null){
  233. $dirpath = $this->folderPath($path);
  234. $filearray = [];
  235. $files = scandir($dirpath);
  236. foreach ($files as $value) {
  237. if(is_dir($dirpath.$value)){
  238. if ($value != "." && $value != ".."){
  239. $filearray['folder'][] = $value;
  240. }
  241. }else{
  242. $filearray['file'] [] = $value;
  243. }
  244. }
  245. if(empty($filearray['folder'])){
  246. $filearray['folder'] = [];
  247. }
  248. if(empty($filearray['file'])){
  249. $filearray['file'] = [];
  250. }
  251. return $filearray;
  252. }
  253. /**
  254. * 读取文件内容
  255. *
  256. * @param [type] $files
  257. * @return void
  258. */
  259. protected function getFileContent($files){
  260. $files_path = PATH_THEMES.$files;
  261. if(is_file($files_path)){
  262. return file_get_contents($files_path);
  263. }
  264. return FALSE;
  265. }
  266. /**
  267. * 读取文件内容
  268. * @param [type] $files
  269. * @param [type] $file_contents
  270. * @return void
  271. */
  272. protected function TplEdit($files,$file_contents){
  273. $files_path = PATH_THEMES.$files;
  274. if(is_file($files_path)){
  275. if(file_put_contents($files_path,$file_contents)){
  276. return true;
  277. }
  278. }
  279. return FALSE;
  280. }
  281. }