帝国论坛帝国网站管理系统交流区模板/标签/插件共享交流[原创]跨表相关链接可指定本分类、本表、指定表||升级2 【本版专题贴子】  
 1/2     1 2 ›› ›|
主题:[原创]跨表相关链接可指定本分类、本表、指定表||升级2 [加入收藏夹]   

qiuxis
用户头衔:秀才

精华贴   :0
发贴数   :89
经验值   :559
注册时间:2012-12-26
信息 搜索 好友 发送悄悄话 精益求精-帝国网站管理系统7.5正式版开源发布】   [第 1 楼]
[原创]跨表相关链接可指定本分类、本表、指定表||升级2
    官方的相关链接用起来不是特别灵活,比如样式不能任意的修改,另外相关链接无法跨表。很多人想跨表做相关链接,比如news和info都有几篇文章,关键词都有'北京',那么如何调用这些有有同一关键词的文章呢?为此自己写了一个函数,用来调用。
    小范围的调用于本分类,稍大一点范围可以调用同一表的文章,再大一点可以调用指定的表的文章。可以选要调用文章的数量。
其实还可以升级,比如指定调用某个表的文章数量,那个表的顺序等。
函数没有样式,稍微懂一点代码的可以自行修改。其实不是特别难。
如果有哪位升级了这个函数,可以共享给大家。

//注:$tbname必须是数据库里面有的表,比如原官方news,info,movie等,多个表以","半角逗号隔开 。$ck 为1时取本分类的相关链接,为2取本表的相关链接,为3指定多表的相关链接
function 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) ;
       
        for($i=0;$i<count($tag_all);$i++){
        for($i_n=0;$i_n<count($tbname_num);$i_n++){
        $r_1_1 =$empire->fetch1("select tagid from {$dbtbpre}enewstags where tagname='".$tag_all[$i]."' order by tagid limit 1") ;
        $tag_id[$i]=$r_1_1['tagid'] ;
        $sql=$empire->query("select tid,classid,id,mid from {$dbtbpre}enewstagsdata where tagid='".$tag_id[$i]."' order by classid ");
                while($r=$empire->fetch($sql))
                {
                $tbname_all[$r['tid']]=$class_r[$r['classid']]['tbname'] ;
                if($tbname_all[$r['tid']]==$tbname_num["$i_n"]){
                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'] ;
               
                }
               
                }
                }
        }
        }

        $classid_id_x=array_unique($classid_id);//去除重复的值
        arsort($classid_id_x); //按键名排列
        $tid_tid=array_keys($classid_id_x) ;//取出键名重新排列,键名即为TAG的ID: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("select title from {$dbtbpre}ecms_$tbname where id='".$id."' order by newstime limit 1") ;
        echo $r_1_2['title'] . PHP_EOL ;//显示可以在此修改
        }
        }
/**
<?php
OtherLink('news,info',7,3) ;
?>
**/       

升级版本在7楼
原来的版本,会出现这种情况,比如有3个TAG,A,B,C要取10篇文章,其中A下有20篇文章,那么就只取了A下的十篇文章了。
新版本会这样取,先平均,10篇文章,给3个TAG平均,这样每个TAG取4篇文章。(进一取值)

        //比如说有3个TAG,每个TAG下有4篇文章,现在指定要显示10篇文章,那么每个TAG要拿出4篇,共有12篇文章,最终会打乱这12篇文章,然后取10篇
        //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中除了当前文章,还有相同的文章,那么会扣除重复的那篇文章,只取一次。所以指定的数量会有偏差

[该贴被修改 1 次,最后修改时间 2014-03-06 04:16:01 ]


[论坛教程] [普歌]
2014-02-28 00:04:21 已设置保密 顶部 回复 引用 报告 编辑 删除

陈同平
用户头衔:进士

精华贴   :0
发贴数   :1998
经验值   :5610
注册时间:2009-02-23
信息 搜索 好友 发送悄悄话 免费开源-EBMA系统:更安全的MYSQL管理和备份系统】   [第 2 楼]

收藏




2014-02-28 08:01:08 已设置保密 顶部 回复 引用 报告 编辑 删除

花心
用户头衔:探花

精华贴   :0
发贴数   :4374
经验值   :13671
注册时间:2008-11-01
信息 搜索 好友 发送悄悄话 精益求精-帝国网站管理系统7.5正式版开源发布】   [第 3 楼]

记号




2014-03-01 07:48:07 已设置保密 顶部 回复 引用 报告 编辑 删除

5160387
用户头衔:进士

精华贴   :0
发贴数   :701
经验值   :2521
注册时间:2012-12-20
信息 搜索 好友 发送悄悄话 免费开源-EBMA系统:更安全的MYSQL管理和备份系统】   [第 4 楼]

支持个



帝国教程/插件/二开/PHP知识网:www.phpin.net
免费无弹窗小说网:www.zhaibei.com
穿衣打扮网:www.nvziba.com
2014-03-01 09:41:49 已设置保密 顶部 回复 引用 报告 编辑 删除

aulove
用户头衔:书生

精华贴   :0
发贴数   :28
经验值   :236
注册时间:2006-10-21
信息 搜索 好友 发送悄悄话 精益求精-帝国网站管理系统7.5正式版开源发布】   [第 5 楼]

支持!谢谢楼主!




2014-03-01 10:34:15 已设置保密 顶部 回复 引用 报告 编辑 删除

luoto
用户头衔:探花

精华贴   :0
发贴数   :5799
经验值   :17477
注册时间:2008-11-08
信息 搜索 好友 发送悄悄话 免费开源-EBMA系统:更安全的MYSQL管理和备份系统】   [第 6 楼]

谢谢楼主




2014-03-02 06:30:24 已设置保密 顶部 回复 引用 报告 编辑 删除

帝国时代3
用户头衔:探花

精华贴   :0
发贴数   :3462
经验值   :10602
注册时间:2008-03-26
信息 搜索 好友 发送悄悄话 精益求精-帝国网站管理系统7.5正式版开源发布】   [第 7 楼]

支持




2014-03-03 07:10:37 已设置保密 顶部 回复 引用 报告 编辑 删除

qiuxis
用户头衔:秀才

精华贴   :0
发贴数   :89
经验值   :559
注册时间:2012-12-26
信息 搜索 好友 发送悄悄话 免费开源-EBMA系统:更安全的MYSQL管理和备份系统】   [第 8 楼]

<?php

function user_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("select tagid,tagname,num,isgood,cid from {$dbtbpre}enewstags where tagname='".$tag_all[$i]."' order by tagid limit 1") ;
        $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("select tid,classid,id,mid from {$dbtbpre}enewstagsdata where tagid='".$tag_id[$i]."' order by classid ");
        $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:tid
        shuffle($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("select title,smalltext,titleurl,dp_jt,dp_dwz from {$dbtbpre}ecms_$tbname where id='".$id."' order by newstime limit 1") ;

        ////////显示样式在这修改
         echo $r_1_2['title'].' ' ;
        ////////
        }
        }       
?>
/**
<?php
OtherLink('news,info',7,3) ;
?>
**/      



[论坛教程] [普歌]
2014-03-06 04:10:26 已设置保密 顶部 回复 引用 报告 编辑 删除

hanxing3437
用户头衔:举人

精华贴   :0
发贴数   :251
经验值   :1223
注册时间:2009-11-08
信息 搜索 好友 发送悄悄话 精益求精-帝国网站管理系统7.5正式版开源发布】   [第 9 楼]

用了 生成不了!



帝国CMS精品模板
帝国CMS经典教程


2014-07-14 18:52:46 已设置保密 顶部 回复 引用 报告 编辑 删除

点到为止
用户头衔:探花

精华贴   :0
发贴数   :6570
经验值   :20599
注册时间:2008-01-07
信息 搜索 好友 发送悄悄话 免费开源-EBMA系统:更安全的MYSQL管理和备份系统】   [第 10 楼]

支持一下




2014-07-15 08:09:15 已设置保密 顶部 回复 引用 报告 编辑 删除
 1/2     1 2 ›› ›|

快速回复
内容

表情
使用EBB代码 使用smile代码 显示签名 自动分析url 自动分析img
     【进入高级模式】   (按 Ctrl+Enter 直接提交)
    顶部  加入收藏夹
关于帝国 | 广告服务 | 联系我们 | 法律声明 | 隐私条款 | 许可协议
Powered by: EBB Version 2.2.1