Chức năng
- Đăng ký thành viên nhanh.
- Tự đăng nhập sau khi đăng ký.
- Quay trở lại trang đang xem.
- Không cần kích hoạt tài khoản.
- Giới hạn số lần đăng ký theo IP.
- Áp dụng cho tất cả liên kết đăng ký.
- Giao diện gọn, đẹp.
- Hỗ trợ ngôn ngữ Anh - Việt.
Demo
Hướng dẫn
Bước 1
Tùy chỉnh
ACP >> General >> Forum >> Security >> Security Administration
Giới hạn số tài khoản có thể tạo trong 24h cho một IP:
IP address accounts creation limit, for each 24 hours : 10
ACP >> Users & Groups >> Users >> Users options
Cho phép tự kích hoạt tài khoản:
New accounts activation : No activation
Bỏ yêu cầu nhập mã captcha:
Confirmation code : No
Cho phép đăng ký thành viên:
Allow new members : Yes
ACP >> Users & Groups >> Users >> Profiles >> Profile fields >> Modify
Bỏ hết các field bắt buộc khi đăng ký:
Necessarily filled ? No
Bước 3
Sửa Template
ACP >> Display >> Templates >> General >> overall_footer_begin
Tìm:
- Code:
<div id="pun-foot">
Đặt trước nó:
- Code:
<!-- Quick register by Zzbaivong - devs.forumvi.com -->
<!-- BEGIN switch_user_logged_out -->
<div id="qick_reg_overlay" style="z-index:99999;"></div>
<div id="qick_reg" style="z-index:999999;">
<div id="reg_loder">Đang kiểm tra dữ liệu...</div>
<p id="reg_tip">Bạn phải điền đầy đủ thông tin đăng ký.</p>
<a href="javascript:void(0)" class="modal_close"></a>
<form onsubmit="submit_reg(); return false" action="/register?agreed=true&step=2" method="post" name="post" id="ucp">
<div class="main-content frm" style="border: 0px none;">
<fieldset class="frm-set multi" style="border: 0px none; margin:0;background-color: #FFF;">
<dl>
<dt>
<label>Tên tài khoản :</label>
</dt>
<dd>
<input autocomplete="off" type="text" id="username_reg" name="username" value="" size="25" maxlength="25" required />
<div id="name_reg" class="check_reg">
<div class="pwd_img reg_er kytu">Số ký tự phải từ 3 trở lên</div>
<div class="pwd_img reg_er loi">Hãy chọn tài khoản khác</div>
<div class="pwd_img reg_ok">Có thể dùng tài khoản này</div>
</div>
</dd>
</dl>
<dl>
<dt>
<label>Địa chỉ E-mail :</label>
</dt>
<dd>
<input autocomplete="off" class="ltr" type="email" id="email" name="email" value="" size="25" maxlength="64" required />
<div id="email_reg" class="check_reg">
<div class="pwd_img reg_er">Không sử dụng địa chỉ này</div>
<div class="pwd_img reg_wa">E-mail sẽ được kiểm sau</div>
</div>
</dd>
</dl>
<dl>
<dt>
<label>Mật khẩu :</label>
</dt>
<dd>
<input autocomplete="off" class="ltr" type="password" id="password_reg" name="password" value="" size="25" maxlength="25" required />
<div class="check_reg" id="cont_pwd">
<div class="pwd_img reg_er kytu">Số ký tự phải từ 3 trở lên</div>
<div class="pwd_img reg_er trung">Trùng tên đăng nhập</div>
<div class="pwd_img" id="pwd_bad" style="display: none;">Quá đơn giản</div>
<div class="pwd_img" id="pwd_middle" style="display: none;">Tạm ổn</div>
<div class="pwd_img" id="pwd_good" style="display: none;">Vãi</div>
</div>
</dd>
</dl>
<dl>
<dt>
<label>Gõ lại mật khẩu :</label>
</dt>
<dd>
<input autocomplete="off" type="password" id="password_confirm" size="25" maxlength="25" name="password_confirm" class="inputbox narrow" required />
<div id="pass_co" class="check_reg">
<div class="pwd_img reg_er">Chưa đúng</div>
<div class="pwd_img reg_ok">Chính xác</div>
</div>
</dd>
</dl>
<dl class="frm-buttons">
<p style="padding: 10px 0px 0px; text-align: center;">
<input class="button2" type="submit" name="submit" value="Đăng ký" />
<input class="button2" type="reset" name="reset" value="Làm mới" />
</p>
</dl>
</fieldset>
</div>
</form>
</div>
<script type="text/javascript" src="{Js}"></script>
<!-- END switch_user_logged_out -->
Bước 4
ACP >> Modules >> HTML & JAVASCRIPT >> Javascript codes management
Tạo file javascript, lấy liên kết (Không check Placement) thay vào vị trí {Js} ở cuối code trong bước 3
- Code:
/* Quick register by Zzbaivong - devs.forumvi.com */
var shortPass = "bad",
badPass = "bad",
goodPass = "good",
strongPass = "strong";
function passwordStrength(a, b) {
score = 0;
if ("" == a) return null;
if (4 > a.length) return shortPass;
if (void 0 != b && a.toLowerCase() == b.toLowerCase()) return badPass;
score += 4 * a.length;
score += 1 * (checkRepetition(1, a).length - a.length);
score += 1 * (checkRepetition(2, a).length - a.length);
score += 1 * (checkRepetition(3, a).length - a.length);
score += 1 * (checkRepetition(4, a).length - a.length);
a.match(/(.*[0-9].*[0-9].*[0-9])/) && (score += 5);
a.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/) && (score += 5);
a.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/) &&
(score += 10);
a.match(/([a-zA-Z])/) && a.match(/([0-9])/) && (score += 15);
a.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && a.match(/([0-9])/) && (score += 15);
a.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && a.match(/([a-zA-Z])/) && (score += 15);
if (a.match(/^\w+$/) || a.match(/^\d+$/)) score -= 10;
0 > score && (score = 0);
100 < score && (score = 100);
return 34 > score ? badPass : 68 > score ? goodPass : strongPass
}
function checkRepetition(a, b) {
res = "";
for (i = 0; i < b.length; i++) {
repeated = !0;
for (j = 0; j < a && j + i + a < b.length; j++) repeated = repeated && b.charAt(j + i) == b.charAt(j + i + a);
j < a && (repeated = !1);
repeated ? (i += a - 1, repeated = !1) : res += b.charAt(i)
}
return res
}
function submit_reg() {
$("#reg_tip").text("Đang kiểm tra dữ liệu...");
$("#qick_reg .reg_er").each(function() {
"block" == $(this).css("display") && $(this).parent().parent().addClass("error")
});
$("#qick_reg input").each(function() {
"" == $(this).val() && $(this).parent().addClass("error")
});
$("#qick_reg .error").length ? $("#reg_tip").text("Lỗi thông tin đăng ký.") : ($("#reg_loder").show(), $.ajax({
type: "POST",
url: "/register?agreed=true&step=2",
data: {
username: $("#qick_reg #username_reg").val(),
email: $("#qick_reg #email").val(),
"profile_field_3_-10": $("#qick_reg #profile_field_3_-10").val(),
password: $("#qick_reg #password_reg").val(),
submit: "Save"
},
success: function(a) {
if ($(a).find("p.message").length) $("#reg_tip").text("Quản trị viên đã giới hạn số lần tạo tài khoản hôm nay."), $("#reg_loder").fadeOut(500), $("#qick_reg #ucp").hide();
else if ($("#reg_tip").text("Đang kiểm tra tài khoản, mật khẩu..."),
$(a).find("#form_confirm").length) $("#qick_reg .frm-buttons input[name='confirm_pass'], #qick_reg .frm-buttons input[name='auth[]']").remove(), $(a).find("input[name='confirm_pass'], input[name='auth[]']").prependTo("#qick_reg .frm-buttons"), $("#reg_tip").text("Đang kiểm tra E-mail..."), $.ajax({
type: "POST",
url: "/register?agreed=true&step=2",
data: {
password_confirm: $("#qick_reg #password_confirm").val(),
"auth[]": $("#qick_reg input[name='auth[]']:first").val(),
username: $("#qick_reg #username_reg").val(),
email: $("#qick_reg #email").val(),
"profile_field_3_-10": $("#qick_reg #profile_field_3_-10").val(),
password: $("#qick_reg #password_reg").val(),
confirm_pass: $("#qick_reg input[name='confirm_pass']").val(),
submit: "Save"
},
success: function(a) {
if ($(a).find("p.message a").length) $("#reg_tip").text("Đăng ký thành công."), $.ajax({
type: "POST",
url: "/login",
data: {
username: $("#qick_reg #username_reg").val(),
password: $("#qick_reg #password_reg").val(),
login: "true"
},
success: function() {
window.location.reload()
}
});
else if (-1 != $(a).find("p.center:first span").text().indexOf("e-mail address") || -1 != $(a).find("p.center:first span").text().indexOf("địa chỉ email")) $("#reg_tip").text("Địa chỉ E-mail không hợp lệ hoặc đã được sử dụng."), $("#reg_loder").fadeOut(500), $("#qick_reg #email").parent().addClass("error"), $("#email_reg .reg_er").show().next().hide()
}
});
else if (-1 != $(a).find("#main-content p.center:first span").text().indexOf("username has") ||
-1 != $(a).find("p.center:first span").text().indexOf("ên truy cập")) $("#reg_tip").text("Tài khoản đã được sử dụng hoặc bị cấm."), $("#reg_loder").fadeOut(500), $("#qick_reg #username_reg").parent().addClass("error"), $("#name_reg div").hide(), $("#name_reg .reg_er.loi").show();
else if (0 == $(a).find("p.center:first span").text().indexOf("Your password") || 0 == $(a).find("p.center:first span").text().indexOf("Mật khẩu")) $("#reg_tip").text("Mật khẩu phải từ 6 - 32 ký tự và không được trùng tài khoản."),
$("#reg_loder").fadeOut(500), $("#qick_reg #password_reg, #qick_reg #password_confirm").val("").parent().addClass("error"), $("#qick_reg #cont_pwd div, #qick_reg #pass_co div").hide()
}
}))
}
function conpass() {
"" != $("#qick_reg #password_confirm").val() ? ($("#qick_reg #password_confirm").parent().removeClass("error"), $("#password_reg").val() != $("#qick_reg #password_confirm").val() ? $("#pass_co .reg_er").show().next().hide() : $("#pass_co .reg_er").hide().next().show()) : $("#pass_co div").hide()
}
function isEmail(a) {
return /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/.test(a)
}
$(function() {
"/register" != location.pathname ? ($("a[href='/register']").click(function(a) {
a.preventDefault();
$("#qick_reg_overlay, #qick_reg").fadeIn()
}), $("#qick_reg_overlay, .modal_close").click(function() {
$("#qick_reg_overlay, #qick_reg").fadeOut()
}), $("#qick_reg input[name='reset']").click(function() {
$("#reg_tip").text("Bạn phải điền đầy đủ thông tin đăng ký.");
$("#qick_reg dd").removeClass("error");
$("#qick_reg .pwd_img").hide()
}), $("#qick_reg #username_reg").on("blur",
function() {
"" != $("#qick_reg #username_reg").val() ? ($("#qick_reg #username_reg").parent().removeClass("error"), 3 > $("#qick_reg #username_reg").val().length ? ($("#name_reg .reg_er.kytu").show(), $("#name_reg .reg_er.loi, #name_reg .reg_ok").hide()) : $.ajax({
type: "GET",
url: "/search?mode=searchuser&fieldname=username",
data: {
search_username: $("#qick_reg #username_reg").val(),
time: timestamp()
},
success: function(a) {
$("#name_reg div").hide();
$(a).find("#username_list").val() == $("#qick_reg #username_reg").val() ?
$("#name_reg .reg_er.loi").show() : $("#name_reg .reg_ok").show()
}
})) : $("#name_reg div").hide()
}), $("#qick_reg #email").on("blur", function() {
"" != $("#qick_reg #email").val() ? ($("#qick_reg #email").parent().removeClass("error"), isEmail($("#qick_reg #email").val()) ? $("#email_reg .reg_er").hide().next().show() : $("#email_reg .reg_er").show().next().hide()) : $("#email_reg div").hide()
}), $("#qick_reg #password_confirm").on("input", function() {
conpass()
}), $("#qick_reg #password_reg, #qick_reg #username_reg").on("input",
function() {
if ("" != $("#qick_reg #password_reg").val())
if ($("#qick_reg #password_reg").parent().removeClass("error"), 3 > $("#qick_reg #password_reg").val().length) $("#cont_pwd div").hide(), $("#cont_pwd .reg_er.kytu").show();
else if ($("#cont_pwd .reg_er.kytu").hide(), $("#qick_reg #password_reg").val() == $("#qick_reg #username_reg").val()) $("#cont_pwd div").hide(), $("#cont_pwd .reg_er.trung").show();
else switch ($("#cont_pwd .reg_er.trung").hide(), passwordStrength($("#qick_reg #password_reg").val(), $("#qick_reg #username_reg").val())) {
case "bad":
$("#pwd_middle,#pwd_good").hide();
$("#pwd_bad").show();
break;
case "good":
$("#pwd_good,#pwd_bad").hide();
$("#pwd_middle").show();
break;
case "strong":
$("#pwd_middle,#pwd_bad").hide(), $("#pwd_good").show()
} else $("#cont_pwd div, #pass_co div").hide(), $("#qick_reg #password_confirm").val("");
"" != $("#qick_reg #password_confirm").val() && conpass()
})) : $("#qick_reg_overlay, #qick_reg").remove()
});
Bước 5
Thêm vào CSS
ACP >> Display >> Pictures and Colors >> Colors >> CSS Stylesheet
- Code:
/* Quick register by Zzbaivong - devs.forumvi.com */
#qick_reg_overlay{background:#000;position:fixed;left:0;top:0;width:100%;height:100%;display:none;opacity:0.8}
#qick_reg, #qick_reg *{box-sizing:border-box;-o-box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box}
#qick_reg{background-color:#FFF;border:1px solid rgba(0,0,0,0.333);box-shadow:0 4px 16px rgba(0,0,0,0.2);color:#000;outline:0 none;position:fixed;width:500px;display:none;left:50%;top:50%;margin-left:-250px;margin-top:-200px;padding:40px}
#qick_reg input{width:100%}
#qick_reg fieldset.frm-set dl dd,#qick_reg fieldset.frm-set dl dt{padding:0}
#qick_reg fieldset.frm-set dl dt{width:13em}
#qick_reg fieldset.frm-set dl dd{margin-left:14em}
#qick_reg #cont_pwd, #qick_reg .check_reg{float:none;height:24px;width: 100%;padding:2px 0!important}
#pwd_bad, .reg_er{background: url(http://i15.servimg.com/u/f15/16/58/89/73/001_3010.png) no-repeat scroll left center/16px 16px transparent;color:red}
#pwd_middle, .reg_wa{background:url(http://i15.servimg.com/u/f15/16/58/89/73/alert_10.png) no-repeat scroll left center/16px 16px transparent;color:blue}
#pwd_good, .reg_ok{background:url(http://i15.servimg.com/u/f15/16/58/89/73/001_0610.png) no-repeat scroll left center/16px 16px transparent;color:green}
#qick_reg .pwd_img{float:left;height:24px;line-height:24px;text-align:left;width: 100%;padding: 0 0 0 20px;}
#reg_tip{background-color:#FCF8E3;color:#C09853;border-color:#FBEED5;border:1px solid;padding:5px 7px}
#qick_reg form{margin-top:20px}
#reg_loder{background:url(http://i15.servimg.com/u/f15/16/58/89/73/ajax-l11.gif) no-repeat scroll center 130px rgba(255, 255, 255, 0.65);color:#086CC5;display:none;font-family:Comic Sans MS;font-weight:700;height:100%;left:0;line-height:350px;position:absolute;text-align:center;top:0;width:100%}
.modal_close{background:url(http://i40.servimg.com/u/f40/17/70/81/78/close-10.png) repeat scroll 0 0 transparent;content:"";height:11px;position:absolute;right:17px;top:17px;width:11px}
.error input{border:1px solid #F5A7A7;background-color:#F2DEDE}
#qick_reg .button2{background:#055fff;border:1px solid #DDD;color:#FFF;padding:7px 15px}
#qick_reg .button2:hover{background:#666;cursor:pointer}
#qick_reg .button2[name="reset"]{background:url(http://i15.servimg.com/u/f15/16/58/89/73/reload10.png) no-repeat center scroll green;text-indent:-9999px}
Ghi chú
Áp dụng cho phiên bản PunBB.
Cập nhật ngày 19/04/2015
Zzbaivong