猪八戒 发表于 2018-6-26 19:24:15

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

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

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

当我们打开主题内容页面,程序执行到furom_viewthread.php中的986行附近
<!--{if $_G['relatedlinks']}-->
<script
type="text/javascript">
var relatedlink =
[];
<!--{loop $_G['relatedlinks'] $key
$link}-->
relatedlink[$key] = {'sname':'$link',
'surl':'$link'};
<!--{/loop}-->
relatedlinks('postmessage_$_G');
</script>
<!--{/if}-->在模板中输出一段javascript代码,并且将$_G['relatedlinks']中的数据以js数组的形式赋给relatedlink[]变量。然后执行relatedlinks()函数,该函数在common_extra.js文件中。
function _relatedlinks(rlinkmsgid) {
if(!$(rlinkmsgid) || $(rlinkmsgid).innerHTML.match(/<script[^\>]*?>/i)) {
return;
}
var alink = new Array(), ignore = new Array();
var i = 0;
var msg = $(rlinkmsgid).innerHTML;
msg = msg.replace(/(<ignore_js_op\>[\s|\S]*?<\/ignore_js_op\>)/ig, function($1) {
ignore = $1;
i++;
return '#ignore_js_op '+(i - 1)+'#';
});
i = 0;
msg = msg.replace(/(<a.*?<\/a\>)/ig, function($1) {
alink = $1;
i++;
return '#alink '+(i - 1)+'#';
});
var relatedid = new Array();
msg = msg.replace(/(^|>)([^<]+)(?=<|$)/ig, function($1, $2, $3) {
for(var j = 0; j > -1; j++) {
if(relatedlink && !relatedid) {
var ra = '<a href="'+relatedlink['surl']+'" target="_blank" class="relatedlink">'+relatedlink['sname']+'</a>';
var $rtmp = $3;
$3 = $3.replace(relatedlink['sname'], ra);
if($3 != $rtmp) {
relatedid = 1;
}
} else {
break;
}
}
return $2 + $3;
});

for(var k in alink) {
msg = msg.replace('#alink '+k+'#', alink);
}

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

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

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

2、20110627之前有一个关联链接的bug,会导致关联链接无法显示,建议打上最新的补丁
页: [1]
查看完整版本: Discuz开发 discuz x2 关联链接原理分理