今天看了一中午的dedecms,改了一個小東西,就是dedecms自動模型的聯動搜索。
大家都知道,好像聯動搜索只能是獨立模型里面的。搞了一會兒我就打算直接用搜索功能的,但是想了一會兒,還是要相信自己能弄出來的。
閑話不多說,Let’s go??!這里我們選擇nativeplace舉例,而且這里的nativeplace我只保留的省份(嘿嘿,工作需要)。
當然是打開list.php了(如果你不知道這個,好吧,我告訴你,聯動搜索是用這個文件的,位置是plus/list.php),大家可以看到有一個if判斷結構
if($tinfos['issystem']==-1){
//others;
include(DEDEINC."/arc.sglistview.class.php");
$lv = new SgListView($tid,$cArr);
} else {
include(DEDEINC."/arc.listview.class.php");
$lv = new ListView($tid); //others
}
這里的issystem就是判斷你的模型是不是獨立模型,如果值為-1就是獨立模型了,因為我們是自動模型,所有就在else包含的語句中搞搞了。
可以看到SgListView類中多了一個$cArr參數,這里就是傳遞的nativeplace等參數,所以我也給我們的listview加上參數
然后else包含的語句變為
include(DEDEINC."/arc.listview.class.php");
$nativeplace = ( (empty($nativeplace) || !is_numeric($nativeplace)) ? 0 : $nativeplace );
$cArr['nativeplace'] = $nativeplace;
$lv = new ListView($tid,1,$cArr);
當然了,我們傳了一個$cArr給構造函數,當然構造函數要想辦法接收了。所以我們打開位于include/arc.listview.class.php的文件,然后修改此類的構造函數為(原來的構造函數什么樣子自己看):
function __construct($typeid,$uppage=1,$searchArr=array()) {
//在$this->TotalResult = is_numeric($this->TotalResult)? $this->TotalResult : "";下面加入下面一行
$this->searchArr = $searchArr;
}
然后這里出現了一個$this->searchArr,所以,我們要給類加一個屬性:var $searchArr;(別跟我說你不知道加哪)。
現在我們已經傳過來nativeplace了,即$this->searchArr['nativeplace'],然后我們給查詢語句加一個判斷就大功搞成了。
在大概650行左右有if(ereg(‘hot|click|lastpost’,$orderby))這么一句話,在上面加上:
if(!empty($this->searchArr['nativeplace'])) {
$temp = $this->searchArr['nativeplace'];
$dobila = "$addtable.nativeplace = $temp and";
} else {
$dobila = "";
}
通過這幾句,我們增加了一個判斷條件$dobila,具體我就不說明了。
講$dobila加入到查詢字符串就OK了,位置在,餓,不好說,這樣吧,在if(ereg(‘hot|click|lastpost’,$orderby))這個條件判斷語句中,我把整段代碼復制過來,大家看看在哪就ok了。
//如果不用默認的sortrank或id排序,使用聯合查詢(數據量大時非常緩慢)
if(ereg('hot|click|lastpost',$orderby)) {
$query = "Select arc.*,tp.typedir,tp.typename,tp.isdefault,tp.defaultname,tp.namerule,tp.namerule2,tp.ispart,tp.moresite,tp.siteurl,tp.sitepath
$addField from `dede_archives` arc left join `dede_arctype` tp on arc.typeid=tp.id
$addJoin where $dobila {$this->addSql} $ordersql limit $limitstart,$row";
} //普通情況先從arctiny表查出ID,然后按ID查詢(速度非??欤?br />
else {
$t1 = ExecTime();
$ids = array();
$query = "Select id From `dede_arctiny` arc where {$this->addSql} $ordersql limit $limitstart,$row ";
$this->dsql->SetQuery($query);
$this->dsql->Execute();
while($arr=$this->dsql->GetArray())
{ $ids[] = $arr['id']; }
$idstr = join(',',$ids);
if($idstr=='') {
return '';
} else {
$query = "Select arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname, tp.namerule,tp.namerule2,tp.ispart,tp.moresite,tp.siteurl,tp.sitepath
$addField from `dede_archives` arc left join `dede_arctype` tp on arc.typeid=tp.id
$addJoin where $dobila arc.id in($idstr) $ordersql ";
}
$t2 = ExecTime(); //echo $t2-$t1;
}
對了,本來想上網查這個東東來,結果看到幾個付費的,擦,哥自己弄,不用你們,然后我就寫了一個免費的給大家看