Discuz新添加关联链接

21
回复
1541
查看
  [复制链接]

微信扫一扫 分享朋友圈

1000

矿工

65万

金币

9万

娱乐币

管理员

Rank: 9Rank: 9Rank: 9

积分
694763

最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

QQ
发表于 2017-3-13 23:19:21 | 显示全部楼层 |阅读模式
DiscuzX2新添加关联链接



在 X2.0 中增加了关联链接,可以在指定范围内把 指定的文字 加上链接。
在 后台->运营->关联链接 处设置。

这里可以直接 添加、删除、更新 关联链接,并且可以选择该链接分别在 文章、论坛主题、群组主题、日志 中是否启用。

我们分析下这个代码的执行过程。
首先这个功能的路径是 /admin.php?action=misc&operation=relatedlink ,
我们根据这个链接可以定位到代码在  /source/admincp/admincp_misc.php 中,打开这个文件,搜 relatedlink

看到这样的代码:

  • } elseif($operation == 'relatedlink') {

  •         if(!submitcheck('linksubmit')) {

  • ?>
  • <script type="text/JavaScript">
  • var rowtypedata = [
  •         [
  •                 [1,'', 'td25'],
  •                 [1,'<input type="text" class="txt" name="newname[]" size="15">'],
  •                 [1,'<input type="text" name="newurl[]" size="50">'],
  •                 [1,'<input class="checkbox" type="checkbox" value="1" name="newarticle[]">'],
  •                 [1,'<input class="checkbox" type="checkbox" value="1" name="newforum[]">'],
  •                 [1,'<input class="checkbox" type="checkbox" value="1" name="newgroup[]">'],
  •                 [1,'<input class="checkbox" type="checkbox" value="1" name="newblog[]">']
  •         ]
  • ]
  • </script>
  • <?php

  •                 shownav('extended', 'misc_relatedlink');
  •                 showsubmenu('nav_misc_relatedlink');
  •                 /*search={"misc_relatedlink":"action=misc&operation=relatedlink"}*/
  •                 showtips('misc_relatedlink_tips');
  •                 /*search*/
  •                 showformheader('misc&operation=relatedlink');
  •                 showtableheader();
  •                 showsubtitle(array('', 'misc_relatedlink_edit_name', 'misc_relatedlink_edit_url', '<input class="checkbox" type="checkbox" name="articleall">'.cplang('misc_relatedlink_extent_article'), '<input class="checkbox" type="checkbox" name="forumall">'.cplang('misc_relatedlink_extent_forum'), '<input class="checkbox" type="checkbox" name="groupall">'.cplang('misc_relatedlink_extent_group'),'<input class="checkbox" type="checkbox" name="blogall">'.cplang('misc_relatedlink_extent_blog')));

  •                 $query = DB::query("SELECT * FROM ".DB::table('common_relatedlink')." ORDER BY id DESC");
  •                 while($link = DB::fetch($query)) {
  •                         $extent = sprintf('%04b', $link['extent']);
  •                         showtablerow('', array('class="td25"', '', '', 'class="td26"', 'class="td26"', 'class="td26"', ''), array(
  •                                 '<input type="checkbox" class="checkbox" name="delete[]" value="'.$link['id'].'" />',
  •                                 '<input type="text" class="txt" name="name['.$link[id].']" value="'.$link['name'].'" size="15" />',
  •                                 '<input type="text" name="url['.$link[id].']" value="'.$link['url'].'" size="50" />',
  •                                 '<input class="checkbox" type="checkbox" value="1" name="article['.$link[id].']" '.($extent[0] ? "checked" : '').'>',
  •                                 '<input class="checkbox" type="checkbox" value="1" name="forum['.$link[id].']" '.($extent[1] ? "checked" : '').'>',
  •                                 '<input class="checkbox" type="checkbox" value="1" name="group['.$link[id].']" '.($extent[2] ? "checked" : '').'>',
  •                                 '<input class="checkbox" type="checkbox" value="1" name="blog['.$link[id].']" '.($extent[3] ? "checked" : '').'>',
  •                         ));
  •                 }

  •                 echo '<tr><td></td><td colspan="6"><div><a href="###" class="addtr">'.$lang['misc_relatedlink_add'].'</a></div></td></tr>';
  •                 showsubmit('linksubmit', 'submit', 'del');
  •                 showtablefooter();
  •                 showformfooter();

  •         } else {

  •                 if($_G['gp_delete']) {
  •                         DB::delete('common_relatedlink', "id IN (".dimplode($_G['gp_delete']).")");
  •                 }

  •                 if(is_array($_G['gp_name'])) {
  •                         foreach($_G['gp_name'] as $id => $val) {
  •                                 $extent_str = intval($_G['gp_article'][$id]).intval($_G['gp_forum'][$id]).intval($_G['gp_group'][$id]).intval($_G['gp_blog'][$id]);
  •                                 $extent_str = intval($extent_str, '2');
  •                                 DB::update('common_relatedlink', array(
  •                                         'name' => $_G['gp_name'][$id],
  •                                         'url' => $_G['gp_url'][$id],
  •                                         'extent' => $extent_str,
  •                                 ), array(
  •                                         'id' => $id,
  •                                 ));
  •                         }
  •                 }

  •                 if(is_array($_G['gp_newname'])) {
  •                         foreach($_G['gp_newname'] as $key => $value) {
  •                                 if($value) {
  •                                         $extent_str = intval($_G['gp_newarticle'][$key]).intval($_G['gp_newforum'][$key]).intval($_G['gp_newgroup'][$key]).intval($_G['gp_newblog'][$key]);
  •                                         $extent_str = intval($extent_str, '2');
  •                                         DB::insert('common_relatedlink', array(
  •                                                 'name' => $value,
  •                                                 'url' => $_G['gp_newurl'][$key],
  •                                                 'extent' => $extent_str,
  •                                         ));
  •                                 }
  •                         }
  •                 }

  •                 updatecache('relatedlink');
  •                 cpmsg('relatedlink_succeed', 'action=misc&operation=relatedlink', 'succeed');

  •         }






当直接打开这个页面的时候,就是显示默认的已经存在的关联链接。
当点击 提交 的时候,会做三个处理。
1.删除处理
         如果提交之前,把某些关联链接前的 删除 勾打上的话,那么这里会先处理 删除 的操作。
代码为:
  • if($_G['gp_delete']) {
  • DB::delete('common_relatedlink', "id IN (".dimplode($_G['gp_delete']).")");
  • }



2.更新操作
       如果在操作之前,已经存在的关联链接被修改过,那么在提交的时候,这些链接会先做下更新。
对应的代码为:
  • if(is_array($_G['gp_name'])) {
  • foreach($_G['gp_name'] as $id => $val) {
  • $extent_str = intval($_G['gp_article'][$id]).intval($_G['gp_forum'][$id]).intval($_G['gp_group'][$id]).intval($_G['gp_blog'][$id]);
  • $extent_str = intval($extent_str, '2');
  • DB::update('common_relatedlink', array(
  • 'name' => $_G['gp_name'][$id],
  • 'url' => $_G['gp_url'][$id],
  • 'extent' => $extent_str,
  • ), array(
  • 'id' => $id,
  • ));
  • }
  • }



3.新添加的操作
        在提交前,如果有新添加的管链链接,则会执行相应的代码插入到数据中。
对应的代码为:
  • if(is_array($_G['gp_newname'])) {
  • foreach($_G['gp_newname'] as $key => $value) {
  • if($value) {
  • $extent_str = intval($_G['gp_newarticle'][$key]).intval($_G['gp_newforum'][$key]).intval($_G['gp_newgroup'][$key]).intval($_G['gp_newblog'][$key]);
  • $extent_str = intval($extent_str, '2');
  • DB::insert('common_relatedlink', array(
  • 'name' => $value,
  • 'url' => $_G['gp_newurl'][$key],
  • 'extent' => $extent_str,
  • ));
  • }
  • }
  • }



需要注意的时候,不管是更新还是新添加, 关联链接 在进入数据库之前,关于在那些模块启用的地方,都用了二进制形式来控制在那里显示,然后再变为 10 进制存的。
存储完以后,紧跟着做了缓存的更新,对应的代码是:
  • updatecache('relatedlink');



关于的缓存的更新,需要查看 /source/function/function_cache.php
然后调用了 /source/function/cache/cache_relatedlink.php
  • function build_cache_relatedlink() {
  •         global $_G;

  •         $data = array();
  •         $query = DB::query("SELECT * FROM ".DB::table('common_relatedlink'));
  •         while($link = DB::fetch($query)) {
  •                 if(substr($link['url'], 0, 7) != 'http://') {
  •                         $link['url'] = 'http://'.$link['url'];
  •                 }
  •                 $data[] = $link;
  •         }
  •         save_syscache('relatedlink', $data);
  • }


从这里能看到,最后缓存存到了 pre_common_syscache 中,其中 cname 就是 relatedlink 。

我们在看下前台发帖子等时候,使用我们刚刚添加的 关联链接的情况。

当我们查看帖子的时候,执行的文件是 /source/module/forum/forum_viewthread.php 文件。
在这个文件中,先得到设置在帖子中显示的关联链接,相应的代码是:

  • if(!defined('IN_ARCHIVER')) {
  •                 $post['message'] = discuzcode($post['message'], $post['smileyoff'], $post['bbcodeoff'], $post['htmlon'] & 1, $_G['forum']['allowsmilies'], $_G['forum']['allowbbcode'], ($_G['forum']['allowimgcode'] && $_G['setting']['showimages'] ? 1 : 0), $_G['forum']['allowhtml'], ($_G['forum']['jammer'] && $post['authorid'] != $_G['uid'] ? 1 : 0), 0, $post['authorid'], $_G['cache']['usergroups'][$post['groupid']]['allowmediacode'] && $_G['forum']['allowmediacode'], $post['pid']);
  •                 if($post['first']) {
  •                         if(!$_G['forum_thread']['isgroup']) {
  •                                 $_G['relatedlinks'] = getrelatedlink('forum');
  •                         } else {
  •                                 $_G['relatedlinks'] = getrelatedlink('group');
  •                         }
  •                 }
  •         }



把得到的 关联链接 存放到了全局变量 $_G 中,然后在 模板文件 中使用。
显示帖子的时候调用的模板文件是:/template/default/forum/viewthread.htm 文件。
这个文件相关的代码为:
  • <!--{if $_G['relatedlinks']}-->
  •         <div style="display: none">
  •                 <ul>
  •                         <!--{loop $_G['relatedlinks'] $key $link}-->
  •                         <li><a id="relatedlink_$key" href="$link[url]">$link[name]</a></li>
  •                         <!--{/loop}-->
  •                 </ul>
  •         </div>
  •         <script type="text/javascript">relatedlinks('postmessage_$_G[forum_firstpid]');</script>
  • <!--{/if}-->


然后执行了 js 的 relatedlinks 函数,该函数在 /static/js/common.js

通过这个文件中的 js 方法,使得 关联链接 在页面中显示。

0

矿工

671

金币

0

娱乐币

普通会员

Rank: 1

积分
670
发表于 2017-3-13 23:21:04 | 显示全部楼层
感谢分享!发帖赚点金币哈哈

0

矿工

730

金币

0

娱乐币

普通会员

Rank: 1

积分
729
发表于 2017-3-14 08:31:19 | 显示全部楼层
找了好久终于找到了!吾爱尚玩真棒!

0

矿工

590

金币

0

娱乐币

普通会员

Rank: 1

积分
942
发表于 2017-3-14 15:26:45 | 显示全部楼层
太棒了,感谢楼主

0

矿工

672

金币

0

娱乐币

普通会员

Rank: 1

积分
671
发表于 2017-3-15 06:24:51 | 显示全部楼层
找了好久终于找到了!吾爱尚玩真棒!

0

矿工

660

金币

0

娱乐币

普通会员

Rank: 1

积分
659
发表于 2017-3-15 13:07:39 | 显示全部楼层
感谢楼主分享,祝愿吾爱尚玩越来越好!

0

矿工

703

金币

0

娱乐币

普通会员

Rank: 1

积分
702
发表于 2017-3-15 20:56:01 | 显示全部楼层
找了好久终于找到了!感谢分享!

0

矿工

676

金币

0

娱乐币

普通会员

Rank: 1

积分
675
发表于 2017-3-17 16:56:12 | 显示全部楼层
感谢分享!发帖赚点金币哈哈

0

矿工

719

金币

0

娱乐币

普通会员

Rank: 1

积分
718
发表于 2017-3-18 22:35:24 | 显示全部楼层
找了好久终于找到了!吾爱尚玩真棒!

0

矿工

797

金币

0

娱乐币

普通会员

Rank: 1

积分
796
发表于 2017-3-19 03:10:57 | 显示全部楼层
感谢楼主分享,祝愿吾爱尚玩越来越好!

0

矿工

707

金币

0

娱乐币

普通会员

Rank: 1

积分
706
发表于 2017-3-19 16:11:32 | 显示全部楼层
100金币1块钱? 1块钱1-2个资源?

0

矿工

654

金币

0

娱乐币

普通会员

Rank: 1

积分
653
发表于 2017-3-19 23:57:30 | 显示全部楼层
太棒了,感谢楼主

0

矿工

726

金币

0

娱乐币

普通会员

Rank: 1

积分
725
发表于 2017-3-21 03:24:30 | 显示全部楼层
非常感谢!支持!

0

矿工

696

金币

0

娱乐币

普通会员

Rank: 1

积分
695
发表于 2017-3-21 05:43:20 | 显示全部楼层
非常感谢!支持!

0

矿工

613

金币

0

娱乐币

普通会员

Rank: 1

积分
612
发表于 2017-3-21 13:22:21 | 显示全部楼层
感谢楼主分享,祝愿吾爱尚玩越来越好!

0

矿工

708

金币

0

娱乐币

普通会员

Rank: 1

积分
707
发表于 2017-3-21 20:59:51 | 显示全部楼层
非常感谢!支持!

0

矿工

648

金币

0

娱乐币

普通会员

Rank: 1

积分
647
发表于 2017-3-26 03:33:51 | 显示全部楼层
支持!这价格相当于免费的了!

0

矿工

681

金币

0

娱乐币

普通会员

Rank: 1

积分
680
发表于 2017-3-26 23:45:55 | 显示全部楼层
楼主好棒!!!!

0

矿工

713

金币

0

娱乐币

普通会员

Rank: 1

积分
712
发表于 2017-3-27 08:08:48 | 显示全部楼层
找了好久终于找到了!吾爱尚玩真棒!

0

矿工

665

金币

0

娱乐币

普通会员

Rank: 1

积分
664
发表于 2017-3-28 04:23:20 | 显示全部楼层
支持!这价格相当于免费的了!
VIP介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ- 申请友链-站点统计-小黑屋- 吾爱尚玩资源基地|523play.com | VIP购买

Powered by Discuz!© 2016-2017 Comsenz Inc.