• 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 后来发现改的地方挺多的,不止这三个地方……

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

    大家有什么好的

  • 相关阅读:
    SVN使用指引(Windows)
    Android开发14——监听内容提供者ContentProvider的数据变化
    Android开发13——内容提供者ContentProvider的基本使用
    Android开发12——Andorid中操作数据库的insert的两种方法以及nullColumnHack
    Android开发11——手机横屏和竖屏与android:configChanges
    Android开发10——Activity的跳转与传值
    Android开发9——Activity的启动模式
    Android开发8——利用pull解析器读写XML文件
    Android开发7——android.database.CursorIndexOutOfBoundsException:Index -1 requested
    Android开发6——布局中的wrap_content和fill_parent以及match_parent
  • 原文地址:https://www.cnblogs.com/pawn-i/p/10784192.html
Copyright © 2020-2023  润新知