Allow multiple identifiers

This commit is contained in:
Kijin Sung 2019-08-03 21:31:42 +09:00
parent a352033fcb
commit d4794dcb44
6 changed files with 66 additions and 68 deletions

View file

@ -303,8 +303,10 @@ $lang->add_extend_form = 'Add user defined item';
$lang->msg_null_prohibited_id = 'Please enter an ID to prohibit.';
$lang->msg_null_prohibited_nick_name = 'Please enter a nick name to prohibit.';
$lang->msg_null_managed_emailhost = 'Please enter email address providers to manage. (eg.: gmail.com)';
$lang->identifier = 'Login Account';
$lang->about_identifier = 'Please select an account to use when logging in.';
$lang->identifier = 'Login Identifier';
$lang->about_identifier = 'Allow users to login using one or more different identifiers.';
$lang->msg_need_identifier = 'You need to select at least one login identifier.';
$lang->msg_need_enabled_identifier = 'You need to select identifiers that are enabled in the signup form.';
$lang->use_after_save = 'Use after saved';
$lang->cmd_add_group = 'Add group';
$lang->msg_groups_exist = 'groups exist.';

View file

@ -317,9 +317,11 @@ $lang->add_extend_form = '사용자 정의 항목 추가';
$lang->msg_null_prohibited_id = '추가할 금지 아이디를 입력해주세요.';
$lang->msg_null_prohibited_nick_name = '추가할 금지 닉네임을 입력해주세요.';
$lang->msg_null_managed_emailhost = '추가할 금지 이메일 주소 제공자를 입력해주세요. (예: naver.com)';
$lang->identifier = '로그인 계정';
$lang->about_identifier = '로그인에 사용할 계정을 선택해주세요.';
$lang->identifier = '로그인 방법';
$lang->about_identifier = '여러 가지 방법으로 로그인을 허용할 수 있습니다.';
$lang->about_public_item = '본인 외에 다른 회원에게도 노출될 정보인지 선택합니다.';
$lang->msg_need_identifier = '최소 한 가지의 로그인 방법을 선택해야 합니다.';
$lang->msg_need_enabled_identifier = '가입 폼에서 사용하도록 설정된 로그인 방법을 선택해야 합니다.';
$lang->use_after_save = '저장 후 사용';
$lang->cmd_add_group = '그룹 추가';
$lang->msg_groups_exist = '개 그룹이 존재합니다.';

View file

@ -293,6 +293,8 @@ class memberAdminController extends member
public function procMemberAdminInsertSignupConfig()
{
$oMemberModel = getModel('member');
$config = $oMemberModel->getMemberConfig();
$oModuleController = getController('module');
$args = Context::gets(
@ -335,7 +337,6 @@ class memberAdminController extends member
$args->image_name = $args->image_name ? 'Y' : 'N';
$args->image_mark = $args->image_mark ? 'Y' : 'N';
$args->signature = $args->signature != 'Y' ? 'N' : 'Y';
$args->identifier = $all_args->identifier;
// set default
$all_args->is_nick_name_public = 'Y';
@ -356,13 +357,13 @@ class memberAdminController extends member
foreach($list_order as $key)
{
$signupItem = new stdClass();
$signupItem->isIdentifier = ($key == $all_args->identifier);
$signupItem->isIdentifier = ($key == $config->identifier || in_array($key, $config->identifiers));
$signupItem->isDefaultForm = in_array($key, $items);
$signupItem->name = $key;
$signupItem->title = (!in_array($key, $items)) ? $key : $lang->{$key};
$signupItem->mustRequired = in_array($key, $mustRequireds);
$signupItem->imageType = (strpos($key, 'image') !== false);
$signupItem->required = ($all_args->{$key} == 'required') || $signupItem->mustRequired || $signupItem->isIdentifier;
$signupItem->required = ($all_args->{$key} == 'required') || $signupItem->mustRequired;
$signupItem->isUse = in_array($key, $usable_list) || $signupItem->required;
$signupItem->isPublic = ($all_args->{'is_'.$key.'_public'} == 'Y' && $signupItem->isUse) ? 'Y' : 'N';
@ -415,9 +416,12 @@ class memberAdminController extends member
public function procMemberAdminInsertLoginConfig()
{
$oMemberModel = getModel('member');
$config = $oMemberModel->getMemberConfig();
$oModuleController = getController('module');
$args = Context::gets(
'identifiers',
'change_password_date',
'enable_login_fail_report',
'max_error_count',
@ -425,7 +429,34 @@ class memberAdminController extends member
'after_login_url',
'after_logout_url'
);
if(!count($args->identifiers))
{
return new BaseObject(-1, 'msg_need_identifier');
}
$enabled_list = array();
foreach($config->signupForm as $signupItem)
{
if($signupItem->isUse)
{
$enabled_list[] = $signupItem->name;
}
if(in_array($signupItem->name, $args->identifiers))
{
$signupItem->isIdentifier = true;
}
else
{
$signupItem->isIdentifier = false;
}
}
if(!count(array_intersect($args->identifiers, $enabled_list)))
{
return new BaseObject(-1, 'msg_need_enabled_identifier');
}
$args->signupForm = $config->signupForm;
$args->identifier = array_first($args->identifiers);
if(!$args->change_password_date)
{
$args->change_password_date = 0;

View file

@ -217,35 +217,6 @@ jQuery(function($){
jQuery.exec_json('member.procMemberAdminUpdateDeniedNickName', {'nick_name': ids}, on_complete);
});
$('input[name=identifier]').change(function(){
var $checkedTR = $('input[name=identifier]:checked').closest('tr');
var $notCheckedTR = $('input[name=identifier]:not(:checked)').closest('tr');
var name, notName;
if (!$checkedTR.hasClass('sticky')){
name = $checkedTR.find('input[name="list_order[]"]').val();
if (!$checkedTR.find('input[type=hidden][name="usable_list[]"]').length) $('<input type="hidden" name="usable_list[]" value="'+name+'" />').insertBefore($checkedTR);
if (!$checkedTR.find('input[type=hidden][name='+name+']').length) $('<input type="hidden" name="'+name+'" value="required" />').insertBefore($checkedTR);
$checkedTR.find('th').html('<span class="_title" style="padding-left:20px" >'+$checkedTR.find('th ._title').html()+'</span>');
$checkedTR.find('input[type=checkbox][name="usable_list[]"]').attr('checked', 'checked').attr('disabled', 'disabled');
$checkedTR.find('input[type=radio][name='+name+'][value=required]').attr('checked', 'checked').attr('disabled', 'disabled');
$checkedTR.find('input[type=radio][name='+name+'][value=option]').removeAttr('checked').attr('disabled', 'disabled');
$checkedTR.addClass('sticky');
$checkedTR.parent().prepend($checkedTR);
notName = $notCheckedTR.find('input[name="list_order[]"]').val();
if (notName == 'user_id'){
if ($notCheckedTR.find('input[type=hidden][name="usable_list[]"]').length) $notCheckedTR.find('input[type=hidden][name="usable_list[]"]').remove();
if ($notCheckedTR.find('input[type=hidden][name='+name+']').length) $notCheckedTR.find('input[type=hidden][name='+name+']').remove();
$notCheckedTR.find('input[type=checkbox][name="usable_list[]"]').removeAttr('disabled');
$notCheckedTR.find('input[type=radio][name='+notName+']').removeAttr('disabled');
}
$notCheckedTR.find('th').html('<div class="wrap"><button type="button" class="dragBtn">Move to</button><span class="_title" >'+$notCheckedTR.find('th ._title').html()+'</span></div>');
$notCheckedTR.removeClass('sticky');
// add sticky class
}
});
$('#userDefine').submit(function(e) {
var id_list = $(this).find('input[name=join_form_id_list]').val();

View file

@ -4,6 +4,24 @@
<input type="hidden" name="act" value="procMemberAdminInsertLoginConfig" />
<input type="hidden" name="success_return_url" value="{getUrl('', 'module', 'admin', 'act', $act)}" />
<input type="hidden" name="xe_validator_id" value="modules/member/tpl/1" />
<div class="x_control-group">
<p class="x_control-label">{$lang->identifier}</p>
<div class="x_controls">
<label class="x_inline" for="identifiers_user_id">
<input type="checkbox" name="identifiers[]" id="identifiers_user_id" value="user_id" checked="checked"|cond="$config->identifier === 'user_id' || in_array('user_id', $config->identifiers)" />
{$lang->user_id}
</label>
<label class="x_inline" for="identifiers_email_address">
<input type="checkbox" name="identifiers[]" id="identifiers_email_address" value="email_address" checked="checked"|cond="$config->identifier === 'email_address' || in_array('email_address', $config->identifiers)" />
{$lang->email_address}
</label>
<label class="x_inline" for="identifiers_phone_number">
<input type="checkbox" name="identifiers[]" id="identifiers_phone_number" value="phone_number" checked="checked"|cond="$config->identifier === 'phone_number' || in_array('phone_number', $config->identifiers)" />
{$lang->phone_number}
</label>
<p class="x_help-block">{$lang->about_identifier}</p>
</div>
</div>
<div class="x_control-group">
<label class="x_control-label" for="change_password_date">{$lang->change_password_date}</label>
<div class="x_controls">

View file

@ -82,12 +82,6 @@
<thead>
<tr>
<th scope="col" class="nowr" style="text-align:center">{$lang->target}</th>
<th scope="col" class="nowr" style="text-align:center">{$lang->identifier}
[<a href="#helpDefault" data-toggle>?</a>]
<div class="layer x_alert x_alert-info" id="helpDefault">
<p>{$lang->about_identifier}</p>
</div>
</th>
<th scope="col" class="nowr" style="text-align:center">{$lang->use}</th>
<th scope="col" class="nowr" style="text-align:center">{$lang->public}
[<a href="#helpPublic" data-toggle>?</a>]
@ -105,37 +99,18 @@
{@ $fixed_public_list = array('nick_name', 'password', 'email_address', 'phone_number')}
<!--@foreach($config->signupForm as $item)-->
<!--@if(in_array($item->name, $disabled_list))-->
<!--@elseif($item->isIdentifier)-->
<tr class="sticky">
<input type="hidden" name="list_order[]" value="{$item->name}" />
<input type="hidden" name="usable_list[]" value="{$item->name}"/>
<input type="hidden" name="{$item->name}" value="requierd"/>
<th scope="row">
<span class="_title" style="display:inline-block;white-space:pre-line;overflow:inherit;width:120px;text-overflow:ellipsis;padding-left:20px">{$item->title}</span>
</th>
<td style="text-align:center"><input type="radio" name="identifier" value="{$item->name}" checked="checked" /></td>
<td style="text-align:center"><input type="checkbox" name="usable_list[]" value="{$item->name}" title="{$lang->use}" checked="checked" disabled="disabled" /></td>
<td style="text-align:center"><input type="checkbox" name="is_{$item->name}_public" value="Y" checked="checked"|cond="$item->isPublic == 'Y'" disabled="disabled"|cond="in_array($item->name, $fixed_public_list) || !$item->isUse" /></td>
<td class="nowr">
<label for="{$item->name}_re" class="x_inline"><input type="radio" id="{$item->name}_re" name="{$item->name}" value="requierd" checked="checked" disabled="disabled" /> {$lang->cmd_required}</label>
<label for="{$item->name}_op" class="x_inline"><input type="radio" id="{$item->name}_op" name="{$item->name}" value="option" disabled="disabled" /> {$lang->cmd_optional}</label>
</td>
<td class="desc">&nbsp;</td>
<td style="text-align:center">&nbsp;</td>
</tr>
<!--@elseif($item->isDefaultForm)-->
<tr class="_imageType"|cond="$item->imageType">
<tr class="sticky"|cond="$item->isIdentifier" class="_imageType"|cond="$item->imageType">
<input type="hidden" name="list_order[]" value="{$item->name}" />
<input type="hidden" name="usable_list[]" value="{$item->name}" cond="$item->mustRequired"/>
<input type="hidden" name="{$item->name}" value="requierd" cond="$item->mustRequired"/>
<input type="hidden" name="usable_list[]" value="{$item->name}" cond="$item->isIdentifier || $item->mustRequired"/>
<input type="hidden" name="{$item->name}" value="required" cond="$item->isIdentifier || $item->mustRequired"/>
<th scope="row">
<div class="wrap">
<button type="button" class="dragBtn">Move to</button>
<button type="button" class="dragBtn" cond="!$item->isIdentifier">Move to</button>
<span class="_title" style="display:inline-block;white-space:pre-line;overflow:inherit;width:120px;text-overflow:ellipsis" title="{$item->title}">{$item->title}</span>
</div>
</th>
<td style="text-align:center"><input type="radio" name="identifier" value="{$item->name}" cond="$item->name== 'email_address' || $item->name=='user_id'" /></td>
<td style="text-align:center"><input type="checkbox" name="usable_list[]" value="{$item->name}" title="{$lang->use}" checked="checked"|cond="$item->mustRequired || $item->isUse" disabled="disabled"|cond="$item->mustRequired" /></td>
<td style="text-align:center"><input type="checkbox" name="usable_list[]" value="{$item->name}" title="{$lang->use}" checked="checked"|cond="$item->isIdentifier || $item->mustRequired || $item->isUse" disabled="disabled"|cond="$item->isIdentifier || $item->mustRequired" /></td>
<td style="text-align:center"><input type="checkbox" name="is_{$item->name}_public" value="Y" checked="checked"|cond="$item->isPublic == 'Y'" disabled="disabled"|cond="in_array($item->name, $fixed_public_list) || !$item->isUse" data-donotchange="Y"|cond="in_array($item->name, $fixed_public_list)" /></td>
<td class="nowr">
<label for="{$item->name}_re" class="x_inline"><input type="radio" id="{$item->name}_re" name="{$item->name}" value="required" checked="checked"|cond="$item->mustRequired || $item->required" disabled="disabled"|cond="$item->mustRequired || !$item->isUse" /> {$lang->cmd_required}</label>
@ -221,7 +196,6 @@
<span class="_title" style="display:inline-block;white-space:pre-line;overflow:inherit;width:120px;text-overflow:ellipsis" title="{$item->title}">{$item->title}</span>
</div>
</th>
<td></td>
<td style="text-align:center"><input type="checkbox" name="usable_list[]" value="{$item->name}" title="{$lang->use}" checked="checked"|cond="$item->isUse" /></td>
<td style="text-align:center"><input type="checkbox" name="is_{$item->name}_public" value="Y" checked="checked"|cond="$item->isPublic == 'Y'" disabled="disabled"|cond="!$item->isUse" /></td>
<td class="nowr">