星辰投稿 发表于 2013-10-22 17:07:59

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

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

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

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

3、打开source\module\forum\forum_ajax.php,改完后提交至服务器
在跟if($_GET['action'] == 'checkusername')平级的if/else分支中,加入:
elseif ($_GET['action'] == 'checknickname') {
$nickname = trim($_GET['nickname']);
$nicknamelen = dstrlen($nickname);
if($nicknamelen < 3) {
showmessage('profile_nickname_tooshort', '', array(), array('handle' => false));
} elseif($nicknamelen > 15) {
showmessage('profile_nickname_toolong', '', array(), array('handle' => false));
}
if(C::t('common_member_profile')->count_by_field('field1', $nickname) == 0) {
//showmessage('<img src="'.$_G['style']['imgdir'].'/check_right.gif" width="13" height="13">', '', array(), array('msgtype' => 3));
} else {
showmessage('register_check_found', '', array(), array('handle' => false));
}
}
4、打开static\js\register.js,改完后提交至服务器
加入一个函数:
function checknickname(id) {
errormessage(id);
var username = trim($(id).value);
if($('tip_' + id).parentNode.className.match(/ p_right/) && (username == '' || username == lastusername)) {
return;
} else {
lastusername = username;
}
if(username.match(/<|"/ig)) {
errormessage(id, '昵称包含敏感字符');
return;
}
var unlen = username.replace(/[^\x00-\xff]/g, "**").length;
if(unlen < 3 || unlen > 15) {
errormessage(id, unlen < 3 ? '昵称不得小于 3 个字符' : '昵称不得超过 15 个字符');
return;
}
var x = new Ajax();
$('tip_' + id).parentNode.className = $('tip_' + id).parentNode.className.replace(/ p_right/, '');
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) {
errormessage(id, s);
});
}
在addFormEvent这个函数里,找到
formNode].onblur = function () {
checkusername(formNode].id);
};
在后面加入:
formNode.onblur = function () {
checknickname(formNode.id);
};
第二个问题:帖子列表页显示昵称
1、打开source\module\forum\forum_forumdisplay.php
查找foreach($threadlist as $thread) {

在下一行加入
<span style="font-family: Tahoma, Helvetica, SimSun, sans-serif; ">$thread['author_profile'] = C::t('common_member_profile')->fetch($thread['authorid']);</span>
<span style="font-family: Tahoma, Helvetica, SimSun, sans-serif; ">$lastpostuser = C::t('common_member')->fetch_by_username($thread['lastposter']);</span>
<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为实际模板的路径
查找$thread
替换成 $thread['field1']

查找$thread
替换成 $thread['field1']到这里,注册的时候输入昵称后可以提示昵称是否被占用了。
但是会有个问题,如果还继续点提交注册的话,还是可以注册成功的。。。。。
页: [1]
查看完整版本: DISCUZ 昵称[注册、显示、唯一性]解决方案