发新帖

DISCUZ 昵称[注册、显示、唯一性]解决方案

[复制链接]
1810 0
以下是详细的设置步骤:
1、在管理员后台—用户—用户栏目-栏目列表里,点击[自定义字段1]最后的编辑
在打开的页面里:做如下设置
栏目名称:昵称
栏目介绍:请输入昵称,一经注册不允许修改
表单类型:单行文本框
是否启用:是
提交后不可修改:是
是否必填:是
是否在注册页面显示:是
是否在名片中显示:是
其它项目默认:点击提交保存。

换个浏览器打开注册页,验证下是否显示昵称项了。

2、打开source\language\lang_message.php,改完后提交至服务器
加入:
  1. <span style="font-family: Tahoma, Helvetica, SimSun, sans-serif; ">'profile_nickname_tooshort' => '抱歉,您输入的昵称小于 3 个字符,请输入一个较长的用户名',</span>
  2. <span style="font-family: Tahoma, Helvetica, SimSun, sans-serif; ">'profile_nickname_toolong' => '抱歉,您输入的昵称超过 15 个字符,请输入一个较短的用户名',</span>
  3. <span style="font-family: Tahoma, Helvetica, SimSun, sans-serif; ">'profile_nickname_duplicate' => '该昵称已被注册',</span>
复制代码


3、打开source\module\forum\forum_ajax.php,改完后提交至服务器
  1. 在跟if($_GET['action'] == 'checkusername')平级的if/else分支中,加入:
  2. elseif ($_GET['action'] == 'checknickname') {
  3. $nickname = trim($_GET['nickname']);
  4. $nicknamelen = dstrlen($nickname);
  5. if($nicknamelen < 3) {
  6. showmessage('profile_nickname_tooshort', '', array(), array('handle' => false));
  7. } elseif($nicknamelen > 15) {
  8. showmessage('profile_nickname_toolong', '', array(), array('handle' => false));
  9. }
  10. if(C::t('common_member_profile')->count_by_field('field1', $nickname) == 0) {
  11. //showmessage('<img src="'.$_G['style']['imgdir'].'/check_right.gif" width="13" height="13">', '', array(), array('msgtype' => 3));
  12. } else {
  13. showmessage('register_check_found', '', array(), array('handle' => false));
  14. }
  15. }
复制代码

4、打开static\js\register.js,改完后提交至服务器
  1. 加入一个函数:
  2. function checknickname(id) {
  3. errormessage(id);
  4. var username = trim($(id).value);
  5. if($('tip_' + id).parentNode.className.match(/ p_right/) && (username == '' || username == lastusername)) {
  6. return;
  7. } else {
  8. lastusername = username;
  9. }
  10. if(username.match(/<|"/ig)) {
  11. errormessage(id, '昵称包含敏感字符');
  12. return;
  13. }
  14. var unlen = username.replace(/[^\x00-\xff]/g, "**").length;
  15. if(unlen < 3 || unlen > 15) {
  16. errormessage(id, unlen < 3 ? '昵称不得小于 3 个字符' : '昵称不得超过 15 个字符');
  17. return;
  18. }
  19. var x = new Ajax();
  20. $('tip_' + id).parentNode.className = $('tip_' + id).parentNode.className.replace(/ p_right/, '');
  21. x.get('forum.php?mod=ajax&inajax=yes&infloat=register&handlekey=register&ajaxmenu=1&action=checknickname&nickname=' + (BROWSER.ie && document.charset == 'utf-8' ? encodeURIComponent(username) : username.replace(/%/g, '%25').replace(/#/g, '%23')), function(s) {
  22. errormessage(id, s);
  23. });
  24. }
  25. 在addFormEvent这个函数里,找到
  26. formNode[stmp[0]].onblur = function () {
  27. checkusername(formNode[stmp[0]].id);
  28. };
  29. 在后面加入:
  30. formNode[8].onblur = function () {
  31. checknickname(formNode[8].id);
  32. };
复制代码

第二个问题:帖子列表页显示昵称
1、打开source\module\forum\forum_forumdisplay.php
查找
  1. foreach($threadlist as $thread) {
复制代码


在下一行加入
  1. <span style="font-family: Tahoma, Helvetica, SimSun, sans-serif; ">$thread['author_profile'] = C::t('common_member_profile')->fetch($thread['authorid']);</span>
  2. <span style="font-family: Tahoma, Helvetica, SimSun, sans-serif; ">$lastpostuser = C::t('common_member')->fetch_by_username($thread['lastposter']);</span>
  3. <span style="font-family: Tahoma, Helvetica, SimSun, sans-serif; ">$thread['lastposter_profile'] = C::t('common_member_profile')->fetch($lastpostuser['uid']);</span>
复制代码
2、打开template\default\forum\forumdisplay_list.htm
如果使用其他模板,请替换default为实际模板的路径
查找
  1. $thread[author]
复制代码

替换成
  1. $thread[author_profile]['field1']
复制代码


查找
  1. $thread[poster]
复制代码

替换成
  1. $thread[lastposter_profile]['field1']
复制代码
到这里,注册的时候输入昵称后可以提示昵称是否被占用了。
但是会有个问题,如果还继续点提交注册的话,还是可以注册成功的。。。。。

举报 使用道具

回复
*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

更多

客服中心

400-800-8888 周一至周日8:30-20:30 仅收市话费
快速回复 返回顶部 返回列表