Discuz! X2 新添加關聯鏈接

  在 X2.0 中增加了關聯鏈接,可以在指定範圍內把 指定的文字 加上鍊接。
在 後臺->運營->關聯鏈接 處設置。

這裏可以直接 添加、刪除、更新 關聯鏈接,並且可以選擇該鏈接分別在 文章、論壇主題、羣組主題、日誌 中是否啓用。

我們分析下這個代碼的執行過程。
首先這個功能的路徑是 /admin.php?action=misc&operation=relatedlink ,
我們根據這個鏈接可以定位到代碼在  /source/admincp/admincp_misc.php 中,打開這個文件,搜 relatedlink

看到這樣的代碼:

  1. } elseif($operation == 'relatedlink') {
  2.  
  3.         if(!submitcheck('linksubmit')) {
  4.  
  5. ?>
  6. <script type="text/JavaScript">
  7. var rowtypedata = [
  8.         [
  9.                 [1,'', 'td25'],
  10.                 [1,'<input type="text" class="txt" name="newname[]" size="15">'],
  11.                 [1,'<input type="text" name="newurl[]" size="50">'],
  12.                 [1,'<input class="checkbox" type="checkbox" value="1" name="newarticle[]">'],
  13.                 [1,'<input class="checkbox" type="checkbox" value="1" name="newforum[]">'],
  14.                 [1,'<input class="checkbox" type="checkbox" value="1" name="newgroup[]">'],
  15.                 [1,'<input class="checkbox" type="checkbox" value="1" name="newblog[]">']
  16.         ]
  17. ]
  18. </script>
  19. <?php
  20.  
  21.                 shownav('extended', 'misc_relatedlink');
  22.                 showsubmenu('nav_misc_relatedlink');
  23.                 /*search={"misc_relatedlink":"action=misc&operation=relatedlink"}*/
  24.                 showtips('misc_relatedlink_tips');
  25.                 /*search*/
  26.                 showformheader('misc&operation=relatedlink');
  27.                 showtableheader();
  28.                 showsubtitle(array('', 'misc_relatedlink_edit_name', 'misc_relatedlink_edit_url', '<input class="checkbox" type="checkbox" name="articleall">'.cplang('misc_relatedlink_extent_article'), '<input class="checkbox" type="checkbox" name="forumall">'.cplang('misc_relatedlink_extent_forum'), '<input class="checkbox" type="checkbox" name="groupall">'.cplang('misc_relatedlink_extent_group'),'<input class="checkbox" type="checkbox" name="blogall">'.cplang('misc_relatedlink_extent_blog')));
  29.  
  30.                 $query = DB::query("SELECT * FROM ".DB::table('common_relatedlink')." ORDER BY id DESC");
  31.                 while($link = DB::fetch($query)) {
  32.                         $extent = sprintf('%04b', $link['extent']); 
  33.                         showtablerow('', array('class="td25"', '', '', 'class="td26"', 'class="td26"', 'class="td26"', ''), array(
  34.                                 '<input type="checkbox" class="checkbox" name="delete[]" value="'.$link['id'].'" />',
  35.                                 '<input type="text" class="txt" name="name['.$link[id].']" value="'.$link['name'].'" size="15" />',
  36.                                 '<input type="text" name="url['.$link[id].']" value="'.$link['url'].'" size="50" />',
  37.                                 '<input class="checkbox" type="checkbox" value="1" name="article['.$link[id].']" '.($extent[0] ? "checked" : '').'>',
  38.                                 '<input class="checkbox" type="checkbox" value="1" name="forum['.$link[id].']" '.($extent[1] ? "checked" : '').'>',
  39.                                 '<input class="checkbox" type="checkbox" value="1" name="group['.$link[id].']" '.($extent[2] ? "checked" : '').'>',
  40.                                 '<input class="checkbox" type="checkbox" value="1" name="blog['.$link[id].']" '.($extent[3] ? "checked" : '').'>',
  41.                         ));
  42.                 }
  43.  
  44.                 echo '<tr><td></td><td colspan="6"><div><a href="###" class="addtr">'.$lang['misc_relatedlink_add'].'</a></div></td></tr>';
  45.                 showsubmit('linksubmit', 'submit', 'del');
  46.                 showtablefooter();
  47.                 showformfooter();
  48.  
  49.         } else {
  50.  
  51.                 if($_G['gp_delete']) {
  52.                         DB::delete('common_relatedlink', "id IN (".dimplode($_G['gp_delete']).")");
  53.                 }
  54.  
  55.                 if(is_array($_G['gp_name'])) {
  56.                         foreach($_G['gp_name'] as $id => $val) {
  57.                                 $extent_str = intval($_G['gp_article'][$id]).intval($_G['gp_forum'][$id]).intval($_G['gp_group'][$id]).intval($_G['gp_blog'][$id]); 
  58.                                 $extent_str = intval($extent_str, '2'); 
  59.                                 DB::update('common_relatedlink', array(
  60.                                         'name' => $_G['gp_name'][$id],
  61.                                         'url' => $_G['gp_url'][$id],
  62.                                         'extent' => $extent_str,
  63.                                 ), array(
  64.                                         'id' => $id,
  65.                                 ));
  66.                         }
  67.                 }
  68.  
  69.                 if(is_array($_G['gp_newname'])) {
  70.                         foreach($_G['gp_newname'] as $key => $value) {
  71.                                 if($value) {
  72.                                         $extent_str = intval($_G['gp_newarticle'][$key]).intval($_G['gp_newforum'][$key]).intval($_G['gp_newgroup'][$key]).intval($_G['gp_newblog'][$key]); 
  73.                                         $extent_str = intval($extent_str, '2'); 
  74.                                         DB::insert('common_relatedlink', array(
  75.                                                 'name' => $value,
  76.                                                 'url' => $_G['gp_newurl'][$key],
  77.                                                 'extent' => $extent_str,
  78.                                         ));
  79.                                 }
  80.                         }
  81.                 }
  82.  
  83.                 updatecache('relatedlink');
  84.                 cpmsg('relatedlink_succeed', 'action=misc&operation=relatedlink', 'succeed');
  85.  
  86.         }
複製代碼


當直接打開這個頁面的時候,就是顯示默認的已經存在的關聯鏈接。
當點擊 提交 的時候,會做三個處理。
1.刪除處理
         如果提交之前,把某些關聯鏈接前的 刪除 勾打上的話,那麼這裏會先處理 刪除 的操作。
代碼爲:

  1. if($_G['gp_delete']) {
  2. DB::delete('common_relatedlink', "id IN (".dimplode($_G['gp_delete']).")");
  3. }
複製代碼


2.更新操作
       如果在操作之前,已經存在的關聯鏈接被修改過,那麼在提交的時候,這些鏈接會先做下更新。
對應的代碼爲:

  1. if(is_array($_G['gp_name'])) {
  2. foreach($_G['gp_name'] as $id => $val) {
  3. $extent_str = intval($_G['gp_article'][$id]).intval($_G['gp_forum'][$id]).intval($_G['gp_group'][$id]).intval($_G['gp_blog'][$id]);
  4. $extent_str = intval($extent_str, '2');
  5. DB::update('common_relatedlink', array(
  6. 'name' => $_G['gp_name'][$id],
  7. 'url' => $_G['gp_url'][$id],
  8. 'extent' => $extent_str,
  9. ), array(
  10. 'id' => $id,
  11. ));
  12. }
  13. }
複製代碼


3.新添加的操作
        在提交前,如果有新添加的管鏈鏈接,則會執行相應的代碼插入到數據中。
對應的代碼爲:

  1. if(is_array($_G['gp_newname'])) {
  2. foreach($_G['gp_newname'] as $key => $value) {
  3. if($value) {
  4. $extent_str = intval($_G['gp_newarticle'][$key]).intval($_G['gp_newforum'][$key]).intval($_G['gp_newgroup'][$key]).intval($_G['gp_newblog'][$key]);
  5. $extent_str = intval($extent_str, '2');
  6. DB::insert('common_relatedlink', array(
  7. 'name' => $value,
  8. 'url' => $_G['gp_newurl'][$key],
  9. 'extent' => $extent_str,
  10. ));
  11. }
  12. }
  13. }
複製代碼


需要注意的時候,不管是更新還是新添加, 關聯鏈接 在進入數據庫之前,關於在那些模塊啓用的地方,都用了二進制形式來控制在那裏顯示,然後再變爲 10 進制存的。
存儲完以後,緊跟着做了緩存的更新,對應的代碼是:

  1. updatecache('relatedlink');
複製代碼


關於的緩存的更新,需要查看 /source/function/function_cache.php
然後調用了 /source/function/cache/cache_relatedlink.php

  1. function build_cache_relatedlink() {
  2.         global $_G;
  3.  
  4.         $data = array();
  5.         $query = DB::query("SELECT * FROM ".DB::table('common_relatedlink'));
  6.         while($link = DB::fetch($query)) {
  7.                 if(substr($link['url'], 0, 7) != 'http://') {
  8.                         $link['url'] = 'http://'.$link['url'];
  9.                 }
  10.                 $data[] = $link;
  11.         }
  12.         save_syscache('relatedlink', $data);
  13. }
複製代碼

從這裏能看到,最後緩存存到了 pre_common_syscache 中,其中 cname 就是 relatedlink 。

我們在看下前臺發帖子等時候,使用我們剛剛添加的 關聯鏈接的情況。

當我們查看帖子的時候,執行的文件是 /source/module/forum/forum_viewthread.php 文件。
在這個文件中,先得到設置在帖子中顯示的關聯鏈接,相應的代碼是:

  1. if(!defined('IN_ARCHIVER')) {
  2.                 $post['message'] = discuzcode($post['message'], $post['smileyoff'], $post['bbcodeoff'], $post['htmlon'] & 1, $_G['forum']['allowsmilies'], $_G['forum']['allowbbcode'], ($_G['forum']['allowimgcode'] && $_G['setting']['showimages'] ? 1 : 0), $_G['forum']['allowhtml'], ($_G['forum']['jammer'] && $post['authorid'] != $_G['uid'] ? 1 : 0), 0, $post['authorid'], $_G['cache']['usergroups'][$post['groupid']]['allowmediacode'] && $_G['forum']['allowmediacode'], $post['pid']);
  3.                 if($post['first']) {
  4.                         if(!$_G['forum_thread']['isgroup']) {
  5.                                 $_G['relatedlinks'] = getrelatedlink('forum');
  6.                         } else {
  7.                                 $_G['relatedlinks'] = getrelatedlink('group');
  8.                         }
  9.                 }
  10.         }
複製代碼


把得到的 關聯鏈接 存放到了全局變量 $_G 中,然後在 模板文件 中使用。
顯示帖子的時候調用的模板文件是:/template/default/forum/viewthread.htm 文件。
這個文件相關的代碼爲:

  1. <!--{if $_G['relatedlinks']}-->
  2.         <div style="display: none">
  3.                 <ul>
  4.                         <!--{loop $_G['relatedlinks'] $key $link}-->
  5.                         <li><a id="relatedlink_$key" href="$link[url]">$link[name]</a></li>
  6.                         <!--{/loop}-->
  7.                 </ul>
  8.         </div>
  9.         <script type="text/javascript">relatedlinks('postmessage_$_G[forum_firstpid]');</script>
  10. <!--{/if}-->
複製代碼

然後執行了 js 的 relatedlinks 函數,該函數在 /static/js/common.js

通過這個文件中的 js 方法,使得 關聯鏈接 在頁面中顯示。

本文由3D電影下載編譯!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章