admincp_prune.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. <?php
  2. /**
  3. * [Discuz!] (C)2001-2099 Comsenz Inc.
  4. * This is NOT a freeware, use is subject to license terms
  5. *
  6. * $Id: admincp_prune.php 29900 2012-05-02 08:17:44Z liulanbo $
  7. */
  8. if(!defined('IN_DISCUZ') || !defined('IN_ADMINCP')) {
  9. exit('Access Denied');
  10. }
  11. cpheader();
  12. $searchsubmit = $_GET['searchsubmit'];
  13. $fromumanage = $_GET['fromumanage'] ? 1 : 0;
  14. require_once libfile('function/misc');
  15. loadcache('forums');
  16. if(!submitcheck('prunesubmit')) {
  17. require_once libfile('function/forumlist');
  18. if($_G['adminid'] == 1 || $_G['adminid'] == 2) {
  19. $forumselect = '<select name="forums"><option value="">&nbsp;&nbsp;> '.$lang['select'].'</option>'.
  20. '<option value="">&nbsp;</option>'.forumselect(FALSE, 0, 0, TRUE).'</select>';
  21. if($_GET['forums']) {
  22. $forumselect = preg_replace("/(\<option value=\"$_GET[forums]\")(\>)/", "\\1 selected=\"selected\" \\2", $forumselect);
  23. }
  24. } else {
  25. $forumselect = $comma = '';
  26. $mfids = array();
  27. foreach(C::t('forum_moderator')->fetch_all_by_uid($_G['uid']) as $row) {
  28. $mfids[] = $row['fid'];
  29. }
  30. $query = C::t('forum_forum')->fetch_all_by_fid($mfids);
  31. foreach($query as $forum) {
  32. $forumselect .= $comma.$forum['name'];
  33. $comma = ', ';
  34. }
  35. $forumselect = $forumselect ? $forumselect : $lang['none'];
  36. }
  37. if($fromumanage) {
  38. $starttime = !preg_match("/^(0|\d{4}\-\d{1,2}\-\d{1,2})$/", $_GET['starttime']) ? '' : $_GET['starttime'];
  39. $endtime = $_G['adminid'] == 3 || !preg_match("/^(0|\d{4}\-\d{1,2}\-\d{1,2})$/", $_GET['endtime']) ? '' : $_GET['endtime'];
  40. } else {
  41. $starttime = !preg_match("/^(0|\d{4}\-\d{1,2}\-\d{1,2})$/", $_GET['starttime']) ? dgmdate(TIMESTAMP - 86400 * 7, 'Y-n-j') : $_GET['starttime'];
  42. $endtime = $_G['adminid'] == 3 || !preg_match("/^(0|\d{4}\-\d{1,2}\-\d{1,2})$/", $_GET['endtime']) ? dgmdate(TIMESTAMP, 'Y-n-j') : $_GET['endtime'];
  43. }
  44. shownav('topic', 'nav_prune'.($operation ? '_'.$operation : ''));
  45. showsubmenusteps('nav_prune'.($operation ? '_'.$operation : ''), array(
  46. array('prune_search', !$searchsubmit),
  47. array('nav_prune', $searchsubmit)
  48. ));
  49. showtips('prune_tips');
  50. echo <<<EOT
  51. <script type="text/javascript" src="static/js/calendar.js"></script>
  52. <script type="text/JavaScript">
  53. function page(number) {
  54. $('pruneforum').page.value=number;
  55. $('pruneforum').searchsubmit.click();
  56. }
  57. </script>
  58. EOT;
  59. $posttableselect = getposttableselect();
  60. showtagheader('div', 'searchposts', !$searchsubmit);
  61. showformheader("prune".($operation ? '&operation='.$operation : ''), '', 'pruneforum');
  62. showhiddenfields(array('page' => $page, 'pp' => $_GET['pp'] ? $_GET['pp'] : $_GET['perpage']));
  63. showtableheader();
  64. showsetting('prune_search_detail', 'detail', $_GET['detail'], 'radio');
  65. if($posttableselect) {
  66. showsetting('prune_search_select_postsplit', '', '', $posttableselect);
  67. }
  68. if($operation != 'group') {
  69. showsetting('prune_search_forum', '', '', $forumselect);
  70. }
  71. showsetting('prune_search_perpage', '', $_GET['perpage'], "<select name='perpage'><option value='20'>$lang[perpage_20]</option><option value='50'>$lang[perpage_50]</option><option value='100'>$lang[perpage_100]</option></select>");
  72. if(!$fromumanage) {
  73. empty($_GET['starttime']) && $_GET['starttime'] = dgmdate(TIMESTAMP - 86400 * 7, 'Y-n-j');
  74. }
  75. echo '<input type="hidden" name="fromumanage" value="'.$fromumanage.'">';
  76. showsetting('prune_search_time', array('starttime', 'endtime'), array($_GET['starttime'], $_GET['endtime']), 'daterange');
  77. showsetting('prune_search_user', 'users', $_GET['users'], 'text');
  78. showsetting('prune_search_ip', 'useip', $_GET['useip'], 'text');
  79. showsetting('prune_search_keyword', 'keywords', $_GET['keywords'], 'text');
  80. showsetting('prune_search_lengthlimit', 'lengthlimit', $_GET['lengthlimit'], 'text');
  81. showsubmit('searchsubmit');
  82. showtablefooter();
  83. showformfooter();
  84. showtagfooter('div');
  85. } else {
  86. $pidsdelete = $tidsdelete = array();
  87. $pids = authcode($_GET['pids'], 'DECODE');
  88. loadcache('posttableids');
  89. $posttable = in_array($_GET['posttableid'], $_G['cache']['posttableids']) ? $_GET['posttableid'] : 0;
  90. $log_handler = Cloud::loadClass('Cloud_Service_SearchHelper');
  91. foreach(C::t('forum_post')->fetch_all($posttable, ($pids ? explode(',', $pids) : $_GET['pidarray']), false) as $post) {
  92. $prune['forums'][] = $post['fid'];
  93. $prune['thread'][$post['tid']]++;
  94. $pidsdelete[] = $post['pid'];
  95. if($post['first']) {
  96. $tidsdelete[] = $post['tid'];
  97. }
  98. if($post['first']) {
  99. $log_handler->myThreadLog('delete', array('tid' => $post['tid']));
  100. } else {
  101. $log_handler->myPostLog('delete', array('pid' => $post['pid']));
  102. }
  103. }
  104. if($pidsdelete) {
  105. require_once libfile('function/post');
  106. require_once libfile('function/delete');
  107. $deletedposts = deletepost($pidsdelete, 'pid', !$_GET['donotupdatemember'], $posttable);
  108. $deletedthreads = deletethread($tidsdelete, !$_GET['donotupdatemember'], !$_GET['donotupdatemember']);
  109. if(count($prune['thread']) < 50) {
  110. foreach($prune['thread'] as $tid => $decrease) {
  111. updatethreadcount($tid);
  112. }
  113. } else {
  114. $repliesarray = array();
  115. foreach($prune['thread'] as $tid => $decrease) {
  116. $repliesarray[$decrease][] = $tid;
  117. }
  118. foreach($repliesarray as $decrease => $tidarray) {
  119. C::t('forum_thread')->increase($tidarray, array('replies'=>-$decrease));
  120. }
  121. }
  122. if($_G['setting']['globalstick']) {
  123. updatecache('globalstick');
  124. }
  125. foreach(array_unique($prune['forums']) as $fid) {
  126. updateforumcount($fid);
  127. }
  128. }
  129. $deletedthreads = intval($deletedthreads);
  130. $deletedposts = intval($deletedposts);
  131. updatemodworks('DLP', $deletedposts);
  132. $cpmsg = cplang('prune_succeed', array('deletedthreads' => $deletedthreads, 'deletedposts' => $deletedposts));
  133. ?>
  134. <script type="text/JavaScript">alert('<?php echo $cpmsg;?>');parent.$('pruneforum').searchsubmit.click();</script>
  135. <?php
  136. }
  137. if(submitcheck('searchsubmit', 1)) {
  138. loadcache('posttableids');
  139. $posttable = in_array($_GET['posttableid'], $_G['cache']['posttableids']) ? $_GET['posttableid'] : 0;
  140. $pids = array();
  141. $postcount = '0';
  142. $sql = $error = '';
  143. $operation == 'group' && $_GET['forums'] = 'isgroup';
  144. $_GET['keywords'] = trim($_GET['keywords']);
  145. $_GET['users'] = trim($_GET['users']);
  146. if(($_GET['starttime'] == '' && $_GET['endtime'] == '' && !$fromumanage) || ($_GET['keywords'] == '' && $_GET['useip'] == '' && $_GET['users'] == '')) {
  147. $error = 'prune_condition_invalid';
  148. }
  149. if($_G['adminid'] == 1 || $_G['adminid'] == 2) {
  150. if($_GET['forums'] && $_GET['forums'] != 'isgroup') {
  151. $fid = $_GET['forums'];
  152. }
  153. if($_GET['forums'] == 'isgroup') {
  154. $isgroup = 1;
  155. } else {
  156. $isgroup = 0;
  157. }
  158. } else {
  159. $forums = array();
  160. foreach(C::t('forum_moderator')->fetch_all_by_uid($_G['uid']) as $forum) {
  161. $forums[] = $forum['fid'];
  162. }
  163. $fid = $forums;
  164. }
  165. if($_GET['users'] != '') {
  166. $uids = C::t('common_member')->fetch_all_uid_by_username(array_map('trim', explode(',', $_GET['users'])));
  167. $authorid = $uids;
  168. }
  169. if($_GET['useip'] != '') {
  170. $useip = str_replace('*', '%', $_GET['useip']);
  171. }
  172. if($_GET['keywords'] != '') {
  173. $keywords = $_GET['keywords'];
  174. }
  175. if($_GET['lengthlimit'] != '') {
  176. $lengthlimit = intval($_GET['lengthlimit']);
  177. $len_message = $lengthlimit;
  178. }
  179. if(!empty($_GET['starttime'])) {
  180. $starttime = strtotime($_GET['starttime']);
  181. }
  182. if($_G['adminid'] == 1 && !empty($_GET['endtime']) && $_GET['endtime'] != dgmdate(TIMESTAMP, 'Y-n-j')) {
  183. $endtime = strtotime($_GET['endtime']);
  184. } else {
  185. $endtime = TIMESTAMP;
  186. }
  187. if(($_G['adminid'] == 2 && $endtime - $starttime > 86400 * 16) || ($_G['adminid'] == 3 && $endtime - $starttime > 86400 * 8)) {
  188. $error = 'prune_mod_range_illegal';
  189. }
  190. if(!$error) {
  191. if($_GET['detail']) {
  192. $_GET['perpage'] = intval($_GET['perpage']) < 1 ? 20 : intval($_GET['perpage']);
  193. $perpage = $_GET['pp'] ? $_GET['pp'] : $_GET['perpage'];
  194. $posts = '';
  195. $groupsname = $groupsfid = $postlist = array();
  196. $postlist = C::t('forum_post')->fetch_all_prune_by_search($posttable, $isgroup, $keywords, $len_message, $fid, $authorid, $starttime, $endtime, $useip, true, ($page - 1) * $perpage, $perpage);
  197. foreach($postlist as $key => $post) {
  198. $postfids[$post[fid]] = $post['fid'];
  199. $post['dateline'] = dgmdate($post['dateline']);
  200. $post['subject'] = cutstr($post['subject'], 30);
  201. $post['message'] = dhtmlspecialchars(cutstr($post['message'], 50));
  202. $postlist[$key] = $post;
  203. }
  204. if($postfids) {
  205. $query = C::t('forum_forum')->fetch_all_by_fid($postfids);
  206. foreach($query as $row) {
  207. $forumnames[$row[fid]] = $row['name'];
  208. }
  209. }
  210. if($postlist) {
  211. foreach($postlist as $post) {
  212. $posts .= showtablerow('', '', array(
  213. "<input class=\"checkbox\" type=\"checkbox\" name=\"pidarray[]\" value=\"$post[pid]\" checked />",
  214. "<a href=\"forum.php?mod=redirect&goto=findpost&pid=$post[pid]&ptid=$post[tid]\" target=\"_blank\">$post[subject]</a>",
  215. $post['message'],
  216. "<a href=\"forum.php?mod=forumdisplay&fid=$post[fid]\" target=\"_blank\">".$forumnames[$post[fid]]."</a>",
  217. "<a href=\"home.php?mod=space&uid=$post[authorid]\" target=\"_blank\">$post[author]</a>",
  218. $post['dateline']
  219. ), TRUE);
  220. }
  221. }
  222. $postcount = C::t('forum_post')->count_prune_by_search($posttable, $isgroup, $keywords, $len_message, $fid, $authorid, $starttime, $endtime, $useip);
  223. $multi = multi($postcount, $perpage, $page, ADMINSCRIPT."?action=prune");
  224. $multi = preg_replace("/href=\"".ADMINSCRIPT."\?action=prune&amp;page=(\d+)\"/", "href=\"javascript:page(\\1)\"", $multi);
  225. $multi = str_replace("window.location='".ADMINSCRIPT."?action=prune&amp;page='+this.value", "page(this.value)", $multi);
  226. } else {
  227. $postcount = 0;
  228. foreach(C::t('forum_post')->fetch_all_prune_by_search($posttable, $isgroup, $keywords, $len_message, $fid, $authorid, $starttime, $endtime, $useip, false) as $post) {
  229. $pids[] = $post['pid'];
  230. $postcount++;
  231. }
  232. $multi = '';
  233. }
  234. if(!$postcount) {
  235. $error = 'prune_post_nonexistence';
  236. }
  237. }
  238. showtagheader('div', 'postlist', $searchsubmit);
  239. showformheader('prune&frame=no'.($operation ? '&operation='.$operation : ''), 'target="pruneframe"');
  240. showhiddenfields(array('pids' => authcode(implode(',', $pids), 'ENCODE'), 'posttableid' => $posttable));
  241. showtableheader(cplang('prune_result').' '.$postcount.' <a href="###" onclick="$(\'searchposts\').style.display=\'\';$(\'postlist\').style.display=\'none\';$(\'pruneforum\').pp.value=\'\';$(\'pruneforum\').page.value=\'\';" class="act lightlink normal">'.cplang('research').'</a>', 'fixpadding');
  242. if($error) {
  243. cpmsg($error);
  244. } else {
  245. if($_GET['detail']) {
  246. showsubtitle(array('', 'subject', 'message', 'forum', 'author', 'time'));
  247. echo $posts;
  248. }
  249. }
  250. showsubmit('prunesubmit', 'submit', $_GET['detail'] ? '<input type="checkbox" name="chkall" id="chkall" class="checkbox" checked onclick="checkAll(\'prefix\', this.form, \'pidarray\')" /><label for="chkall">'.cplang('del').'</label>' : '',
  251. '<input class="checkbox" type="checkbox" name="donotupdatemember" id="donotupdatemember" value="1" checked="checked" /><label for="donotupdatemember"> '.cplang('prune_no_update_member').'</label>', $multi);
  252. showtablefooter();
  253. showformfooter();
  254. echo '<iframe name="pruneframe" style="display:none"></iframe>';
  255. showtagfooter('div');
  256. }
  257. ?>