问题: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(会员注册页面),查找
  1.     uc_user_register($userid, $pwd, $email),在后面在添加一个参数$uname

    $uname 是我们注册时候的昵称字段

  1.     uc_user_register($userid, $pwd, $email,$uname
    1. #api{{
    2. if(defined('UC_API') && @include_once DEDEROOT.'/uc_client/client.php')
    3. {
    4. /**
    5. * 二次开发
    6. * 新增昵称字段
    7. * $uname
    8. */
    9. $uid = uc_user_register($userid, $pwd, $email,$uname);
    10. if($uid <= 0)
    11. {
    12. i f($uid == -1)
    13. {
    14. ShowMsg("用户名不合法!","-1");
    15. exit();
    16. }
    17.  
    18. ……

2.dedecms会员登陆时

  • 打开member/index_do.php,查找

    1. uc_user_register($userid, $pwd, $row['email'])
    1. 多查找一个uname字段,将查出来的字段,传给
    1. uc_user_register($userid, $pwd, $row['email'],$row['uname'])
    1. //当UC不存在该用而CMS存在,就注册一个.
    2. if($rs) {
    3. /**
    4. * 二次开发
    5. * 新增昵称
    6.  * 多查找一个`uname`字段    
    7. */
    8. $row = $dsql->GetOne("SELECT `email`,`uname` FROM #@__member WHERE userid='$userid'");
    9.  
    10. $uid = uc_user_register($userid, $pwd, $row['email'],$row['uname']);
    11.    if($uid > 0) $ucsynlogin = uc_user_synlogin($uid);
    12. } else {
    13. ………

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 的数组里面
    1. /**
    2. * 二次开发
    3. * 新增昵称字段
    4. * $nickname
    5. */
    6. function uc_user_register($username, $password, $email,$nickname='', $questionid = '', $answer = '') {
    7. return call_user_func(UC_API_FUNC, 'user', 'register', array('username'=>$username, 'password'=>$password, 'email'=>$email, 'questionid'=>$questionid, 'answer'=>$answer,'nickname'=>$nickname));
    8. }

4.打开uc_client/control/user.php,找到onregister()这个方法,

  • 在里面添加$nickname = $this->input('nickname');
  • $_ENV['user']->add_user($username, $password, $email, 0, $questionid, $answer,$nickname);
    1. function onregister() {
    2. $this->init_input();
    3. $username = $this->input('username');
    4. $password = $this->input('password');
    5. $email = $this->input('email');
    6. $questionid = $this->input('questionid');
    7. $answer = $this->input('answer');
    8. /**二次开发 新增昵称*/
    9. $nickname = $this->input('nickname');
    10. if(($status = $this->_check_username($username)) < 0) {
    11. return $status;
    12. }
    13. if(($status = $this->_check_email($email)) < 0) {
    14. return $status;
    15. }
    16. $uid = $_ENV['user']->add_user($username, $password, $email, 0, $questionid, $answer,$nickname);
    17. return $uid;
    18. }

5.打开uc_client/model/user.php

  • 查找function add_user($username, $password, $email, $uid = 0, $questionid = '', $answer = '')大概106行,添加一个$nickname的参数
  • 在免激活登陆代码中添加一个nickname
    1. function add_user($username, $password, $email, $uid = 0, $questionid = '', $answer = '',$nickname='') {
    2. $salt = substr(uniqid(rand()), -6);
    3. $password = md5(md5($password).$salt);
    4. $sqladd = $uid ? "uid='".intval($uid)."'," : '';
    5. $sqladd .= $questionid > 0 ? " secques='".$this->quescrypt($questionid, $answer)."'," : " secques='',";
    6. $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'");
    7. $uid = $this->db->insert_id();
    8. $this->db->query("INSERT INTO ".UC_DBTABLEPRE."memberfields SET uid='$uid'");
    9. /**
    10. * 二次开发
    11. * 免激活的登录discuz
    12. * 添加nickname
    13. */
    14. $regip = empty($regip) ? $this->base->onlineip : $regip;
    15. $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'");
    16. $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'");
    17. $this->db->query("INSERT INTO ".UC_DBNAME.".x_common_member_profile SET uid='$uid'");
    18. $this->db->query("INSERT INTO ".UC_DBNAME.".x_common_member_field_forum SET uid='$uid'");
    19. $this->db->query("INSERT INTO ".UC_DBNAME.".x_common_member_field_home SET uid='$uid'");
    20. $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'");
    21. return $uid;
    22. }

以上dedecms修改完之后,新用户登陆/注册dedecms的时候,就会在在discuz的会员表中添加基本信息,和nickname了!


 

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

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

1.打开discuz项目下的template/default/common/header_userstatus.html

查找:

  1. {$_G[member][username]}

修改为:

  1. {$_G[member][nickname]}

  

2.帖子列表主要是从帖子表里查询出来的,所以不能单纯的把username改成nickname,所以我们需要找到查询帖子数据的php文件,把nickname 查询出来,放进数组里面。

  • 打开source/module/forum/forum_forumdisplay.php,查询
    1. foreach($threadlist as $thread) {

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

    1. foreach($threadlist as $thread) {
    2. /**
    3. * 二次开发
    4. * 查询该帖子的用户昵称
    5. */
    6. $nick = C::t('common_member')->fetch_by_username($thread['author']);
    7. $thread['nickname'] = $nick['nickname'];
    8. $lastnick = C::t('common_member')->fetch_by_username($thread['lastposter']);
    9. $thread['lastnickname'] = $lastnick['nickname'];
    10.  
    11. ………………
  • 打开模版文件:template/default/forum/forum_forumdisplay.htm,查询
    1. $thread[author]
  • 修改为:

    1. $thread[nickname]
  • 查询:

    1. $thread[lastposter]
  • 修改为:

    1. $thread[lastnickname]
  1.  

3.帖子详情页的用户名改成昵称,也是需要修改php文件

  • 打开source/module/forum/forum_viewthread.php。在这个文件的任何地方都可做查询,我是在文件的40-45之间加的下面加粗的代码
    1. ……
    2. if($_G['setting']['cachethreadlife'] && $_G['forum']['threadcaches'] && !$_G['uid'] && $page == 1 && !$_G['forum']['special'] && empty($_GET['do']) && !defined('IN_ARCHIVER') && !defined('IN_MOBILE')) {
    3. viewthread_loadcache();
    4. }
    5. /**
    6. * 二次开发
    7. * 查询帖子的昵称
    8. */
    9. $nick = C::t('common_member')->fetch_by_username($thread['author']);
    10. $thread['nickname']=$nick['nickname'];
    11. $threadtableids = !empty($_G['cache']['threadtableids']) ? $_G['cache']['threadtableids'] : array();
    12. ……
  • 打开template/default/forum/viewthread_node.htm,把所有查找:

    1. $post[author]

    把查找到的所有的(超链接里面(2处)的别改)都修改为(一共6处):

    1. $post[nickname]

以上,就全部修改好了 !

我不是在修改的过程中记录的,做完之后才改的(应该流程过程是没问题),如果有什么问题,大家可以留言,我就及时更改的!

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

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


2019/7/11 后来发现改的地方挺多的,不止这三个地方……

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

大家有什么好的

discuss!X3.4 帖子显示昵称而不是用户名的解决办法的更多相关文章

  1. ps命令显示uid而不是用户名的解决方法

  2. combogrid翻页后保持显示内容为配置的textField解决办法

    easyui的combogrid当配置pagination为true进行分页时,当datagrid加载其他数据页,和上一次选中的valueField不匹配时,会导致combogrid直接显示value ...

  3. Ubuntu每次启动都显示System program problem detected的解决办法

    Ubuntu每次启动都显示System program problem detected的解决办法 sudo gedit /etc/default/apport 将enabled=1改为enabled ...

  4. MDK5使用Jlink下载显示 no cortex m sw divice 解决办法

    问题: (1)下面界面中找不到设备 (2)下载程序的时候提示" no cortex m sw divice " 然后是"target dll has been cance ...

  5. uploadify不能正确显示中文的按钮文本的解决办法

    uploadify 目前不能正确显示中文的按钮文本. 我发现bug的原因是uploadify错误的使用了 js 的 escape 和 flash 的 unescape配对,而这2个是不兼容的.正确的转 ...

  6. 部分安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法

    前端JS中使用XMLHttpRequest 2上传图片到服务器,PC端和大部分手机上都正常,但在少部分安卓手机上上传失败,服务器上查看图片,显示字节数为0.下面是上传图片的核心代码: HTML < ...

  7. XCode一直显示"scanning for working copies"的解决办法

    一个SVN上的项目,在本地重新CheckOut打开后,一直提示"scanning for working copies"且不能使用SVN的更新.提交等功能,当时想着晾它一晚上,看能 ...

  8. 动态IP无法获取默认网关,显示0.0.0.0的解决办法

    IP地址使用自动获取IP方式,可以获取到IP地址和子网掩码,默认网关无法获取,显示0.0.0.0,通过修复Winsock和LSP可以解决该问题,具体步骤如下:一.修复winsock1.单击开始> ...

  9. qt designer启动后不显示界面问题的原因与解决办法

    Qt 5.6.1无论是在vs里双击ui文件还是直接启动designer.exe都一直无法显示界面,但任务管理器中可以看到该进程是存在的.前几天还正常的,但昨天加了一块NVIDIA的显卡(机器自带核显) ...

随机推荐

  1. WEB服务器,TOMCAT和servlet之间的关系

    WEB服务器,TOMCAT和servlet之间的关系 什么是WEB服务器Web服务器是指能够为发出请求的浏览器提供文档的程序.服务器是 一种被动程序,只有浏览器发出请求的时候才会响应.应用层使用 的是 ...

  2. vs2017 .net core 项目调试浏览器网页闪退Bug

    from:https://blog.csdn.net/qq_36330228/article/details/82152187 vs更新2017最新版本后,项目调试浏览器莫名其妙出现闪退,每次都TMD ...

  3. 用mongols轻松打造websocket应用

    用websocket做聊天系统是非常合适的. mongols是一个运行于linux系统之上的开源c++库,可轻松开启一个websocket服务器. 首先,build一个websocket服务器. #i ...

  4. Logistic回归计算过程的推导

    https://blog.csdn.net/ligang_csdn/article/details/53838743 https://blog.csdn.net/weixin_30014549/art ...

  5. Color Schema 配色随笔

    附pdf文件: ColorSchema.pdf

  6. Java EE开发技术课程第六周(jsf、facelets)

    1.jsf(java sever faces) 1.1 jsf的定义: jsf是一种用于构建java web应用程序的框架.它提供了一种以组件为中心的用户界面(UI)构建方法,从而简化了Java服务器 ...

  7. Mysql如何进行分组,并且让每一组的结果按照某个字段排序,并且获取每一组的第一个字段

    select * from (select * from table_name order by id desc) h where h.catagory_id in(value1,value2,val ...

  8. [dart学习]第一篇:windows下安装配置dart编译环境,写出helloworld

    前言 博主非科班出身,平时多用C语言,最近想了解学习一门第二语言,看上了可用于移动开发的目前还小众一点dart,准备用一段比较长的时间来慢慢学习.理解. 关于dart语言不再详细介绍了,大家可以访问  ...

  9. MySQL_ALTER命令

    当我们需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令. 1)修改表名:表名可以在数据库中唯一标识一个table 命令格式:ALTER TABLE 旧名 RENAME 新名 ...

  10. Linux error numbers

    Linux error numbers, straight from the horse's mouth. #define EPERM 1 /* Operation not permitted */ ...