立即注册 找回密码

QQ登录

只需一步,快速开始

查看: 4708|回复: 0

[Discuz 开发教程] discuz x2 关联链接原理分理

[复制链接]
发表于 2015-1-11 12:48:59 | 显示全部楼层 |阅读模式
道勤网-数据www.daoqin.net

亲注册登录道勤网-可以查看更多帖子内容哦!(包涵精彩图片、文字详情等)请您及时注册登录-www.daoqin.net

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  discuz x2 关联链接,即在指定的范围(文章,主题,群组,日志)内容中出现的指定文字自动加上给定链接。下面我简单解析一下关联链接的实现原理,希望对一些不能正常显示关联链接的用户提供一些参考。下面以论坛主题为例说明,其他各处与之原理相同。

涉及地方:后台--运营--关联链接--添加关联链接。

当我们打开主题内容页面,程序执行到furom_viewthread.php中的986行附近
  1. <!--{if $_G['relatedlinks']}-->
  2. <script
  3. type="text/javascript">
  4. var relatedlink =
  5. [];
  6. <!--{loop $_G['relatedlinks'] $key
  7. $link}-->
  8. relatedlink[$key] = {'sname':'$link[name]',
  9. 'surl':'$link[url]'};
  10. <!--{/loop}-->
  11. relatedlinks('postmessage_$_G[forum_firstpid]');
  12. </script>
  13. <!--{/if}-->
复制代码
在模板中输出一段javascript代码,并且将$_G['relatedlinks']中的数据以js数组的形式赋给relatedlink[]变量。然后执行relatedlinks()函数,该函数在common_extra.js文件中。
  1. function _relatedlinks(rlinkmsgid) {
  2. if(!$(rlinkmsgid) || $(rlinkmsgid).innerhtml.match(/<script[^\>]*?>/i)) {
  3. return;
  4. }
  5. var alink = new Array(), ignore = new Array();
  6. var i = 0;
  7. var msg = $(rlinkmsgid).innerHTML;
  8. msg = msg.replace(/(<ignore_js_op\>[\s|\S]*?<\/ignore_js_op\>)/ig, function($1) {
  9. ignore[i] = $1;
  10. i++;
  11. return '#ignore_js_op '+(i - 1)+'#';
  12. });
  13. i = 0;
  14. msg = msg.replace(/(<a.*?<\/a\>)/ig, function($1) {
  15. alink[i] = $1;
  16. i++;
  17. return '#alink '+(i - 1)+'#';
  18. });
  19. var relatedid = new Array();
  20. msg = msg.replace(/(^|>)([^<]+)(?=<|$)/ig, function($1, $2, $3) {
  21. for(var j = 0; j > -1; j++) {
  22. if(relatedlink[j] && !relatedid[j]) {
  23. var ra = '<a href="'+relatedlink[j]['surl']+'" target="_blank" class="relatedlink">'+relatedlink[j]['sname']+'</a>';
  24. var $rtmp = $3;
  25. $3 = $3.replace(relatedlink[j]['sname'], ra);
  26. if($3 != $rtmp) {
  27. relatedid[j] = 1;
  28. }
  29. } else {
  30. break;
  31. }
  32. }
  33. return $2 + $3;
  34. });

  35. for(var k in alink) {
  36. msg = msg.replace('#alink '+k+'#', alink[k]);
  37. }

  38. for(var l in ignore) {
  39. msg = msg.replace('#ignore_js_op '+l+'#', ignore[l]);
  40. }
  41. $(rlinkmsgid).innerHTML = msg;
  42. }
复制代码
该函数接受替换内容所在的父元素的id,在这个例子中,父元素应该是<td id="postmessage_帖子id" class="t_f"></td>替换文本使用到了js的replace方法,将设定的关联子句替换成带有关联链接的内容。

可能导致的关联链接不显示的原因分析:

1、程序、模板或者js文件被修改,导致$_G['relatedlinks']没有读取到,可以通过模板输出数据调试的方式检查,如果有问题可以将原程序模板等相关文件覆盖还原。

2、20110627之前有一个关联链接的bug,会导致关联链接无法显示,建议打上最新的补丁~
道勤主机提供365天*24小时全年全天无休、实时在线、零等待的售后技术支持。竭力为您免费处理您在使用道勤主机过程中所遇到的一切问题! 如果您是道勤主机用户,那么您可以通过QQ【792472177】、售后QQ【59133755】、旺旺【诠释意念】、微信:q792472177免费电话、后台提交工单这些方式联系道勤主机客服! 如果您不是我们的客户也没问题,点击页面最右边的企业QQ在线咨询图标联系我们并购买后,我们为您免费进行无缝搬家服务,让您享受网站零访问延迟的迁移到道勤主机的服务!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

道勤网- 推荐内容!上一条 /2 下一条

!jz_fbzt! !jz_sgzt! !jz_xgzt! 快速回复 !jz_fhlb! !jz_lxwm! !jz_gfqqq!

关于我们|手机版|小黑屋|地图|【道勤网】-www.daoqin.net 软件视频自学教程|免费教程|自学电脑|3D教程|平面教程|影视动画教程|办公教程|机械设计教程|网站设计教程 ( 皖ICP备15000319号-1 )

GMT+8, 2024-12-19 12:48

Powered by DaoQin! X3.4 © 2016-2063 Dao Qin & 道勤科技

快速回复 返回顶部 返回列表