search.inc.php

来自「php 开发的内容管理系统」· PHP 代码 · 共 171 行

PHP
171
字号
<?php
/**
 * Article management
 *
 * @copyright	The XOOPS project http://www.xoops.org/
 * @license		http://www.fsf.org/copyleft/gpl.html GNU public license
 * @author		Taiwen Jiang (phppp or D.J.) <php_pp@hotmail.com>
 * @since		1.00
 * @version		$Id$
 * @package		module::article
 */

if (!defined("XOOPS_ROOT_PATH")){ exit(); }

include dirname(__FILE__)."/vars.php";
mod_loadFunctions("parse", $GLOBALS["artdirname"]);

art_parse_function('
function &[VAR_PREFIX]_search($queryarray, $andor, $limit, $offset, $userid, $categories = array(), $sortby = 0, $searchin = "all", $extra = "")
{
	global $xoopsDB, $xoopsConfig, $myts, $xoopsUser;
	$ret = array();

	art_define_url_delimiter();
	
	$uid = (is_object($xoopsUser) && $xoopsUser->isactive()) ? $xoopsUser->getVar("uid") : 0;
	$permission_handler =& xoops_getmodulehandler("permission", $GLOBALS["artdirname"]);
	$allowed_ids = $permission_handler->getCategories();
	if(count($categories)>0) {
		$allowed_ids = array_intersect($allowed_ids, $categories);
	}	

	$searchin = empty($searchin)?array("all"):(is_array($searchin)?$searchin:array($searchin));
	if(in_array("all", $searchin) || count($searchin)==0){
		$searchin = array("title", "author", "keywords", "summary", "text", "subtitle");
	}
	
    $isFulltext = ($searchin == array("text"));
    
    /* Fulltext search */
    if($isFulltext):
 	$sql = "SELECT".
    		" DISTINCT t.text_id, t.text_body, a.art_id, a.art_title, a.uid, a.art_time_publish, a.art_pages";
    $sql .= " FROM".
    		" ".art_DB_prefix("text")." AS t".
    		" LEFT JOIN ".art_DB_prefix("article")." AS a ON a.art_id=t.art_id".
    		" LEFT JOIN ".art_DB_prefix("artcat")." AS ac ON a.art_id=ac.art_id";
    /* regular search */
    else:
 	$sql = "SELECT".
    		" DISTINCT a.art_id, a.art_title, a.uid, a.art_time_publish";
    $sql .= " FROM".
    		" ".art_DB_prefix("article")." AS a".
    		" LEFT JOIN ".art_DB_prefix("artcat")." AS ac ON a.art_id=ac.art_id";
    if(in_array("text", $searchin) || in_array("subtitle", $searchin)):
    $sql .= " LEFT JOIN ".art_DB_prefix("text")." AS t ON t.art_id =a.art_id";
    endif;
    endif;
    
	$sql .= " WHERE".
			" a.art_time_publish>0".
    		" AND ac.cat_id IN (".implode(",",$allowed_ids).")".
    		" AND ac.ac_publish > 0";

    if (is_array($userid) && count($userid) > 0) {
		$userid = array_map("intval", $userid);
        $sql .= " AND a.uid IN (".implode(",", $userid).") ";
    }elseif ( is_numeric($userid) && $userid > 0 ) {
		$sql .= " AND a.uid=".$userid." ";
	}

	$count = count($queryarray);
	if ( is_array($queryarray) && $count > 0) {
		foreach($queryarray as $query){
			$query_array["title"][] = "a.art_title LIKE ".$xoopsDB->quoteString("%".$query."%");
			//$query_array["author"][] = "a.art_author LIKE ".$xoopsDB->quoteString("%".$query."%");
			$query_array["keywords"][] = "a.art_keywords LIKE ".$xoopsDB->quoteString("%".$query."%");
			$query_array["summary"][] = "a.art_summary LIKE ".$xoopsDB->quoteString("%".$query."%");
			$query_array["text"][] = "t.text_body LIKE ".$xoopsDB->quoteString("%".$query."%");
			$query_array["subtitle"][] = "t.text_title LIKE ".$xoopsDB->quoteString("%".$query."%");
		}
		foreach($query_array as $term => $terms){
			$querys[$term] = "(".implode(" $andor ", $terms).")";
		}
		foreach($searchin as $term){
			if(empty($query_array[$term])) continue;
			$query_term[] = $querys[$term];
		}
	    $sql .= " AND (".implode(" OR ",$query_term).") ";
	}

	if (empty($sortby)) {
	    $sortby = "a.art_id DESC";
	}
	$sql .= $extra." ORDER BY ".$sortby;
	
	if(!$result = $xoopsDB->query($sql,$limit,$offset)){
		xoops_error($xoopsDB->error());
		return $ret;
	}
	$_ret = array();
	$users = array();
	$arts = array();
	mod_loadFunctions("time", $GLOBALS["artdirname"]);
 	while($myrow = $xoopsDB->fetchArray($result)){
	 	if(empty($isFulltext)):
        $ret[] = array(
        	"link"		=> "view.article.php".URL_DELIMITER."".$myrow["art_id"],
			"title"		=> $myrow["art_title"],
			"time"		=> $myrow["art_time_publish"],
			"uid"		=> $myrow["uid"],
			"art_title"	=> $myts->htmlSpecialChars($myrow["art_title"]),
			"art_time"	=> art_formatTimestamp($myrow["art_time_publish"])
		);
		else:
        $_ret[] = $myrow;
		endif;
		$users[$myrow["uid"]] = 1;
	}
	
	if(!empty($isFulltext)):
	$article_handler =& xoops_getmodulehandler("article", $GLOBALS["artdirname"]);
	load_functions("locale");
	foreach($_ret as $myrow){
        $article_obj =& $article_handler->create(false);
        $article_obj->assignVars($myrow);
		$page = array_search($myrow["text_id"], $article_obj->getPages());
		$text = $myts->htmlSpecialChars($myrow["text_body"]);
		
		/* 
		 * "Fulltext search"/highlight needs better formulize
		 * 
		 */
		$sanitized_text = "";
		$text_i = strtolower($text);
		foreach($queryarray as $query){
			$pos		= xoops_local("strpos", $text_i, strtolower($query));
			$start		= max(($pos - 100), 0);
			$length		= xoops_local("strlen", $query) + 200;
			$context	= preg_replace("/(".preg_quote($query).")/si", "<span class=\"article-highlight\">$1</span>", xoops_substr($text, $start, $length, " [...]"));
			$sanitized_text .= "<p>[...] ".$context."</p>";
		}
		
        $ret[] = array(
        	"link"		=> "view.article.php".URL_DELIMITER.$myrow["art_id"]."/p".intval($page),
			"title"		=> $myrow["art_title"],
			"time"		=> $myrow["art_time_publish"],
			"uid"		=> $myrow["uid"],
			"art_title"	=> $article_obj->getVar("art_title"),
			"art_time"	=> $article_obj->getTime(),
			"text"		=> $sanitized_text
		);
		unset($article_obj, $page, $sanitized_text, $matches);
	}
	endif;	
	
	mod_loadFunctions("user", $GLOBALS["artdirname"]);
	$users = art_getUnameFromId(array_keys($users), false, true);
	foreach( array_keys($ret) as $i){
		if($ret[$i]["uid"] >0){
			$ret[$i]["author"] = @$users[$ret[$i]["uid"]];
		}else{
			$ret[$i]["author"] = $xoopsConfig["anonymous"];
		}
	}
	unset($users);

	return $ret;
}
');
?>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?