Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

X2 关联链接原理解析

[复制链接]
nxy105 发表于 2011-6-28 16:31:12 | 显示全部楼层 |阅读模式
本帖最后由 nxy105 于 2011-6-28 16:33 编辑

X2推出了一个关联链接的新功能。关联链接,即在指定的范围(文章,主题,群组,日志)内容中出现的指定文字自动加上给定链接的功能。
但论坛中,有些用户反映关联链接的功能失效等问题,下面我简单解析一下关联链接的实现原理,希望对一些不能正常显示关联链接的用户提供一些参考。

下面我以论坛主题为例说明,其他各处与之原理相同。


首先我们在后台运营--关联链接内添加关联链接。
当我们打开主题内容页面,程序执行到furom_viewthread.php中的986行附近
  1. $_G['relatedlinks'] = getrelatedlink('forum');
复制代码
调用function_core.php中的getrelatedlink()函数,该函数从数据库中获取关联链接的缓存数据,返回给$_G['relatedlinks']。
在输出的模板viewthread.htm中有这样一段代码:
  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,会导致关联链接无法显示,建议打上最新的补丁~

评分

1

查看全部评分

408904199 发表于 2011-6-28 16:53:09 | 显示全部楼层
楼主能编写提供 lighttpd Discuz X2.0 伪静态规则吗?
回复

使用道具 举报

pcyi 发表于 2011-6-30 12:00:55 | 显示全部楼层
支持!
回复

使用道具 举报

ARCHY` 发表于 2011-7-1 01:05:47 | 显示全部楼层
支持个!!!
回复

使用道具 举报

午夜冷咖啡 发表于 2011-8-13 12:13:59 | 显示全部楼层
了解了。。。正在研究这个问题在呢。。。
回复

使用道具 举报

xiaomamao 发表于 2011-8-19 02:54:20 | 显示全部楼层
8月17,用了最新版本的,关联链接还是不显示,只有日志上的可以显示
回复

使用道具 举报

平(⊙o⊙)凡 发表于 2011-8-30 19:15:07 | 显示全部楼层
看不明白
回复

使用道具 举报

钻石家族 发表于 2011-9-3 20:16:30 | 显示全部楼层
一大片代码 看不懂
回复

使用道具 举报

小草也疯狂 发表于 2011-9-6 16:27:35 | 显示全部楼层
打上补丁好像还是不行 http://www.fjnumcs.com/sitemap.php
回复

使用道具 举报

莫寂语 发表于 2011-9-6 16:32:35 | 显示全部楼层
这么好的东西现在才发现,{:soso__3384804181821621989_4:}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-11-23 22:32 , Processed in 0.033629 second(s), 8 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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