Discuz开发 discuz x2 关联链接原理分理

[复制链接]
站帮网 发表于 2012-4-18 18:05:49 [Discuz开发] 显示全部楼层 |阅读模式 上一主题 下一主题
discuz使用视频教程

马上注册,一起探讨正确快速的建站方法

您需要 登录 才可以下载或查看,没有帐号?快速注册

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,会导致关联链接无法显示,建议打上最新的补丁~




上一篇:Discuz官方图片区瀑布流的x2.5修改方法
下一篇:您的服务器无法访问应用中心的解决方法
站帮网站务联系QQ:261833848

大神点评5

dms333 发表于 2012-4-18 19:48:10 [Discuz开发] 显示全部楼层
受益非浅!!!
让医梦飞 发表于 2012-6-6 20:36:27 [Discuz开发] 显示全部楼层
说的不错哦 谢谢老大
网商翔云 发表于 2012-6-21 18:04:06 [Discuz开发] 显示全部楼层
不错,又学习了
暧昧过火啦 发表于 2012-6-22 09:42:47 [Discuz开发] 显示全部楼层
又收纳点知识
华年似水 发表于 2015-11-30 20:19:52 [Discuz开发] 显示全部楼层
我只是路过站帮网打酱油的,顺便支持下
中国教程库:http://www.jiaochengku.cn/
设计屋http://www.sjw5.com/
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

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