【道勤網(wǎng)】- bmrsportswear.com 軟件視頻自學(xué)教程|免費教程|自學(xué)電腦|3D教程|平面教程|影視動畫教程|辦公教程|機(jī)械設(shè)計教程|網(wǎng)站設(shè)計教程!【道勤網(wǎng)】

標(biāo)題: Discuz開發(fā) discuz x2 關(guān)聯(lián)鏈接原理分理 [打印本頁]

作者: 豬八戒    時間: 2018-6-26 19:24
標(biāo)題: Discuz開發(fā) discuz x2 關(guān)聯(lián)鏈接原理分理
   discuz x2 關(guān)聯(lián)鏈接,即在指定的范圍(文章,主題,群組,日志)內(nèi)容中出現(xiàn)的指定文字自動加上給定鏈接。下面我簡單解析一下關(guān)聯(lián)鏈接的實現(xiàn)原理,希望對一些不能正常顯示關(guān)聯(lián)鏈接的用戶提供一些參考。下面以論壇主題為例說明,其他各處與之原理相同。

涉及地方:后臺--運營--關(guān)聯(lián)鏈接--添加關(guān)聯(lián)鏈接。

當(dāng)我們打開主題內(nèi)容頁面,程序執(zhí)行到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}-->
復(fù)制代碼
在模板中輸出一段javascript代碼,并且將$_G['relatedlinks']中的數(shù)據(jù)以js數(shù)組的形式賦給relatedlink[]變量。然后執(zhí)行relatedlinks()函數(shù),該函數(shù)在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. }
復(fù)制代碼
該函數(shù)接受替換內(nèi)容所在的父元素的id,在這個例子中,父元素應(yīng)該是<td id="postmessage_帖子id" class="t_f"></td>替換文本使用到了js的replace方法,將設(shè)定的關(guān)聯(lián)子句替換成帶有關(guān)聯(lián)鏈接的內(nèi)容。

可能導(dǎo)致的關(guān)聯(lián)鏈接不顯示的原因分析:

1、程序、模板或者js文件被修改,導(dǎo)致$_G['relatedlinks']沒有讀取到,可以通過模板輸出數(shù)據(jù)調(diào)試的方式檢查,如果有問題可以將原程序模板等相關(guān)文件覆蓋還原。

2、20110627之前有一個關(guān)聯(lián)鏈接的bug,會導(dǎo)致關(guān)聯(lián)鏈接無法顯示,建議打上最新的補丁





歡迎光臨 【道勤網(wǎng)】- bmrsportswear.com 軟件視頻自學(xué)教程|免費教程|自學(xué)電腦|3D教程|平面教程|影視動畫教程|辦公教程|機(jī)械設(shè)計教程|網(wǎng)站設(shè)計教程!【道勤網(wǎng)】 (http://bmrsportswear.com/) Powered by Discuz! X3.4