国内流行的内容管理系统(CMS)多端全媒体解决方案 https://www.dedebiz.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

591 line
21KB

  1. <?php
  2. /**
  3. * 模块管理
  4. *
  5. * @version $Id: module_main.php 1 14:17 2010年7月20日Z tianya $
  6. * @package DedeBIZ.Administrator
  7. * @copyright Copyright (c) 2020, DedeBIZ.COM
  8. * @license https://www.dedebiz.com/license
  9. * @link https://www.dedebiz.com
  10. */
  11. require_once(dirname(__FILE__) . "/config.php");
  12. CheckPurview('sys_module');
  13. require_once(dirname(__FILE__) . "/../include/dedemodule.class.php");
  14. require_once(dirname(__FILE__) . "/../include/oxwindow.class.php");
  15. if (empty($action)) $action = '';
  16. require_once(DEDEDATA . "/admin/config_update.php");
  17. $mdir = DEDEDATA . '/module';
  18. $mdurl = "";
  19. function TestWriteAble($d)
  20. {
  21. $tfile = '_dedet.txt';
  22. $d = preg_replace("#\/$#", '', $d);
  23. $fp = @fopen($d . '/' . $tfile, 'w');
  24. if (!$fp) return FALSE;
  25. else {
  26. fclose($fp);
  27. $rs = @unlink($d . '/' . $tfile);
  28. if ($rs) return TRUE;
  29. else return FALSE;
  30. }
  31. }
  32. function ReWriteConfigAuto()
  33. {
  34. global $dsql;
  35. $configfile = DEDEDATA . '/config.cache.inc.php';
  36. if (!is_writeable($configfile)) {
  37. echo "配置文件'{$configfile}'不支持写入,无法修改系统配置参数!";
  38. //ClearAllLink();
  39. exit();
  40. }
  41. $fp = fopen($configfile, 'w');
  42. flock($fp, 3);
  43. fwrite($fp, "<" . "?php\r\n");
  44. $dsql->SetQuery("SELECT `varname`,`type`,`value`,`groupid` FROM `#@__sysconfig` ORDER BY aid ASC ");
  45. $dsql->Execute();
  46. while ($row = $dsql->GetArray()) {
  47. if ($row['type'] == 'number') fwrite($fp, "\${$row['varname']} = " . $row['value'] . ";\r\n");
  48. else fwrite($fp, "\${$row['varname']} = '" . str_replace("'", '', $row['value']) . "';\r\n");
  49. }
  50. fwrite($fp, "?" . ">");
  51. fclose($fp);
  52. }
  53. /*--------------
  54. function ShowAll();
  55. --------------*/
  56. if ($action == '') {
  57. $types = array('soft' => '模块', 'templets' => '模板', 'plus' => '小插件', 'patch' => '补丁');
  58. $dm = new DedeModule($mdir);
  59. if (empty($moduletype)) $moduletype = '';
  60. $modules_remote = $dm->GetModuleUrlList($moduletype, $mdurl);
  61. $modules = array();
  62. $modules = $dm->GetModuleList($moduletype);
  63. is_array($modules) || $modules = array();
  64. if (is_array($modules_remote) && count($modules_remote) > 0) {
  65. $modules = array_merge($modules, $modules_remote);
  66. }
  67. require_once(dirname(__FILE__) . "/templets/module_main.htm");
  68. $dm->Clear();
  69. exit();
  70. }
  71. /*--------------
  72. function ViewDevelopoer();
  73. --------------*/ else if ($action == 'view_developoer') {
  74. // 检验开发者信息
  75. $dm = new DedeModule($mdir);
  76. $info = $dm->GetModuleInfo($hash);
  77. if ($info == null) {
  78. ShowMsg("获取模块信息错误,模块文件可能被篡改", -1);
  79. exit;
  80. }
  81. $dev_id = $info['dev_id'];
  82. $devURL = DEDECDNURL . "/developers/$dev_id.json";
  83. $dhd = new DedeHttpDown();
  84. $dhd->OpenUrl($devURL);
  85. $devContent = $dhd->GetHtml();
  86. $devInfo = (array)json_decode($devContent);
  87. $offUrl = "";
  88. if ($devInfo['dev_type'] == 1) {
  89. $offUrl = "<p>官方网址:<code>{$devInfo['offurl']}</code> <small>(复制在浏览器中打开)</small></p>";
  90. }
  91. $authAt = date("Y-m-d", $devInfo['auth_at']);
  92. ShowMsg("<div class='text-left'><p>开发者名称:{$devInfo['dev_name']}</p><p>开发者全称:{$devInfo['realname']}</p><p>开发者ID:{$devInfo['dev_id']} <a class='btn btn-secondary btn-sm' target='_blank' href='{$cfg_biz_dedebizUrl}/developer?dev_id={$devInfo['dev_id']}'>查看详情</a></p>$offUrl<p>认证于:{$authAt}</p></a>", "javascript:;");
  93. exit;
  94. }
  95. /*--------------
  96. function Setup();
  97. --------------*/ else if ($action == 'setup') {
  98. $dm = new DedeModule($mdir);
  99. $infos = $dm->GetModuleInfo($hash);
  100. if ($infos == null) {
  101. ShowMsg("获取模块信息错误,模块文件可能被篡改", -1);
  102. exit;
  103. }
  104. $alertMsg = ($infos['lang'] == $cfg_soft_lang ? '' : '<br /><font color="red">(这个模块的语言编码与你系统的编码不一致,请向开发者确认它的兼容性)</font>');
  105. $filelists = $dm->GetFileLists($hash);
  106. $filelist = '';
  107. $prvdirs = array();
  108. $incdir = array();
  109. foreach ($filelists as $v) {
  110. if (empty($v['name'])) continue;
  111. if ($v['type'] == 'dir') {
  112. $v['type'] = '目录';
  113. $incdir[] = $v['name'];
  114. } else {
  115. $v['type'] = '文件';
  116. }
  117. $filelist .= "{$v['type']}|{$v['name']}\r\n";
  118. }
  119. //检测需要的目录权限
  120. foreach ($filelists as $v) {
  121. $prvdir = preg_replace("#\/([^\/]*)$#", '/', $v['name']);
  122. if (!preg_match("#^\.#", $prvdir)) $prvdir = './';
  123. $n = TRUE;
  124. foreach ($incdir as $k => $v) {
  125. if (preg_match("#^" . $v . "#i", $prvdir)) {
  126. $n = FALSE;
  127. break;
  128. }
  129. }
  130. if (!isset($prvdirs[$prvdir]) && $n && is_dir($prvdir)) {
  131. $prvdirs[$prvdir][0] = 1;
  132. $prvdirs[$prvdir][1] = TestWriteAble($prvdir);
  133. }
  134. }
  135. $prvdir = "<table cellpadding='1' cellspacing='1' width='350' bgcolor='#cfcfcf' style='margin-top:5px;'>\r\n";
  136. $prvdir .= "<tr style='background:#FBFCE2'><th width='270'>目录</td><th align='center'>可写</td></tr>\r\n";
  137. foreach ($prvdirs as $k => $v) {
  138. if ($v) $cw = '√';
  139. else $cw = '<font color="red">×</font>';
  140. $prvdir .= "<tr bgcolor='#ffffff'><td >$k</td>";
  141. $prvdir .= "<td align='center' >$cw</td></tr>\r\n";
  142. }
  143. $prvdir .= "</table>";
  144. $win = new OxWindow();
  145. $win->Init("module_main.php", "js/blank.js", "post");
  146. $wecome_info = "模块管理";
  147. $win->AddTitle("&nbsp;<a href='module_main.php'>模块管理</a> &gt;&gt; 安装模块: {$infos['name']}");
  148. $win->AddHidden("hash", $hash);
  149. $win->AddHidden("action", 'setupstart');
  150. $msg = "<style>.dtb{border-bottom:1px dotted #cccccc}</style>
  151. <table width='98%' border='0' cellspacing='0' cellpadding='0' class='table'>
  152. <tr>
  153. <td width='20%' height='28' class='dtb'>模块名称:</td>
  154. <td width='80%' class='dtb'>{$infos['name']}</td>
  155. </tr>
  156. <tr>
  157. <td height='28' class='dtb'>语言:</td>
  158. <td class='dtb'>{$infos['lang']} {$alertMsg}</td>
  159. </tr>
  160. <tr>
  161. <td height='28' class='dtb'>文件大小:</td>
  162. <td class='dtb'>{$infos['filesize']}</td>
  163. </tr>
  164. <tr>
  165. <td height='28' class='dtb'>开发者ID:</td>
  166. <td class='dtb'>{$infos['dev_id']} <a class='btn btn-secondary btn-sm' target='_blank' href='{$cfg_biz_dedebizUrl}/developer?dev_id={$infos['dev_id']}'>查看详情</a></td>
  167. </tr>
  168. <tr>
  169. <td height='28' class='dtb'>发布时间:</td>
  170. <td class='dtb'>{$infos['time']}</td>
  171. </tr>
  172. <tr>
  173. <td height='28' class='dtb'>使用协议:</td>
  174. <td class='dtb'><a href='module_main.php?action=showreadme&hash={$hash}' target='_blank'>点击浏览...</a></td>
  175. </tr>
  176. <tr>
  177. <td height='30' class='dtb' colspan='2'>
  178. <div class='alert alert-danger'>
  179. <b>注意事项:</b>
  180. 安装时请确保文件列表中涉及的目录前可写入权限,此外“后台管理目录”、“后台管理目录/templets”目录也必须暂时设置可写入权限。
  181. </div>
  182. </td>
  183. </tr>
  184. <tr>
  185. <td height='30'><b>目录权限检测:</b><br /> ../ 为根目录 <br /> ./ 表示当前目录</td>
  186. <td>
  187. $prvdir
  188. </td>
  189. </tr>
  190. <tr>
  191. <td height='30'>模块包含的所有文件列表:</td>
  192. <td></td>
  193. </tr>
  194. <tr>
  195. <td height='164' colspan='2'>
  196. <textarea name='filelists' id='filelists' style='width:90%;height:200px'>{$filelist}</textarea>
  197. </td>
  198. </tr>
  199. <tr>
  200. <td height='28'>对于已存在文件处理方法:</td>
  201. <td>
  202. <label><input name='isreplace' type='radio' value='1' checked='checked' />
  203. 覆盖</label>
  204. <label><input name='isreplace' type='radio' value='3' />
  205. 覆盖,保留副本</label>
  206. <label><input type='radio' name='isreplace' value='0' />
  207. 保留旧文件</label>
  208. </td>
  209. </tr>
  210. </table>
  211. ";
  212. $win->AddMsgItem("<div style='padding-left:10px;line-height:150%'>$msg</div>");
  213. $winform = $win->GetWindow("ok", "");
  214. $win->Display();
  215. $dm->Clear();
  216. exit();
  217. }
  218. /*---------------
  219. function SetupRun()
  220. --------------*/ else if ($action == 'setupstart') {
  221. if (!is_writeable($mdir)) {
  222. ShowMsg("目录 {$mdir} 不支持写入,这将导致安装程序没法正常创建!", "-1");
  223. exit();
  224. }
  225. $dm = new DedeModule($mdir);
  226. $minfos = $dm->GetModuleInfo($hash);
  227. extract($minfos, EXTR_SKIP);
  228. $menustring = addslashes($dm->GetSystemFile($hash, 'menustring'));
  229. $indexurl = str_replace('**', '=', $indexurl);
  230. $query = "INSERT INTO `#@__sys_module`(`hashcode` , `modname` , `indexname` , `indexurl` , `ismember` , `menustring` )
  231. VALUES ('$hash' , '$name' , '$indexname' , '$indexurl' , '$ismember' , '$menustring' ) ";
  232. $rs = $dsql->ExecuteNoneQuery("DELETE FROM `#@__sys_module` WHERE hashcode LIKE '$hash' ");
  233. $rs = $dsql->ExecuteNoneQuery($query);
  234. if (!$rs) {
  235. ShowMsg('保存数据库信息失败,无法完成安装!' . $dsql->GetError(), 'javascript:;');
  236. exit();
  237. }
  238. $dm->WriteFiles($hash, $isreplace);
  239. $filename = '';
  240. if (!isset($autosetup) || $autosetup == 0) $filename = $dm->WriteSystemFile($hash, 'setup');
  241. if (!isset($autodel) || $autodel == 0) $dm->WriteSystemFile($hash, 'uninstall');
  242. $dm->WriteSystemFile($hash, 'readme');
  243. $dm->Clear();
  244. //用模块的安装程序安装
  245. if (!isset($autosetup) || $autosetup == 0) {
  246. include(DEDEDATA . '/module/' . $filename);
  247. exit();
  248. }
  249. //系统自动安装
  250. else {
  251. $mysql_version = $dsql->GetVersion(TRUE);
  252. //默认使用MySQL 4.1 以下版本的SQL语句,对大于4.1版本采用替换处理 TYPE=MyISAM ==> ENGINE=MyISAM DEFAULT CHARSET=#~lang~#
  253. $setupsql = $dm->GetSystemFile($hash, 'setupsql40');
  254. $setupsql = preg_replace("#ENGINE=MyISAM#i", 'TYPE=MyISAM', $setupsql);
  255. $sql41tmp = 'ENGINE=MyISAM DEFAULT CHARSET=' . $cfg_db_language;
  256. if ($mysql_version >= 4.1) {
  257. $setupsql = preg_replace("#TYPE=MyISAM#i", $sql41tmp, $setupsql);
  258. }
  259. //_ROOTURL_
  260. if ($cfg_cmspath == '/') $cfg_cmspath = '';
  261. $rooturl = $cfg_basehost . $cfg_cmspath;
  262. $setupsql = preg_replace("#_ROOTURL_#i", $rooturl, $setupsql);
  263. $setupsql = preg_replace("#[\r\n]{1,}#", "\n", $setupsql);
  264. $sqls = @split(";[ \t]{0,}\n", $setupsql);
  265. foreach ($sqls as $sql) {
  266. if (trim($sql) != '') $dsql->ExecuteNoneQuery($sql);
  267. }
  268. ReWriteConfigAuto();
  269. $rflwft = "<script language='javascript' type='text/javascript'>\r\n";
  270. $rflwft .= "if(window.navigator.userAgent.indexOf('MSIE')>=1) top.document.frames.menu.location = 'index_menu_module.php';\r\n";
  271. $rflwft .= "else top.document.getElementById('menufra').src = 'index_menu_module.php';\r\n";
  272. $rflwft .= "</script>";
  273. echo $rflwft;
  274. UpDateCatCache();
  275. ShowMsg('模块安装完成...', 'module_main.php');
  276. exit();
  277. }
  278. }
  279. /*--------------
  280. function DelModule();
  281. --------------*/ else if ($action == 'del') {
  282. $dm = new DedeModule($mdir);
  283. $infos = $dm->GetModuleInfo($hash);
  284. $alertMsg = ($infos['lang'] == $cfg_soft_lang ? '' : '<br /><font color="red">(这个模块的语言编码与你系统的编码不一致,请向开发者确认它的兼容性)</font>');
  285. $win = new OxWindow();
  286. $win->Init("module_main.php", "js/blank.js", "post");
  287. $wecome_info = "模块管理";
  288. $win->AddTitle("<a href='module_main.php'>模块管理</a> &gt;&gt; 删除模块: {$infos['name']}");
  289. $win->AddHidden('hash', $hash);
  290. $win->AddHidden('action', 'delok');
  291. $msg = "<style>.dtb{border-bottom:1px dotted #cccccc}</style>
  292. <table width='750' border='0' cellspacing='0' cellpadding='0'>
  293. <tr>
  294. <td width='20%' height='28' class='dtb'>模块名称:</td>
  295. <td width='80%' class='dtb'>{$infos['name']}</td>
  296. </tr>
  297. <tr>
  298. <td height='28' class='dtb'>语言:</td>
  299. <td class='dtb'>{$infos['lang']} {$alertMsg}</td>
  300. </tr>
  301. <tr>
  302. <td height='28' class='dtb'>文件大小:</td>
  303. <td class='dtb'>{$infos['filesize']}</td>
  304. </tr>
  305. <tr>
  306. <td height='28' class='dtb'>开发者ID:</td>
  307. <td class='dtb'>{$infos['dev_id']} <a class='btn btn-secondary btn-sm' target='_blank' href='{$cfg_biz_dedebizUrl}/developer?dev_id={$infos['dev_id']}'>查看详情</a></td>
  308. </tr>
  309. <tr>
  310. <td height='28' class='dtb'>发布时间:</td>
  311. <td class='dtb'>{$infos['time']}</td>
  312. </tr>
  313. <tr>
  314. <td height='28' class='dtb'>使用协议:</td>
  315. <td class='dtb'><a href='module_main.php?action=showreadme&hash={$hash}' target='_blank'>点击浏览...</a></td>
  316. </tr>
  317. <tr>
  318. <td height='28' colspan='2'>
  319. 删除模块仅删除这个模块的安装包文件,如果你已经安装,请执行<a href='module_main.php?hash={$hash}&action=uninstall'><u>卸载程序</u></a>来删除!
  320. </td>
  321. </tr>
  322. </table>
  323. ";
  324. $win->AddMsgItem("<div style='padding-left:10px;line-height:150%'>$msg</div>");
  325. $winform = $win->GetWindow("ok", "");
  326. $win->Display();
  327. $dm->Clear();
  328. exit();
  329. } else if ($action == 'delok') {
  330. $dm = new DedeModule($mdir);
  331. $modfile = $mdir . "/" . $dm->GetHashFile($hash);
  332. unlink($modfile) or die("删除文件 {$modfile} 失败!");
  333. ShowMsg("成功删除一个模块文件!", "module_main.php");
  334. exit();
  335. }
  336. /*--------------
  337. function UnInstall();
  338. --------------*/ else if ($action == 'uninstall') {
  339. $dm = new DedeModule($mdir);
  340. $infos = $dm->GetModuleInfo($hash);
  341. if ($infos['url'] == '') $infos['url'] = '&nbsp;';
  342. $alertMsg = ($infos['lang'] == $cfg_soft_lang ? '' : '<br /><font color="red">(这个模块的语言编码与你系统的编码不一致,请向开发者确认它的兼容性)</font>');
  343. $filelists = $dm->GetFileLists($hash);
  344. $filelist = '';
  345. foreach ($filelists as $v) {
  346. if (empty($v['name'])) continue;
  347. if ($v['type'] == 'dir') $v['type'] = '目录';
  348. else $v['type'] = '文件';
  349. $filelist .= "{$v['type']}|{$v['name']}\r\n";
  350. }
  351. $win = new OxWindow();
  352. $win->Init("module_main.php", "js/blank.js", "post");
  353. $wecome_info = "模块管理";
  354. $win->AddTitle("<a href='module_main.php'>模块管理</a> &gt;&gt; 卸载模块: {$infos['name']}");
  355. $win->AddHidden("hash", $hash);
  356. $win->AddHidden("action", 'uninstallok');
  357. $msg = "<style>.dtb{border-bottom:1px dotted #cccccc}</style>
  358. <table width='750' border='0' cellspacing='0' cellpadding='0'>
  359. <tr>
  360. <td width='200' height='28' class='dtb'>模块名称:</td>
  361. <td width='550' class='dtb'>{$infos['name']}</td>
  362. </tr>
  363. <tr>
  364. <td height='28' class='dtb'>语言:</td>
  365. <td class='dtb'>{$infos['lang']} {$alertMsg}</td>
  366. </tr>
  367. <tr>
  368. <td height='28' class='dtb'>文件大小:</td>
  369. <td class='dtb'>{$infos['filesize']}</td>
  370. </tr>
  371. <tr>
  372. <td height='28' class='dtb'>开发者ID:</td>
  373. <td class='dtb'>{$infos['dev_id']} <a class='btn btn-secondary btn-sm' target='_blank' href='{$cfg_biz_dedebizUrl}/developer?dev_id={$infos['dev_id']}'>查看详情</a></td>
  374. </tr>
  375. <tr>
  376. <td height='28' class='dtb'>发布时间:</td>
  377. <td class='dtb'>{$infos['time']}</td>
  378. </tr>
  379. <tr>
  380. <td height='28' class='dtb'>使用协议:</td>
  381. <td class='dtb'><a href='module_main.php?action=showreadme&hash={$hash}' target='_blank'>点击浏览...</a></td>
  382. </tr>
  383. <tr>
  384. <td height='28'>模块包含的文件:<br />(文件路径相对于当前目录)</td><td>&nbsp;</td>
  385. </tr>
  386. <tr>
  387. <td height='164' colspan='2'>
  388. <textarea name='filelists' id='filelists' style='width:90%;height:200px'>{$filelist}</textarea>
  389. </td>
  390. </tr>
  391. <tr>
  392. <td height='28'>对于模块的文件处理方法:</td>
  393. <td>
  394. <input type='radio' name='isreplace' value='0' checked='checked' />
  395. 手工删除文件,仅运行卸载程序
  396. <input name='isreplace' type='radio' value='2' />
  397. 删除模块的所有文件
  398. </td>
  399. </tr>
  400. </table>
  401. ";
  402. $win->AddMsgItem("<div style='padding-left:10px;line-height:150%'>$msg</div>");
  403. $winform = $win->GetWindow("ok", "");
  404. $win->Display();
  405. $dm->Clear();
  406. exit();
  407. }
  408. /*--------------
  409. function UnInstallRun();
  410. --------------*/ else if ($action == 'uninstallok') {
  411. $dsql->ExecuteNoneQuery("DELETE FROM `#@__sys_module` WHERE hashcode LIKE '$hash' ");
  412. $dm = new DedeModule($mdir);
  413. $minfos = $dm->GetModuleInfo($hash);
  414. extract($minfos, EXTR_SKIP);
  415. if (!isset($moduletype) || $moduletype != 'patch') {
  416. $dm->DeleteFiles($hash, $isreplace);
  417. }
  418. @$dm->DelSystemFile($hash, 'readme');
  419. @$dm->DelSystemFile($hash, 'setup');
  420. $dm->Clear();
  421. if (!isset($autodel) || $autodel == 0) {
  422. include(DEDEDATA . "/module/{$hash}-uninstall.php");
  423. @unlink(DEDEDATA . "/module/{$hash}-uninstall.php");
  424. exit();
  425. } else {
  426. @$dm->DelSystemFile($hash, 'uninstall');
  427. $delsql = $dm->GetSystemFile($hash, 'delsql');
  428. if (trim($delsql) != '') {
  429. $sqls = explode(';', $delsql);
  430. foreach ($sqls as $sql) {
  431. if (trim($sql) != '') $dsql->ExecuteNoneQuery($sql);
  432. }
  433. }
  434. ReWriteConfigAuto();
  435. $rflwft = "<script language='javascript' type='text/javascript'>\r\n";
  436. $rflwft .= "if(window.navigator.userAgent.indexOf('MSIE')>=1) top.document.frames.menu.location = 'index_menu_module.php';\r\n";
  437. $rflwft .= "else top.document.getElementById('menufra').src = 'index_menu_module.php';\r\n";
  438. $rflwft .= "</script>";
  439. echo $rflwft;
  440. ShowMsg('模块卸载完成...', 'module_main.php');
  441. exit();
  442. }
  443. }
  444. /*--------------
  445. function ShowReadme();
  446. --------------*/ else if ($action == 'showreadme') {
  447. $dm = new DedeModule($mdir);
  448. $msg = $dm->GetSystemFile($hash, 'readme');
  449. $msg = preg_replace("/(.*)<body/isU", "", $msg);
  450. $msg = preg_replace("/<\/body>(.*)/isU", "", $msg);
  451. $dm->Clear();
  452. $win = new OxWindow();
  453. $win->Init("module_main.php", "js/blank.js", "post");
  454. $wecome_info = "模块管理";
  455. $win->AddTitle("<a href='module_main.php'>模块管理</a> &gt;&gt; 使用说明:");
  456. $win->AddMsgItem("<div style='padding-left:10px;line-height:150%'>$msg</div>");
  457. $winform = $win->GetWindow("hand");
  458. $win->Display();
  459. exit();
  460. }
  461. /*--------------
  462. function ViewOne();
  463. --------------*/ else if ($action == 'view') {
  464. $dm = new DedeModule($mdir);
  465. $infos = $dm->GetModuleInfo($hash);
  466. if ($infos['url'] == '') $infos['url'] = '&nbsp;';
  467. $alertMsg = ($infos['lang'] == $cfg_soft_lang ? '' : '<br /><font color="red">(这个模块的语言编码与你系统的编码不一致,请向开发者确认它的兼容性)</font>');
  468. $filelists = $dm->GetFileLists($hash);
  469. $filelist = '';
  470. $setupinfo = '';
  471. foreach ($filelists as $v) {
  472. if (empty($v['name'])) continue;
  473. if ($v['type'] == 'dir') $v['type'] = '目录';
  474. else $v['type'] = '文件';
  475. $filelist .= "{$v['type']}|{$v['name']}\r\n";
  476. }
  477. if (file_exists(DEDEDATA . "/module/{$hash}-readme.php")) {
  478. $setupinfo = "已安装 <a href='module_main.php?action=uninstall&hash={$hash}'>卸载</a>";
  479. } else {
  480. $setupinfo = "未安装 <a href='module_main.php?action=setup&hash={$hash}'>安装</a>";
  481. }
  482. $win = new OxWindow();
  483. $win->Init("", "js/blank.js", "");
  484. $wecome_info = "模块管理";
  485. $win->AddTitle("<a href='module_main.php'>模块管理</a> &gt;&gt; 模块详情: {$infos['name']}");
  486. $msg = "<style>.dtb{border-bottom:1px dotted #cccccc}</style>
  487. <table width='98%' border='0' cellspacing='0' cellpadding='0'>
  488. <tr>
  489. <td width='20%' height='28' class='dtb'>模块名称:</td>
  490. <td width='80%' class='dtb'>{$infos['name']}</td>
  491. </tr>
  492. <tr>
  493. <td height='28' class='dtb'>语言:</td>
  494. <td class='dtb'>{$infos['lang']} {$alertMsg}</td>
  495. </tr>
  496. <tr>
  497. <td height='28' class='dtb'>文件大小:</td>
  498. <td class='dtb'>{$infos['filesize']}</td>
  499. </tr>
  500. <tr>
  501. <td height='28' class='dtb'>开发者ID:</td>
  502. <td class='dtb'>{$infos['dev_id']} <a class='btn btn-secondary btn-sm' target='_blank' href='{$cfg_biz_dedebizUrl}/developer?dev_id={$infos['dev_id']}'>查看详情</a></td>
  503. </tr>
  504. <tr>
  505. <td height='28' class='dtb'>发布时间:</td>
  506. <td class='dtb'>{$infos['time']}</td>
  507. </tr>
  508. <tr>
  509. <td height='28' class='dtb'>使用协议:</td>
  510. <td class='dtb'><a href='module_main.php?action=showreadme&hash={$hash}' target='_blank'>点击浏览...</a></td>
  511. </tr>
  512. <tr>
  513. <td height='28'>模块包含的文件:<br />(文件路径相对于当前目录)</td><td>&nbsp;</td>
  514. </tr>
  515. <tr>
  516. <td height='164' colspan='2'>
  517. <textarea name='filelists' id='filelists' style='width:90%;height:200px'>{$filelist}</textarea>
  518. </td>
  519. </tr>
  520. </table>
  521. ";
  522. $win->AddMsgItem("<div style='padding-left:10px;line-height:150%'>$msg</div>");
  523. $winform = $win->GetWindow('hand', '');
  524. $win->Display();
  525. $dm->Clear();
  526. exit();
  527. }
  528. /*--------------
  529. function Edit();
  530. --------------*/ else if ($action == 'edit') {
  531. $dm = new DedeModule($mdir);
  532. $minfos = $dm->GetModuleInfo($hash);
  533. extract($minfos, EXTR_SKIP);
  534. if (!isset($lang)) $lang = 'gb2312';
  535. if (!isset($moduletype)) $moduletype = 'soft';
  536. $menustring = $dm->GetSystemFile($hash, 'menustring');
  537. $setupsql40 = dede_htmlspecialchars($dm->GetSystemFile($hash, 'setupsql40'));
  538. $readmetxt = $dm->GetSystemFile($hash, 'readme');
  539. $delsql = $dm->GetSystemFile($hash, 'delsql');
  540. $filelist = $dm->GetSystemFile($hash, 'oldfilelist', false);
  541. $indexurl = str_replace('**', '=', $indexurl);
  542. $dm->Clear();
  543. require_once(dirname(__FILE__) . '/templets/module_edit.htm');
  544. exit();
  545. }
  546. /*--------------
  547. function Download();
  548. --------------*/ else if ($action == 'download') {
  549. ShowMsg("暂不支持模块下载功能", "javascript:;");
  550. }