discuss!X3.4 帖子顯示昵稱而不是用戶名的解決辦法


問題:dedecmsV5.7和discuz!X3.4整合之后,實現免激活登陸之后,從dede過來的用戶在discuz 直接展示的用戶名,因為我們的用戶名是手機號,所以不想帖子都展示的是用戶名。

因為我們dedecms注冊有一個筆名/昵稱,所以就想把昵稱展示出來而不是直接展示用戶名。

思路:參考我之前發的免激活登陸,在x_common_member表里添加一個字段nickname varchar(50),在免激活的登陸的代碼中,多添加一個nickname的值,然后修改discuz帖子列表,帖子詳情頁的用戶名改成nickname。

涉及文件比較多,篇幅可能不較長。

解決辦法:

在discuz的數據庫的x_common_member表中添加一個字段nickname varchar(50)。

dedecms項目中修改:

1.dedecms會員注冊時

  • 打開member/reg_new.php(會員注冊頁面),查找
    uc_user_register($userid, $pwd, $email),在后面在添加一個參數$uname

    $uname 是我們注冊時候的昵稱字段

    uc_user_register($userid, $pwd, $email,$uname)
  • #api{{
    if(defined('UC_API') && @include_once DEDEROOT.'/uc_client/client.php')
    {
     /**
     * 二次開發
     * 新增昵稱字段
     * $uname
     */
     $uid = uc_user_register($userid, $pwd, $email,$uname);
     if($uid <= 0)
    {
    i    f($uid == -1)
        {
            ShowMsg("用戶名不合法!","-1");
            exit();
          }
    
    ……

2.dedecms會員登陸時

  • 打開member/index_do.php,查找
    uc_user_register($userid, $pwd, $row['email'])
  • 多查找一個uname字段,將查出來的字段,傳給
  • uc_user_register($userid, $pwd, $row['email'],$row['uname'])
    //當UC不存在該用而CMS存在,就注冊一個.
    if($rs) {
     /**
      * 二次開發
      * 新增昵稱
     * 多查找一個`uname`字段    
      */
         $row = $dsql->GetOne("SELECT `email`,`uname` FROM #@__member WHERE userid='$userid'");
    
         $uid = uc_user_register($userid, $pwd, $row['email'],$row['uname']);
       if($uid > 0) $ucsynlogin = uc_user_synlogin($uid);
    } else {
    ………

 3.打開uc_client/client.php,找到uc_user_register方法(如果你用的是phpstorm的話,按住ctrl,點擊uc_user_register($userid, $pwd, $email)方法名,就會跳轉到uc_client/client.php里的uc_user_register方法這里。

  • 在$email,后面添加$nickname,形參(什么名字)
  • 並把它放在return 的數組里面
  • /**
     * 二次開發
     * 新增昵稱字段
     * $nickname
     */
    function uc_user_register($username, $password, $email,$nickname='', $questionid = '', $answer = '') {
        return call_user_func(UC_API_FUNC, 'user', 'register', array('username'=>$username, 'password'=>$password, 'email'=>$email, 'questionid'=>$questionid, 'answer'=>$answer,'nickname'=>$nickname));
    }

 4.打開uc_client/control/user.php,找到onregister()這個方法,

  • 在里面添加$nickname = $this->input('nickname');
  • $_ENV['user']->add_user($username, $password, $email, 0, $questionid, $answer,$nickname);
  • function onregister() {
        $this->init_input();
        $username = $this->input('username');
        $password =  $this->input('password');
        $email = $this->input('email');
        $questionid = $this->input('questionid');
        $answer = $this->input('answer');
        /**二次開發 新增昵稱*/
        $nickname = $this->input('nickname'); if(($status = $this->_check_username($username)) < 0) {
            return $status;
        }
        if(($status = $this->_check_email($email)) < 0) {
            return $status;
        }
        $uid = $_ENV['user']->add_user($username, $password, $email, 0, $questionid, $answer,$nickname);
        return $uid;
    }

5.打開uc_client/model/user.php

  • 查找function add_user($username, $password, $email, $uid = 0, $questionid = '', $answer = '')大概106行,添加一個$nickname的參數
  • 在免激活登陸代碼中添加一個nickname
  • function add_user($username, $password, $email, $uid = 0, $questionid = '', $answer = '',$nickname='') {
        $salt = substr(uniqid(rand()), -6);
        $password = md5(md5($password).$salt);
        $sqladd = $uid ? "uid='".intval($uid)."'," : '';
        $sqladd .= $questionid > 0 ? " secques='".$this->quescrypt($questionid, $answer)."'," : " secques='',";
        $this->db->query("INSERT INTO ".UC_DBTABLEPRE."members SET $sqladd username='$username', password='$password', email='$email', regip='".$this->base->onlineip."', regdate='".$this->base->time."', salt='$salt'");
        $uid = $this->db->insert_id();
        $this->db->query("INSERT INTO ".UC_DBTABLEPRE."memberfields SET uid='$uid'");
            /**
             * 二次開發
             * 免激活的登錄discuz
             * 添加nickname
             */
            $regip = empty($regip) ? $this->base->onlineip : $regip;
            $this->db->query("INSERT INTO ".UC_DBNAME.".x_common_member SET uid='$uid', username='$username', password='$password', email='$email', adminid='0', groupid='10', regdate='".$this->base->time."', credits='0', timeoffset='9999',nickname='$nickname'");
            $this->db->query("INSERT INTO ".UC_DBNAME.".x_common_member_status SET uid='$uid', regip='$regip', lastip='$regip', lastvisit='".$this->base->time."', lastactivity='".$this->base->time."', lastpost='0', lastsendmail='0'");
            $this->db->query("INSERT INTO ".UC_DBNAME.".x_common_member_profile SET uid='$uid'");
            $this->db->query("INSERT INTO ".UC_DBNAME.".x_common_member_field_forum SET uid='$uid'");
            $this->db->query("INSERT INTO ".UC_DBNAME.".x_common_member_field_home SET uid='$uid'");
            $this->db->query("INSERT INTO ".UC_DBNAME.".x_common_member_count SET uid='$uid', extcredits1='0', extcredits2='0', extcredits3='0', extcredits4='0', extcredits5='0', extcredits6='0', extcredits7='0', extcredits8='0'");
            return $uid;
        }

以上dedecms修改完之后,新用戶登陸/注冊dedecms的時候,就會在在discuz的會員表中添加基本信息,和nickname了!

 


 

 

下面,修改一下discuz!X3.4中的一些模版文件

在discuz!X3.4(樣式用的是默認模版)中修改: 

 

1.打開discuz項目下的template/default/common/header_userstatus.html

查找:

{$_G[member][username]}

修改為:

{$_G[member][nickname]}

  

2.帖子列表主要是從帖子表里查詢出來的,所以不能單純的把username改成nickname,所以我們需要找到查詢帖子數據的php文件,把nickname 查詢出來,放進數組里面。

  • 打開source/module/forum/forum_forumdisplay.php,查詢
  • foreach($threadlist as $thread) {

     大概在677行左右;在循環里添加下面四行代碼:

  • foreach($threadlist as $thread) {
        /**
         * 二次開發
         * 查詢該帖子的用戶昵稱
         */
        $nick = C::t('common_member')->fetch_by_username($thread['author']);
        $thread['nickname'] = $nick['nickname'];
        $lastnick = C::t('common_member')->fetch_by_username($thread['lastposter']);
        $thread['lastnickname'] = $lastnick['nickname'];
    
    ………………
  • 打開模版文件:template/default/forum/forum_forumdisplay.htm,查詢
  • $thread[author]
  • 修改為:
  • $thread[nickname]
  • 查詢:
  • $thread[lastposter]
  • 修改為:
  • $thread[lastnickname]
 

3.帖子詳情頁的用戶名改成昵稱,也是需要修改php文件

  • 打開source/module/forum/forum_viewthread.php。在這個文件的任何地方都可做查詢,我是在文件的40-45之間加的下面加粗的代碼
  • ……
    if($_G['setting']['cachethreadlife'] && $_G['forum']['threadcaches'] && !$_G['uid'] && $page == 1 && !$_G['forum']['special'] && empty($_GET['do']) && !defined('IN_ARCHIVER') && !defined('IN_MOBILE')) {
        viewthread_loadcache();
    }
    /**
     * 二次開發
     * 查詢帖子的昵稱
     */
    $nick = C::t('common_member')->fetch_by_username($thread['author']); $thread['nickname']=$nick['nickname']; $threadtableids = !empty($_G['cache']['threadtableids']) ? $_G['cache']['threadtableids'] : array();
    ……

     

  • 打開template/default/forum/viewthread_node.htm,把所有查找:

  • $post[author]

     

     把查找到的所有的(超鏈接里面(2處)的別改)都修改為(一共6處):

  • $post[nickname]

     


 

以上,就全部修改好了 !

 

我不是在修改的過程中記錄的,做完之后才改的(應該流程過程是沒問題),如果有什么問題,大家可以留言,我就及時更改的!

如果有更簡單的方法,也可以分享一下!

 

好了,我要去看discuz的文檔了!

 

 


2019/7/11 后來發現改的地方挺多的,不止這三個地方……

有什么好的方法可以分享一下

大家有什么好的

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM