modcp_thread.php 11.2 KB
<?php

/**
 *      [Discuz!] (C)2001-2099 Comsenz Inc.
 *      This is NOT a freeware, use is subject to license terms
 *
 *      $Id: modcp_thread.php 28845 2012-03-15 00:59:32Z monkey $
 */

if(!defined('IN_DISCUZ') || !defined('IN_MODCP')) {
	exit('Access Denied');
}

$op = !in_array($op , array('thread', 'post')) ? 'thread' : $op;
$do = getgpc('do') ? dhtmlspecialchars(getgpc('do')) : '';

$modtpl = $op ==  'post' ? 'modcp_post' : 'modcp_thread';
$modtpl = 'forum/'.$modtpl;

$threadoptionselect = array('','','','','','', '', '', '', '', 999=>'', 888=>'');
$threadoptionselect[getgpc('threadoption')] = 'selected';


if($op == 'thread') {

	$result = array();

	foreach (array('threadoption', 'viewsless', 'viewsmore', 'repliesless', 'repliesmore', 'noreplydays', 'typeid') as $key) {
		$_GET[''.$key] = isset($_GET[''.$key]) && is_numeric($_GET[''.$key]) ? intval($_GET[''.$key]) : '';
		$result[$key] = $_GET[''.$key];
	}

	foreach (array('starttime', 'endtime', 'keywords', 'users') as $key) {
		$result[$key] = isset($_GET[''.$key]) ? dhtmlspecialchars($_GET[''.$key]) : '';
	}

	if($_G['fid'] && $_G['forum']['ismoderator']) {

		if($do == 'search' &&  submitcheck('submit', 1)) {

			$conditions = array();
			if($_GET['threadoption'] > 0 && $_GET['threadoption'] < 255) {
				$conditions['specialthread'] = 1;
				$conditions['special'] = $_GET['threadoption'];
			} elseif($_GET['threadoption'] == 999) {
				$conditions['digest'] = array(1,2,3);
			} elseif($_GET['threadoption'] == 888) {
				$conditions['sticky'] = 1;
			}


			$_GET['viewsless'] !== ''? $conditions['viewsless'] = $_GET['viewsless'] : '';
			$_GET['viewsmore'] !== ''? $conditions['viewsmore'] = $_GET['viewsmore'] : '';
			$_GET['repliesless'] !== ''? $conditions['repliesless'] = $_GET['repliesless'] : '';
			$_GET['repliesmore'] !== ''? $conditions['repliesmore'] = $_GET['repliesmore'] : '';
			$_GET['noreplydays'] !== ''? $conditions['noreplydays'] = $_GET['noreplydays'] : '';
			$_GET['starttime'] != '' ? $conditions['starttime'] = $_GET['starttime'] : '';
			$_GET['endtime'] != '' ? $conditions['endtime'] = $_GET['endtime'] : '';

			if(trim($_GET['keywords'])) {

				$conditions['keywords'] = $_GET['keywords'];
			}

			if(trim($_GET['users'])) {
				$conditions['users'] = trim($_GET['users']);
			}

			if($_GET['typeid']) {
				$conditions['intype'] = $_GET['typeid'];
			}

			if(!empty($conditions)) {
				$conditions['inforum'] = $_G['fid'];
				if(!isset($conditions['sticky'])) $conditions['sticky'] = 0;
				$tids = $comma = '';
				$count = 0;
				foreach(C::t('forum_thread')->fetch_all_search($conditions, 0, 0, 1000, 'displayorder DESC, lastpost') as $thread) {
					$tids .= $comma.$thread['tid'];
					$comma = ',';
					$count ++;
				}

				$result['tids'] = $tids;
				$result['count'] = $count;
				$result['fid'] = $_G['fid'];

				$modsession->set('srchresult', $result, true);

				unset($result, $tids);
				$do = 'list';
				$page = 1;

			} else {
				$do = '';
			}
		}

		$page = $_G['page'];
		$total = 0;
		$query = $multipage = '';

		if(empty($do)) {

			$total = C::t('forum_thread')->count_by_fid_typeid_displayorder($_G['fid'], $_GET['typeid'], 0, '>=');
			$tpage = ceil($total / $_G['tpp']);
			$page = min($tpage, $page);
			$multipage = multi($total, $_G['tpp'], $page, "$cpscript?mod=modcp&amp;action=$_GET[action]&amp;op=$op&amp;fid=$_G[fid]&amp;do=$do");
			if($total) {
				$start = ($page - 1) * $_G['tpp'];
				$threads = C::t('forum_thread')->fetch_all_by_fid_typeid_displayorder($_G['fid'], $_GET['typeid'], 0, '>=', $start, $_G['tpp']);
			}

		} else {

			$result = $modsession->get('srchresult');
			$threadoptionselect[$result['threadoption']] = 'selected';

			if($result['fid'] == $_G['fid']) {
				$total = $result['count'];
				$tpage = ceil($total / $_G['tpp']);
				$page = min($tpage, $page);
				$multipage = multi($total, $_G['tpp'], $page, "$cpscript?mod=modcp&amp;action=$_GET[action]&amp;op=$op&amp;fid=$_G[fid]&amp;do=$do");
				if($total) {
					$start = ($page - 1) * $_G['tpp'];
					$threads = C::t('forum_thread')->fetch_all_by_tid_fid_displayorder(explode(',', $result['tids']), null, null, 'lastpost', $start, $_G['tpp']);
				}
			}
		}

		$postlist = array();
		if(!empty($threads)) {
			require_once libfile('function/misc');
			foreach($threads as $thread) {
				$postlist[] = procthread($thread);
			}
		}
	}
	return;
}


if($op == 'post') {

	$error = 0;

	$result = array();

	$_GET['starttime'] = !preg_match("/^(0|\d{4}\-\d{1,2}\-\d{1,2})$/", getgpc('starttime')) ? dgmdate(TIMESTAMP - 86400 * ($_G['adminid'] == 2 ? 13 : ($_G['adminid'] == 3 ? 6 : 60)), 'Y-m-d') : getgpc('starttime');
	$_GET['endtime'] = $_G['adminid'] == 3 || !preg_match("/^(0|\d{4}\-\d{1,2}\-\d{1,2})$/", getgpc('endtime')) ? dgmdate(TIMESTAMP, 'Y-m-d') : getgpc('endtime');

	foreach (array('threadoption', 'starttime', 'endtime', 'keywords', 'users', 'useip') as $key) {
		$$key = isset($_GET[''.$key]) ? trim($_GET[''.$key]) : '';
		$result[$key] = dhtmlspecialchars($$key);
	}

	$threadoptionselect = range(1, 3);

	$posttableid = intval($_GET['posttableid']);
	$posttableselect = getposttableselect();

	$cachekey = 'srchresult_p_'.$posttableid.'_'.$_G['fid'];
	$fidadd = '';
	$fidaddarr = array();
	if($_G['fid'] && $modforums['list'][$_G['fid']]) {
		$fidaddarr = array($_G['fid']);
		$fidadd = "AND fid='$_G[fid]'";
	} else {
		if($_G['adminid'] == 1 && $_G['adminid'] == $_G['groupid']) {
			$fidadd = '';
		} elseif(!$modforums['fids']) {
			$fidaddarr = array(0);
			$fidadd = 'AND 0 ';
		} else {
			$fidaddarr = explode(',', $modforums['fids']);
			$fidadd = "AND fid in($modforums[fids])";
		}
	}

	if($do == 'delete' && submitcheck('deletesubmit')) {

		if(!$_G['group']['allowmassprune']) {
			$error = 4;
			return;
		}

		$pidsdelete = $tidsdelete = array();
		$prune = array('forums' => array(), 'thread' => array());

		if($pids = dimplode($_GET['delete'])) {
			$result = $modsession->get($cachekey);
			$result['pids'] = explode(',', $result['pids']);
			$keys = array_flip($result['pids']);
			foreach(C::t('forum_post')->fetch_all($posttableid, $_GET['delete'], false) as $post) {
				if($fidaddarr && !in_array($post['fid'], $fidaddarr)) {
					continue;
				}
				$prune['forums'][$post['fid']] = $post['fid'];
				$pidsdelete[$post['fid']][$post['pid']] = $post['pid'];
				$pids_tids[$post['pid']] = $post['tid'];
				if($post['first']) {
					$tidsdelete[$post['pid']] = $post['tid'];
				} else {
					@$prune['thread'][$post['tid']]++;
				}
				$key = $keys[$post['pid']];
				unset($result['pids'][$key]);
			}
			$result['pids'] = implode(',', $result['pids']);
			$result['count'] = count($result['pids']);
			$modsession->set($cachekey, $result, true);
			unset($result);
		}

		if($pidsdelete) {
			require_once libfile('function/post');
			require_once libfile('function/delete');
			$forums = C::t('forum_forum')->fetch_all($prune['forums']);
			foreach($pidsdelete as $fid => $pids) {
				foreach($pids as $pid) {
					if(!$tidsdelete[$pid]) {
						$deletedposts = deletepost($pid, 'pid', !getgpc('nocredit'), $posttableid, $forums[$fid]['recyclebin']);
						updatemodlog($pids_tids[$pid], 'DLP');
					} else {
						$deletedthreads = deletethread(array($tidsdelete[$pid]), false, !getgpc('nocredit'), $forums[$fid]['recyclebin']);
						updatemodlog($tidsdelete[$pid], 'DEL');
					}
				}
			}
			if(count($prune['thread']) < 50) {
				foreach($prune['thread'] as $tid => $decrease) {
					updatethreadcount($tid);
				}
			} else {
				$repliesarray = array();
				foreach($prune['thread'] as $tid => $decrease) {
					$repliesarray[$decrease][] = $tid;
				}
				foreach($repliesarray as $decrease => $tidarray) {
					C::t('forum_thread')->increase($tidarray, array('replies'=>-$decrease));
				}
			}

			foreach(array_unique($prune['forums']) as $id) {
				updateforumcount($id);
			}

		}

		$do = 'list';

		showmessage('modcp_thread_delete_succeed', '', array(), array('break' => 1));
	}

	if($do == 'search' && submitcheck('searchsubmit', 1)) {

		if(($starttime == '0' && $endtime == '0') || ($keywords == '' && $useip == '' && $users == '')) {
			$error = 1;
			return ;
		}

		$sql = '';

		if($threadoption == 1) {
			$first = 1;
		} elseif($threadoption == 2) {
			$first = 0;
		}

		if($starttime != '0') {
			$starttime = strtotime($starttime);
		}

		if($_G['adminid'] == 1 && $endtime != dgmdate(TIMESTAMP, 'Y-m-d')) {
			if($endtime != '0') {
				$endtime = strtotime($endtime);
			}
		} else {
			$endtime = TIMESTAMP;
		}

		if(($_G['adminid'] == 2 && $endtime - $starttime > 86400 * 14) || ($_G['adminid'] == 3 && $endtime - $starttime > 86400 * 7)) {
			$error = '2';
			return;
		}

		if($users != '') {
			$uids = C::t('common_member')->fetch_all_uid_by_username(array_map('trim', explode(',', $users)));
			if(!$uids) {
				$uids = array(0);
			}
		}

		if(trim($keywords)) {
			foreach(explode(',', str_replace(' ', '', $keywords)) as $value) {
				if(strlen($value) <= 3) {
					$error = 3;
					return;
				}
			}
		}

		$useip = trim($useip);
		if($useip != '') {
			$useip = str_replace('*', '%', $useip);
		}

		if($uids || $keywords || $useip) {

			$pids = array();
			foreach(C::t('forum_post')->fetch_all_by_search($posttableid, null, $keywords, 0, $fidaddarr, $uids, null, $starttime, $endtime, $useip, $first, 0, 1000) as $post) {
				$pids[] = $post['pid'];
			}

			$result['pids'] = implode(',', $pids);
			$result['count'] = count($pids);
			$result['fid'] = $_G['fid'];
			$result['posttableid'] = $posttableid;

			$modsession->set($cachekey, $result, true);

			unset($result, $pids);
			$do = 'list';
			$page = 1;

		} else {
			$do = '';
		}
	}

	$page = max(1, intval($_G['page']));
	$total = 0;
	$query = $multipage = '';

	if($do == 'list') {
		$postarray = array();
		$result = $modsession->get($cachekey);
		$threadoptionselect[$result['threadoption']] = 'selected';

		if($result['fid'] == $_G['fid']) {
			$total = $result['count'];
			$tpage = ceil($total / $_G['tpp']);
			$page = min($tpage, $page);
			$multipage = multi($total, $_G['tpp'], $page, "$cpscript?mod=modcp&amp;action=$_GET[action]&amp;op=$op&amp;fid=$_G[fid]&amp;do=$do");
			if($total && $result['pids']) {
				$start = ($page - 1) * $_G['tpp'];
				$tids = array();
				$postlist = C::t('forum_post')->fetch_all_by_pid($result['posttableid'], explode(',', $result['pids']), true, 'DESC', $start, $_G['tpp']);
				foreach($postlist as $post) {
					$tids[$post['tid']] = $post['tid'];
				}
				$threadlist = C::t('forum_thread')->fetch_all($tids);
				foreach($postlist as $post) {
					$post['tsubject'] = $threadlist[$post['tid']]['subject'];
					$postarray[] = $post;
				}
				unset($threadlist, $postlist, $tids);
			}
		}
	}

	$postlist = array();

	if($postarray) {
		require_once libfile('function/post');
		foreach($postarray as $post) {
			$post['dateline'] = dgmdate($post['dateline']);
			$post['message'] = messagecutstr($post['message'], 200);
			$post['forum'] = $modforums['list'][$post['fid']];
			$post['modthreadkey'] = modauthkey($post['tid']);
			$postlist[] = $post;
		}
	}

}

?>