www.gusucode.com > 08CMS空白站群系统 3.3 繁体 UTF-8 > upload/search.php

    <?php
define('NOROBOT', TRUE);
include_once './include/general.inc.php';
include_once M_ROOT.'./include/common.fun.php';
include_once M_ROOT."./include/fields.cls.php";

//只有发送searchsubmit之后搜索文档列表才进行解析
if(!$nousersearch && !$curuser->check_allow('searchpermit')) message(lang('belong usergroup nohave search permission'));//分析搜索权限
if($search_repeat){
	empty($m_cookie['cms_search_time']) ? msetcookie('cms_search_time','1',$search_repeat) : message(lang('search overquick'));
}
$page = empty($page) ? 1 : max(1, intval($page));

$chid = empty($chid) ? 0 : max(0,intval($chid));
if($chid && empty($channels[$chid])) $chid =0;
$searchword = empty($searchword) ? '' : cutstr(trim($searchword),50,'');

//搜索模式:标题subject、关键词keywords、内容fulltxt、会员mname
$searchmode = empty($searchmode) ? 'subject' : trim($searchmode);
if(!in_array($searchmode,array('subject','keywords','fulltxt','mname'))) $searchmode = 'subject';
if(!$chid && $searchmode == 'fulltxt') $searchmode = 'subject';//单模型搜索才支持全文搜索

$caid = empty($caid) ? 0 : max(0,intval($caid));
$indays = empty($indays) ? 0 : max(0,intval($indays));
$outdays = empty($outdays) ? 0 : max(0,intval($outdays));
$orderby = empty($orderby) ? 'createdate' : $orderby;
$ordermode = empty($ordermode) ? 0 : 1;

$item = array('chid' => $chid,'channel' => $chid ? $channels[$chid]['cname'] : lang('all channel'),);//作为模板标识中的原始标识
foreach(array('chid','searchmode','searchword','caid','indays','outdays','orderby','ordermode') as $var){
	$item[$var] = in_array($var,array('indays','outdays')) && empty($$var) ? '' : stripslashes($$var);
}
foreach($cotypes as $coid => $cotype){
	${"ccid$coid"} = empty(${"ccid$coid"}) ? 0 : max(0,intval(${"ccid$coid"}));
	$item["ccid$coid"] = ${"ccid$coid"};
}

$wherestr = "WHERE a.checked=1 AND a.sid='$sid'";
$filterstr = '';//分页链接的附加参数字串
$fromstr = "FROM {$tblprefix}archives AS a";
if($chid){///////////////////////没法搜索模板的其它自定义字段
	$channel = read_cache('channel',$chid);
	$filterstr .= ($filterstr ? '&' : '')."chid=$chid";
	$fromstr .= " LEFT JOIN {$tblprefix}archives_$chid AS c ON a.aid=c.aid";
	$wherestr .= " AND a.chid='$chid'";
	$a_field = new cls_field;
	$fields = read_cache('fields',$chid);
	if($searchmode == 'fulltxt'){//处理全文搜索
		if($channels[$chid]['fulltxt'] && isset($fields[$channels[$chid]['fulltxt']])) $fulltxt = $channels[$chid]['fulltxt'];//该模型的全文搜索字段
		if(!empty($fulltxt)){
			$searchword && $wherestr .= ' AND '.($fields[$channels[$chid]['fulltxt']]['tbl'] == 'main' ? 'a' : 'c').".$fulltxt LIKE '%".str_replace(array(' ','*'),'%',addcslashes($searchword, '%_'))."'%";
		}else{//如果全文搜索字段没有定义,则返回为标题搜索
			$searchmode = $item['searchmode'] = 'subject';
		}
	}
	foreach($fields as $k => $field){
		if($field['available'] && $field['issearch']){
			$a_field->init();
			$a_field->field = read_cache('field',$chid,$k);
			$a_field->deal_search();
			$wherestr .= $a_field->searchstr ? (' AND '.$a_field->searchstr) : '';
			$a_field->filterstr && $filterstr .= ($filterstr ? '&' : '').$a_field->filterstr;
			if($field['issearch'] == 1 || $field['datatype'] == 'text'){
				$item[$k] = stripslashes($$k);
			}elseif(in_array($field['datatype'],array('select','mselect'))){
				$item[$k.'str'] = ${$k.'str'};
			}else{
				$item[$k.'from'] = ${$k.'from'};
				$item[$k.'to'] = ${$k.'to'};
			}
		}
	}
	unset($a_field);
}
if($searchword){
	//搜索模式已先行处理全文搜索方式的wherestr,但filterstr的处理还是在这里
	$filterstr .= ($filterstr ? '&' : '')."searchword=".rawurlencode(stripslashes($searchword));
	$searchmode != 'subject' && $filterstr .= ($filterstr ? '&' : '')."searchmode=$searchmode";
	$searchmode != 'fulltxt' && $wherestr .= " AND a.$searchmode LIKE '%".str_replace(array(' ','*'),'%',addcslashes($searchword, '%_'))."%'";
}
if($caid){
	$filterstr .= ($filterstr ? '&' : '')."caid=$caid";
	$caids = array($caid);
	$tempids = array();
	$tempids = son_ids($catalogs,$caid,$tempids);
	$caids = array_merge($caids,$tempids);
	$wherestr .= " AND a.caid IN (".mimplode($caids).")";
}
foreach($cotypes as $coid => $cotype){
	if(${"ccid$coid"}){
		$filterstr .= ($filterstr ? '&' : '')."ccid$coid=".${"ccid$coid"};
		$ccids = array(${"ccid$coid"});
		$tempids = array();
		$coclasses = read_cache('coclasses',$coid);
		$tempids = son_ids($coclasses,${"ccid$coid"},$tempids);
		$ccids = array_merge($ccids,$tempids);
		if(empty($cotype['self_reg'])){
			$wherestr .= " AND a.cotype$coid IN (".mimplode($ccids).")";
		}else{
			$tempstr = self_sqlstr($coid,$ccids,'a.');
			$tempstr && $wherestr .= ' AND '.$tempstr;
			unset($tempstr);
		} 
	}
}
if($indays){
	$filterstr .= ($filterstr ? '&' : '')."indays=$indays";
	$wherestr .= " AND a.createdate>'".($timestamp - 86400 * $indays)."'";
}
if($outdays){
	$filterstr .= ($filterstr ? '&' : '')."outdays=$outdays";
	$wherestr .= " AND a.createdate<'".($timestamp - 86400 * $outdays)."'";
}
	
$orderstr = "ORDER BY a.$orderby ".($ordermode ? 'ASC' : 'DESC');
$orderby != 'createdate' && $filterstr .= ($filterstr ? '&' : '')."orderby=$orderby";
$ordermode && $filterstr .= ($filterstr ? '&' : '')."ordermode=$ordermode";
$sqlstr = "$fromstr $wherestr $orderstr";


$tplname = @$sptpls['search'];//不区分模型的搜索模板
if($chid && $channel['srhtpl']) $tplname = $channel['srhtpl'];
if(!$tplname || !($template = @load_tpl($tplname,1))) message(lang('please define related template'));


if(preg_match("/\{p\\$(.+?)\s+(.*?)\{\/p\\$\\1\}/is",$template,$matches)){
	$mpinfo = array();
	$mpinfo['filterstr'] = $filterstr;
	$mpinfo['sqlstr'] = $sqlstr;
	$mpinfo['nowpage'] = $page;
	$mpinfo['submit'] = empty($searchsubmit) ? 0 : 1;
	$mpinfo['pcount'] = 1;
	$mpinfo['durlpre'] = $cms_abs."search.php?searchsubmit=1&$filterstr&page=";	
	$mpinfo = array_merge($mpinfo,mpinfo($matches[1],stripslashes($matches[2]),$mpinfo));
	$item['mpnav'] = mpnav($mpinfo);
	nreplace($template,'p',$mpinfo);
	unset($matches,$mpinfo);
}
$sitem = array();
nreplace($template,'c',$sitem);
nreplace($template,'u',$item);
nreplace($template,'b',$item);
code_parse($template);
mexit($template);

?>