帝国cms自动采集插件 帝国CMS二次开发跨表查询相关文章

帝国CMS教程

官方的相关链接不灵活,样式不能任意的修改无法跨表。很多人想跨表做相关链接,比如news和info都有几篇文章,关键词都有'北京',那么如何调用这些有有同一关键词的文章呢?为此写了一个函数。

小范围的调用于本分类,稍大一点范围可以调用同一表的文章,再大一点可以调用指定的表的文章。可以选要调用文章的数量。其实还可以升级,比如指定调用某个表的文章数量,那个表的顺序等。函数没有样式,稍微懂一点代码的可以自行修改。其实不是特别难。如果有哪位升级了这个函数,可以共享给大家。

<?phpfunctionuser_OtherLink($tbname,$num,$ck){global$navinfor,$empire,$dbtbpre,$class_r;$ck=(int)$ck;if($ck==1||$ck==2){$tbname=$class_r[$navinfor['classid']]['tbname'];}$num=$num==''?5:$num;//缺省获取数量为5$tag_all=explode(',',$navinfor['infotags']);$tbname_num=explode(',',$tbname);$eq_num=ceil($num/count($tag_all));for($i=0;$i<count($tag_all);$i++){$r_1_1=$empire->fetch1("selecttagid,tagname,num,isgood,cidfrom{$dbtbpre}enewstagswheretagname='".$tag_all[$i]."'orderbytagidlimit1");$tag_id[$i]=$r_1_1['tagid'];//tag的ID$tag_num[$i]=$r_1_1['num'];//tag下的文章数量if($tag_num[$i]>=$eq_num){//如果TAG下的文章数量比平均的数量大或者等于,那么TAG的文章数量取平均值$tag_num[$i]=$eq_num;//重新赋值}else{//如果TAG下的文章小于平均值,那么TAG取原有的文章数量。同时重新赋值平均值。$eg_tag=$eq_num-$tag_num[$i];$eq_num+=$eg_tag;}//比如说有3个TAG,每个TAG下有4篇文章,现在指定要显示10篇文章,那么每个TAG要拿出4篇,共有12篇文章//3个TAG,每个TAG下有3篇文章,现在指定要显示10篇文章,那么每个TAG要拿出3篇文章,共有9篇文章//3个TAG,A有2篇文章,B有5篇文章,C有3篇文章,现在要显示10篇文章,那么A拿出2篇文章,B拿出5篇文章,C拿出3篇文章,共有10篇文章//如果A、B、C中除了当前文章,还有相同的文章,那么会扣除重复的那篇文章,只取一次。所以指定的数量会有偏差for($i_n=0;$i_n<count($tbname_num);$i_n++){$sql=$empire->query("selecttid,classid,id,midfrom{$dbtbpre}enewstagsdatawheretagid='".$tag_id[$i]."'orderbyclassid");$ri=1;while($r=$empire->fetch($sql)){$tbname_all[$r['tid']]=$class_r[$r['classid']]['tbname'];if($tbname_all[$r['tid']]==$tbname_num[$i_n]&&$ri<=$tag_num[$i]&&$navinfor['classid']!=$r['classid']&&$navinfor['id']!=$r['id']){if($ck==1&&$navinfor['classid']==$r['classid']){$tbname_all_r[$r['tid']]=$class_r[$r['classid']]['tbname'];$classid_id[$r['tid']]=$r['classid'].'_'.$r['id'];$classid_all[$r['tid']]=$r['classid'];$id_all[$r['tid']][$r['classid']]=$r['id'];}elseif($ck==2&&$class_r[$navinfor['classid']]['tbname']==$class_r[$r['classid']]['tbname']){$tbname_all_r[$r['tid']]=$class_r[$r['classid']]['tbname'];$classid_id[$r['tid']]=$r['classid'].'_'.$r['id'];$classid_all[$r['tid']]=$r['classid'];$id_all[$r['tid']][$r['classid']]=$r['id'];}elseif($ck==3){$tbname_all_r[$r['tid']]=$class_r[$r['classid']]['tbname'];$classid_id[$r['tid']]=$r['classid'].'_'.$r['id'];$classid_all[$r['tid']]=$r['classid'];$id_all[$r['tid']][$r['classid']]=$r['id'];}$ri++;}}}}$classid_id_x=array_unique($classid_id);//去除重复的值//去除重复的值,不同的TAG会有相同的文章。所以去除重复的值。比如A篇文章里面都有"北京","奥运",两个关键词,B篇文章里面也有"北京","奥运"在不去除重复的情况下,A篇的相关链接会出现两次B文章。所以必须去除其中一个。arsort($classid_id_x);//按键名排列,倒序$tid_tid=array_keys($classid_id_x);//取出键名重新排列,键名即为TAG的ID:tidshuffle($tid_tid);//顺序打乱,重新排$tid_tid_num=count($tid_tid);if($num<$tid_tid_num)$tid_tid_num=$num+1;//由于去除了本文章,所以再加一条弥补for($i_tid=0;$i_tid<$tid_tid_num;$i_tid++){$tid=$tid_tid[$i_tid];$classid=$classid_all[$tid];$id=$id_all[$tid][$classid];if($id==$navinfor['id'])continue;//如果是本文章,相关链接里面就不用再放了。$tbname=$tbname_all_r[$tid];$r_1_2=$empire->fetch1("selecttitle,smalltext,titleurl,dp_jt,dp_dwzfrom{$dbtbpre}ecms_$tbnamewhereid='".$id."'orderbynewstimelimit1");////////显示样式在这修改echo$r_1_2['title'].'';////////}}?>/**<?phpOtherLink('news,info',7,3);?>**/